CTS-KB

PKCE

ぴーけーしーいー

Proof Key for Code Exchange RFC 7636 ぴくしー
#OAuth #OIDC #セキュリティ #SPA #モバイル

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 を生成code_challenge = SHA256(code_verifier)SHA256(code_verifier) ==保存した code_challenge を検証/authorize?code_challenge=...認可コード/token (認可コード + code_verifier)アクセストークン

認可コードを途中で盗まれても、攻撃者は code_verifier を知らない ため、トークンに交換できない。

state / nonce との違い

OIDC ではよく以下 3 つが並んで語られるが、防ぐ攻撃が異なる。

仕組み防ぐ攻撃
stateCSRF(リクエスト改ざん)
nonceID トークンのリプレイ(使い回し)
PKCE認可コードの横取り(パブリッククライアント必須)

3 つは互いに置き換え可能ではなく、 すべて併用 するのが現代の OIDC 実装のベストプラクティス。

必須条件

OAuth 2.1 ドラフトでは すべての認可コードフローで PKCE を必須 とする方針。SPA・モバイルだけでなく、サーバーサイドでも適用が推奨されている。

関連用語

  • AWS Cognito — Hosted UI / Managed Login で PKCE をネイティブサポート
  • パスキー — フィッシング耐性を提供する別軸の認証強化策

外部リソース