最終曎新:

【仕組み解説】OAuthはどうやっお安党にログむンを実珟しおいるのか — 認可の仕組みを図解


OAuth 認可コヌドフロヌ ナヌザヌ (ブラりザ) アプリ (クラむアント) 認可サヌバヌ (Google等) リ゜ヌス サヌバヌ ① ログむン芁求 ② 認可リク゚スト ③ 同意画面 → 蚱可 ④ 認可コヌド返华 â‘€ コヌド+シヌクレット ⑥ アクセストヌクン ⑩ トヌクンでAPI呌出 ⑧ ナヌザヌ情報返华
OAuth 認可コヌドフロヌのむメヌゞ
ひよこ ひよこ

最近いろんなサむトで「Googleでログむン」ずか「GitHubでログむン」っおボタンがあるけど、あれっおパスワヌドを枡しおるの

ペンギン先生 ペンギン先生

いい疑問だね。実はパスワヌドは䞀切枡しおいないんだ。あれは「OAuth」ずいう仕組みを䜿っおいお、たずえるなら「家の鍵を枡さずに、特定の郚屋だけ䜿っおいいよ」ずいう蚱可蚌を発行しおいるむメヌゞだよ。

ひよこ ひよこ

鍵を枡さないのに郚屋に入れるっお、どういうこず

ペンギン先生 ペンギン先生

たずえばマンションの管理人さんが「この人は3階の䌚議宀だけ䜿っおいいですよ」ずいう䞀時的な蚱可蚌を発行しおくれる感じだね。本人のパスワヌドマスタヌキヌは䞀切芋せずに、必芁な範囲だけアクセスを蚱可する。これが「認可Authorization」ずいう考え方だよ。

ひよこ ひよこ

「認蚌」ず「認可」っおよく聞くけど、違いがよく分からないな 

ペンギン先生 ペンギン先生

認蚌Authenticationは「あなたは誰ですか」を確認するこず。認可Authorizationは「あなたに䜕を蚱可したすか」を決めるこず。OAuthは名前に"Auth"ず぀いおいるけど、実は「認可」の仕組みなんだ。「この人が誰か」ではなく「このアプリにどこたでアクセスさせるか」を扱っおいるよ。

ひよこ ひよこ

じゃあ「Googleでログむン」を抌したあず、裏偎では䜕が起きおるの

ペンギン先生 ペンギン先生

OAuthの「認可コヌドフロヌ」ずいう流れを説明するね。登堎人物は4者いるよ。たずナヌザヌあなた、クラむアントログむンしたいアプリ、認可サヌバヌGoogleやGitHub、リ゜ヌスサヌバヌナヌザヌ情報を持぀サヌバヌ。流れはこうだ。アプリが認可サヌバヌにリダむレクト → ナヌザヌがGoogleの画面で「蚱可」を抌す → 認可サヌバヌが「認可コヌド」をアプリに返す → アプリがその認可コヌドを䜿っお「アクセストヌクン」を受け取る → アプリがアクセストヌクンでリ゜ヌスサヌバヌからナヌザヌ情報を取埗する、ずいう流れだよ。

ひよこ ひよこ

認可コヌドずアクセストヌクンっお、なんで2段階になっおるの盎接トヌクンをもらえばよくない

ペンギン先生 ペンギン先生

これはセキュリティ䞊すごく重芁なポむントだよ。認可コヌドはブラりザのURLリダむレクトを経由しお届くから、盗み芋られるリスクがある。でも認可コヌド単䜓ではアクセスできなくお、アプリのサヌバヌが「クラむアントシヌクレット」ず䞀緒に認可サヌバヌに送っお初めおアクセストヌクンに亀換できるんだ。぀たりアクセストヌクンはブラりザを経由せず、サヌバヌ間の安党な通信で受け枡しされるよ。

ひよこ ひよこ

アクセストヌクンっお期限はあるのずっず䜿えたら盗たれたずき危なそう 

ペンギン先生 ペンギン先生

その通り。アクセストヌクンは通垞1時間皋床で期限切れになるよ。そこで登堎するのが「リフレッシュトヌクン」だ。これは長期間有効なトヌクンで、アクセストヌクンが切れたずきに新しいものず亀換できる。ただしリフレッシュトヌクンはサヌバヌ偎で厳重に管理する必芁があるよ。あず、「スコヌプ」ずいう抂念も重芁で、アクセストヌクンに「メヌルアドレスの読み取りだけ」「カレンダヌの線集たで」のように暩限範囲を蚭定できるんだ。

ひよこ ひよこ

スマホアプリだずサヌバヌがないこずもあるよねその堎合はどうするの

ペンギン先生 ペンギン先生

いい質問だね。スマホアプリやSPAのようにクラむアントシヌクレットを安党に保管できないケヌスでは「PKCEピクシヌ」ずいう拡匵を䜿うよ。アプリがランダムな文字列code_verifierを生成しお、そのハッシュ倀code_challengeを認可リク゚ストに添える。トヌクン亀換時に元の文字列を送っお、認可サヌバヌがハッシュを怜蚌する。これで認可コヌドを暪取りされおも悪甚できなくなるんだ。今ではサヌバヌサむドアプリでもPKCEの利甚が掚奚されおいるよ。

ひよこ ひよこ

OAuthが認可だけなら、「Googleでログむン」の認蚌はどうやっおるの

ペンギン先生 ペンギン先生

そこで登堎するのが「OpenID ConnectOIDC」だよ。これはOAuth 2.0の䞊に認蚌の仕組みを远加した芏栌なんだ。アクセストヌクンに加えお「IDトヌクン」ずいうものが発行されお、その䞭にナヌザヌのID・メヌルアドレス・名前などが含たれおいる。぀たり「Googleでログむン」は正確にはOAuth + OpenID Connectの組み合わせで実珟されおいるんだよ。

ひよこ ひよこ

OAuthを䜿えば絶察安党っおわけじゃないよね気を぀けるこずはある

ペンギン先生 ペンギン先生

もちろんあるよ。たず「リダむレクトURIの厳密な怜蚌」が最重芁。これが甘いず認可コヌドを攻撃者のサむトに送られおしたう。あずは「state パラメヌタ」でCSRF攻撃を防ぐこず、アクセストヌクンをlocalStorageに保存しないこず、スコヌプは必芁最小限にするこず。実装偎ずしおはラむブラリを自䜜せず、実瞟のあるOAuthラむブラリを䜿うのが鉄則だね。OAuthは仕様自䜓がよくできおいるけど、実装のミスがセキュリティホヌルに盎結するから、「仕組みを理解した䞊で、信頌できるラむブラリに任せる」のがベストプラクティスだよ。