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 Framework→OAuth 2.0 Device Authorization (RFC 8628)OAuth 2.0 Device Authorization Grant→OAuth 2.1OAuth 2.1 Authorization Framework→OpenID Connect Core 1.0OpenID Connect Core 1.0→FIDO2 WebAuthn Level 3Web Authentication: Public Key Credentials→FIDO2 CTAP 2.2Client to Authenticator Protocol→FIDO UAF 1.1Universal Authentication Framework→FIDO U2F 1.2Universal Second Factor→OpenID Connect CIBA Core 1.0Client-Initiated Backchannel Authentication→JSON Web Token (RFC 7519)JSON Web Token (JWT)→OAuth 2.0 DPoP (RFC 9449)OAuth 2.0 Demonstrating Proof of Possession→SAML 2.0Security Assertion Markup Language 2.0→SCIM 2.0 (RFC 7644)System for Cross-domain Identity Management: Protocol→