OAuth 2.0 PKCE (RFC 7636)

Proof Key for Code Exchange by OAuth Public Clients

認可コードを横取りされてもトークンへ交換できないよう、一度限りの秘密値でClientと認可リクエストを結び付ける仕様です。

STATUSPublished September 2015FLOWS2 documentedPrimary specification ↗

この仕様は、
何を解決するのか。

Authorization Code Flowを実装し、code_verifierとcode_challengeがどこで作られ、なぜ必要なのかを理解したい人向けです。

PKCE(Proof Key for Code Exchange)は、Authorization Code Flowで発行された認可コードを、認可リクエストを始めたClientだけがトークンへ交換できるようにする仕組みです。読み方は『ピクシー』です。

Clientは最初に推測困難なcode_verifierを作り、そのSHA-256ハッシュであるcode_challengeだけをAuthorization Serverへ送ります。Token Endpointでは元のcode_verifierを提示し、サーバーが再計算した値と最初のchallengeが一致した場合だけトークンを発行します。

仕様が定める、大切なこと。

01

認可コードをClientへ結び付ける

認可コードだけでなく、処理開始時に作った一度限りの秘密値も要求し、別のClientによるコード交換を防ぎます。

02

Client Secretを置けない環境を守る

SPAやモバイルアプリのように固定Secretを安全に保管できないPublic Clientでも、リクエストごとの証明を利用できます。

03

コード横取りの被害を抑える

カスタムURL Schemeやログなどから認可コードが漏れても、code_verifierがなければトークンへ交換できません。

01code_verifier02code_challenge03S25604Authorization Code Binding05One-time Proof

安全に使うための確認事項。

仕様を実装するときは、正常系の通信だけでなく、値のすり替え、再利用、漏えいが起きた場合も考えます。

  1. 01

    code_verifierは暗号学的に安全な乱数から生成し、43〜128文字の許可された文字列として扱います。

  2. 02

    code_challenge_methodにはplainではなくS256を使用します。

  3. 03

    code_verifierはブラウザURLへ含めず、Clientのセッションなど外部へ漏れにくい場所に一時保存します。

  4. 04

    PKCEはstate、redirect_uri検証、Client認証を置き換えるものではなく、それぞれ別の攻撃を防ぎます。

この仕様に属するフロー

ほかの仕様との関係

PKCEはRFC 6749のAuthorization Code Grantを拡張します。OAuth 2.1ではPublic ClientだけでなくAuthorization Code Flow全般の基本要件として扱われます。OIDC Authorization Code Flowでも同じ仕組みを利用できます。

OAuth 2.0 (RFC 6749)The OAuth 2.0 Authorization FrameworkOAuth 2.0 Device Authorization (RFC 8628)OAuth 2.0 Device Authorization GrantOAuth 2.1OAuth 2.1 Authorization FrameworkOpenID Connect Core 1.0OpenID Connect Core 1.0FIDO2 WebAuthn Level 3Web Authentication: Public Key CredentialsFIDO2 CTAP 2.2Client to Authenticator ProtocolFIDO UAF 1.1Universal Authentication FrameworkFIDO U2F 1.2Universal Second FactorOpenID Connect CIBA Core 1.0Client-Initiated Backchannel AuthenticationJSON Web Token (RFC 7519)JSON Web Token (JWT)OAuth 2.0 DPoP (RFC 9449)OAuth 2.0 Demonstrating Proof of PossessionSAML 2.0Security Assertion Markup Language 2.0SCIM 2.0 (RFC 7644)System for Cross-domain Identity Management: Protocol