RFC 7636 - Proof Key for Code Exchange by OAuth Public Clients(PKCE)ざっくりまとめ
概要
- クライアントシークレットを秘匿できなく、かつ認可コードの受信者を保証できないクライアント(ネイティブアプリなど)は認可コード横取り攻撃(Authorization Code Interception Attack)に対して脆弱となる。
- PKCEはOAuth2の仕様を拡張し、認可コードの発行依頼者と利用者(トークン発行依頼者)が同一であることを
code_challenge
というキーを使って検証することを可能にする。
検証の流れ
- クライアントはAuthorization Requestに
code_challenge
とcode_challenge_method
を追加で指定する。- クライアントは
code_verifier
として、RFC3986の非予約文字から43~128文字のランダムな文字列を生成し、以下の計算式でハッシュ値code_challenge
を計算する。 -
code_challenge = BASE64URL-ENCODE(SHA256(ASCII(code_verifier)))
※code_challenge_method
がS256
の場合
- クライアントは
- 認可サーバーは受け取った
code_challenge
とcode_challenge_method
を発行する認可コードを紐づけて保存しておく。- 典型的な実装では、認可コード中に
code_challenge
とcode_challenge_method
を暗号化して埋め込んでしまう。 - PKCEが必須のクライアントが上記のパラメータを指定しない場合は
invalid_request
エラーを返却する。
- 典型的な実装では、認可コード中に
- クライアントはToken Requestに
code_verifier
を追加で指定する。 - 認可サーバーは
code_verifier
からcode_challenge
を計算し、認可コードに紐づく値と一致するか検証する。-
code_challenge
が一致しない場合はinvalid_grant
エラーを返却する。
-