操作して学ぶ

OAuth 2.0 フロー可視化

「OAuthは結局どこで何が起きているのか」を、認可コードフロー(+PKCE)として 1ステップずつ追えます。ユーザー・クライアント・認可サーバー・API の4者の間を、ブラウザ経由(フロントチャネル)サーバー間の直接通信(バックチャネル)に分けて可視化します。 「▶ 次へ」または「自動再生」で進めてください。

ユーザーブラウザクライアントアプリ認可サーバーIdPリソースサーバーAPI準備:PKCE と state を生成2. ログイン開始3. 認可リクエスト(ブラウザをリダイレクト)4. ログイン・同意画面を表示5. 認証して「許可」6. 認可コードを返す(redirect_uri へ)7. トークン交換(サーバー間で直接POST)8. アクセストークンを発行9. API を呼ぶ(Bearer トークン添付)10. 保護されたデータを返す11. ログイン完了・画面を表示
ブラウザ経由(フロント)直接通信(バック)内部処理
1 / 11
クライアント内部クライアント(内部)

1. 準備:PKCE と state を生成

code_verifier(乱数)code_challenge = SHA256(code_verifier)state(乱数)

クライアントはまず2つの乱数を作る。code_verifier は手元に秘匿し、そのSHA256ハッシュ code_challenge だけを後で送る。state はこのログイン試行に紐づく識別子。

要点PKCE は認可コードの横取り対策、state は CSRF 対策。どちらもこの後の攻撃を防ぐ布石。

なぜこんな回り道をするのか

「最初からアクセストークンをくれればいいのに」と感じる遠回りには、すべて理由があります。 鍵はブラウザを通る通信(フロントチャネル)は漏れやすいという前提です。 URL は履歴・リファラ・ログに残り、盗聴もされうる。だから設計はこう組まれています。

  • 認可コードを挟む理由:ブラウザには使い捨ての一時コードだけを流し、本物のトークンはブラウザを通らないバックチャネルで受け取る。トークンが URL や履歴に残らない。
  • PKCE が守るもの:万一その認可コードを盗まれても、code_verifier を知らない攻撃者はトークンに交換できない。秘密を隠し持てない SPA・モバイルアプリで必須とされる。
  • state が守るもの:攻撃者が用意した認可コードを掴まされる CSRF を防ぐ。送った state と戻ってきた state の一致確認がその要。
  • Implicitフローが非推奨になった理由:かつてはトークンをフロントチャネルに直接返す方式もあったが、露出リスクが高く、現在は認可コード + PKCE に一本化する流れ。