OAuth 2.0 の認可コードフローと PKCE を説明できますか

認可コードを受け取ってから、トークンの窓口でアクセストークンに換える流れと、コードの横取りを防ぐ PKCE の仕組みを答える問い。インプリシットフローが勧められない理由まで話します。

答えてみる

面接官に「OAuth 2.0 の認可コードフローと PKCE を説明できますか」と聞かれたつもりで、答えを見る前に自分の言葉で答えます。

声に出して答えた人は「書かずに答えを見る」で開けます。

解説を読む

聞かれ方から関連するコースまで、この問いの解説を全部ここに置いています。

こう聞かれます

  • 「OAuth 2.0 の認可コードフローを説明してください」
  • 「PKCE は何を防ぐための仕組みですか」
  • 「スマホアプリや SPA では、なぜ PKCE が要るのですか」

面接官が見ている点

  • 認可コードとアクセストークンを分けて受け取る理由を言えるか
  • PKCE が「コードの横取り」を防ぐ仕組みだと、手順で説明できるか
  • 秘密の値を隠せるアプリと、隠せないアプリの違いを分かっているか

短い答え

  • 認可コードフローは、利用者が許可したあとに短い「認可コード」を受け取り、それをトークンの窓口でアクセストークンに換える流れです。
  • PKCE は、アプリが毎回作る使い捨ての合言葉で、途中で認可コードを盗まれても、合言葉を知らない相手はトークンに換えられないようにします。
  • スマホアプリや SPA のように秘密の値を隠せないアプリでは、PKCE を必ず使います。サーバー側のアプリにも勧められています。

少し詳しい答え

認可コードフローの流れ

OAuth 2.0 は、利用者のパスワードを渡さずに、別のサービスへ「この範囲だけ使ってよい」と許可を渡すための決まりです。認可コードフローは次の順に進みます。

  1. アプリが利用者を、認可サーバー (許可を出す側) の画面へ送ります
  2. 利用者がログインして許可すると、アプリの戻り先に認可コードが付いて返ります
  3. アプリは認可コードをトークンの窓口へ送り、アクセストークンを受け取ります
  4. アプリはアクセストークンを付けて API を呼びます

認可コードはブラウザのアドレスを通るので、人目に触れやすい値です。そこで、コードそのものでは API を呼べないようにし、トークンへの交換を別の手順に分けています。

PKCE の仕組み

PKCE (ピクシー) は、アプリが毎回ランダムな code_verifier を作り、そのハッシュ (S256) を code_challenge として最初の要求に付けます。交換のときに元の code_verifier を送り、認可サーバーはハッシュを取り直して、最初に要求したのと同じ相手かを確かめます。

1. 認可の要求 (GET /authorize)
   response_type=code
   client_id=app1
   code_challenge=<code_verifier のハッシュ>
   code_challenge_method=S256

2. トークンの交換 (POST /token)
   grant_type=authorization_code
   code=<受け取った認可コード>
   code_verifier=<最初に作った元の値>

途中で認可コードを横取りされても、code_verifier は送り手の手元にしかないので、盗んだ側はトークンに換えられません。

OAuth のセキュリティの指針 (RFC 9700) は、スマホアプリや SPA のような公開クライアントは PKCE を使わなければならず、サーバー側で秘密の値を持てる機密クライアントにも勧める、としています。

インプリシットフローとの違い

昔は SPA 向けに、認可コードを挟まずにアクセストークンを直接アドレスに付けて返すインプリシットフローがありました。トークンが履歴やログに残りやすいため、今は使わないよう勧められています。SPA でも、認可コードフローと PKCE を使います。

トレードオフ

自分で OAuth の流れを組むと、戻り先の URL の確かめ方、state による CSRF の手当て、トークンの置き場所など、間違えやすい所が多くあります。多くの場合は、決まった手順を実装済みのライブラリや認証の基盤に任せ、自分では流れを理解して設定を確かめる側に回るほうが安全です。逆に、細かい要件があって基盤で足りないときだけ、自分で組む部分を増やします。

よくある間違い

  • OAuth をログインの仕組みそのものだと言う OAuth は「許可を渡す」決まりです。ログインした人が誰かを確かめる部分は、その上に OpenID Connect などを重ねます
  • PKCE をスマホアプリだけの物と言う SPA にも要りますし、サーバー側のアプリにも勧められています
  • SPA ではインプリシットフローを使うと言う今は勧められていません。認可コードフローと PKCE を使います

深掘りの問い

  • 「state は何のために付けますか」戻ってきた応答が、自分が出した要求への返事かを確かめ、CSRF (利用者に意図しない要求を送らせる攻撃) を防ぐためと答えます
  • 「アクセストークンはどこに置きますか」 ブラウザの JavaScript から読める場所に長く置くと、XSS で盗まれやすいことに触れ、寿命を短くする、サーバー側で持つ、などの手を挙げます
  • 「リフレッシュトークンとは何ですか」短命のアクセストークンを取り直すための長めのトークンで、漏れたときの害が大きいので扱いを厳しくする、と答えます

確認日 2026年10月24日

技術面接問題の一覧へ戻る