認可コードをClientへ結び付ける
認可コードだけでなく、処理開始時に作った一度限りの秘密値も要求し、別のClientによるコード交換を防ぎます。
Specification
認可コードを横取りされてもトークンへ交換できないよう、一度限りの秘密値でClientと認可リクエストを結び付ける仕様です。
Overview
PKCE(Proof Key for Code Exchange)は、Authorization Code Flowで発行された認可コードを、認可リクエストを始めたClientだけがトークンへ交換できるようにする仕組みです。読み方は『ピクシー』です。
Clientは最初に推測困難なcode_verifierを作り、そのSHA-256ハッシュであるcode_challengeだけをAuthorization Serverへ送ります。Token Endpointでは元のcode_verifierを提示し、サーバーが再計算した値と最初のchallengeが一致した場合だけトークンを発行します。
Purpose and responsibilities
認可コードだけでなく、処理開始時に作った一度限りの秘密値も要求し、別のClientによるコード交換を防ぎます。
SPAやモバイルアプリのように固定Secretを安全に保管できないPublic Clientでも、リクエストごとの証明を利用できます。
カスタムURL Schemeやログなどから認可コードが漏れても、code_verifierがなければトークンへ交換できません。
Key concepts
Security considerations
仕様を実装するときは、正常系の通信だけでなく、値のすり替え、再利用、漏えいが起きた場合も考えます。
code_verifierは暗号学的に安全な乱数から生成し、43〜128文字の許可された文字列として扱います。
code_challenge_methodにはplainではなくS256を使用します。
code_verifierはブラウザURLへ含めず、Clientのセッションなど外部へ漏れにくい場所に一時保存します。
PKCEはstate、redirect_uri検証、Client認証を置き換えるものではなく、それぞれ別の攻撃を防ぎます。
Interactive flows
Position and relationship
PKCEはRFC 6749のAuthorization Code Grantを拡張します。OAuth 2.1ではPublic ClientだけでなくAuthorization Code Flow全般の基本要件として扱われます。OIDC Authorization Code Flowでも同じ仕組みを利用できます。
Other specifications