OAuth 2.0 / OpenID Connect の認可フローで使われる、 攻撃対策のためのパラメータ 。互いに独立した役割を持つ。
役割の違い
| パラメータ | 守るタイミング | 防ぐ攻撃 | 必須クライアント |
|---|---|---|---|
| state | 行き(認可リクエスト) | CSRF(リクエスト改ざん・横取り) | OAuth 2.0 を使うすべて |
| nonce | 帰り(ID Token 検証時) | ID Token のリプレイ(再送信) | OIDC を使うすべて |
| PKCE | 中間(コード→トークン交換時) | 認可コード横取り | client_secret を持てない SPA・モバイル必須 |
state は「行きの守り」、nonce は「帰りの守り」、PKCE は「中間者の守り」。
state — CSRF 防止
クライアントが認可リクエストを送る前に ランダム文字列 を生成し、state パラメータに含める。コールバック時に同じ state が返ってくることを検証することで、 第三者によって細工されたリダイレクトでないこと を保証する。
nonce — リプレイ攻撃防止
OIDC の認可リクエストで ランダム文字列 を nonce として送ると、IdP が発行する ID Token の中に同じ nonce を埋め込んで 返してくる。クライアントは ID Token 検証時にこの nonce が自分が送ったものと一致することを確認することで、 古い ID Token の使い回し(リプレイ) を防ぐ。
3 種は併用必須
OIDC を実装する際、これら 3 種は 互いに置き換え可能ではない 。すべて併用しないと、対応する攻撃ベクトルが残る。
| 状況 | state | nonce | PKCE |
|---|---|---|---|
| サーバーサイド Web アプリ + OIDC | ✅ | ✅ | ✅(推奨、OAuth 2.1 で必須) |
| SPA + OIDC | ✅ | ✅ | ✅ 必須 |
| モバイルアプリ + OIDC | ✅ | ✅ | ✅ 必須 |
| OAuth 2.0 のみ(認証なし) | ✅ | — | ✅(OAuth 2.1 で必須) |
関連用語
- PKCE — 認可コード横取りを防ぐ独立した拡張
- OpenID Connect — nonce を必要とする上位仕様
- OAuth 2.0 — state を必要とする基盤仕様