OIDC で使用する code verifier と code challenge の生成方法


下のようにして、 OIDCで使う code_verifiercode_challenge を生成できます。 コードは Gist にもあります。

JavaScript

F#

Python

Ruby

Shell Script


PKCE、Proof Key for Code Exchange

コード検証器とコードチャレンジは、PKCEメカニズムで使用される要素です。PKCEは、OAuth 2.0とOpenID Connect(OIDC)認証フローのセキュリティ強化手段です。これは、主に認可コードの傍受攻撃から保護するために使用されます。

それがどのように機能するかを以下に示します。

認可コードフロー

  • 標準のOAuth 2.0認可コードフローでは、クライアントアプリケーションは認可サーバーから認可コードをリクエストします。
  • 認可コードは、その後、アクセストークンと交換されます。
  • ただし、このフローは、特にモバイルアプリケーションやシングルページアプリケーションでは、傍受攻撃に対して脆弱です。

PKCEの救世主

  • PKCEは、認可コードをアクセストークンと交換する前に追加のステップを導入します。
  • クライアントはランダムなコード検証器を生成し、そのハッシュ値(コードチャレンジ)を計算します。
  • コード検証器は、初期の認可リクエスト中に認可サーバーに送信されます。
  • サーバーは認可コードに関連付けられたコードチャレンジを保存します。
  • クライアントが認可コードをアクセストークンと交換するとき、元のコード検証器も送信する必要があります。
  • サーバーは、コード検証器が保存されたコードチャレンジと一致するかどうかを検証します。

なぜPKCEが重要なのか?

  • PKCEは、認可コードを傍受してアクセストークンを取得する攻撃者を防ぎます。
  • 攻撃者が認可コードを取得したとしても、対応するコード検証器を持っていません。
  • これにより、トークンの盗難を行うことがより難しくなります。

使用法

  • PKCEは、認可コードフローを使用するすべてのパブリッククライアント(例:モバイルアプリ、シングルページアプリ)に推奨されています。
  • 機密クライアント(例:サーバーサイドアプリケーション)も追加のセキュリティとしてPKCEを使用できます。

PKCEは、あなたのアプリと認可サーバーとの間の秘密の握手のようなもので、意図した受信者のみが認可プロセスを完了できるようにします。