Proof Key for Code Exchange — OAuth 2.0 の認可コードフローに対する拡張仕様(RFC 7636)。client_secret を安全に保持できないパブリッククライアント(SPA・モバイルアプリ)で、 認可コードの横取り攻撃 を防ぐ仕組み。
概要
OAuth 2.0 の標準的な認可コードフローは、認可コードをアクセストークンに交換する際に client_secret を提示 することでクライアントを認証する。しかし SPA やモバイルアプリではコードがクライアント側に展開されるため、 secret を秘密にできない 。
PKCE はこの問題を、リクエストごとに動的に生成する code_verifier / code_challenge ペアで解決する。
フロー(簡略)
認可コードを途中で盗まれても、攻撃者は code_verifier を知らない ため、トークンに交換できない。
state / nonce との違い
OIDC ではよく以下 3 つが並んで語られるが、防ぐ攻撃が異なる。
| 仕組み | 防ぐ攻撃 |
|---|---|
| state | CSRF(リクエスト改ざん) |
| nonce | ID トークンのリプレイ(使い回し) |
| PKCE | 認可コードの横取り(パブリッククライアント必須) |
3 つは互いに置き換え可能ではなく、 すべて併用 するのが現代の OIDC 実装のベストプラクティス。
必須条件
OAuth 2.1 ドラフトでは すべての認可コードフローで PKCE を必須 とする方針。SPA・モバイルだけでなく、サーバーサイドでも適用が推奨されている。
関連用語
- AWS Cognito — Hosted UI / Managed Login で PKCE をネイティブサポート
- パスキー — フィッシング耐性を提供する別軸の認証強化策