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エラーを返却する。
-