CTS-KB

state / nonce

すていととなんす

state パラメータ nonce パラメータ
#認証 #OAuth #OIDC #セキュリティ #CSRF

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 が返ってくることを検証することで、 第三者によって細工されたリダイレクトでないこと を保証する。

state — CSRF 防止IdPクライアントIdPクライアントstate = "abc123" を生成セッションに保存state の一致を検証不一致なら拒否/authorize?state=abc123/callback?code=xxx&state=abc123

nonce — リプレイ攻撃防止

OIDC の認可リクエストで ランダム文字列nonce として送ると、IdP が発行する ID Token の中に同じ nonce を埋め込んで 返してくる。クライアントは ID Token 検証時にこの nonce が自分が送ったものと一致することを確認することで、 古い ID Token の使い回し(リプレイ) を防ぐ。

3 種は併用必須

OIDC を実装する際、これら 3 種は 互いに置き換え可能ではない 。すべて併用しないと、対応する攻撃ベクトルが残る。

状況statenoncePKCE
サーバーサイド Web アプリ + OIDC✅(推奨、OAuth 2.1 で必須)
SPA + OIDC必須
モバイルアプリ + OIDC必須
OAuth 2.0 のみ(認証なし)✅(OAuth 2.1 で必須)

関連用語

  • PKCE — 認可コード横取りを防ぐ独立した拡張
  • OpenID Connect — nonce を必要とする上位仕様
  • OAuth 2.0 — state を必要とする基盤仕様

外部リソース