ここでは、OIDC の認可リクエスト・レスポンスにおいて `nonce` と `state` がどのようにやり取りされるのか、**具体的な送信データ** を示しながら説明します。
🔹 認可リクエスト(Authorization Request)
OIDC クライアント(RP)は、ユーザーを認証するために認可エンドポイントにリクエストを送ります。
このとき、nonce と state をランダムに生成し、URL パラメータとして付加します。
認可リクエストの例
GET https://auth.example.com/authorize? response_type=code &client_id=your-client-id &redirect_uri=https://your-app.com/callback &scope=openid profile email &state=xyzABC123456 &nonce=abcdEFG789
各パラメータの説明
| パラメータ | 説明 |
|---|---|
response_type=code |
認可コードフローを指定 |
client_id=your-client-id |
クライアント ID |
redirect_uri=https://your-app.com/callback |
認可コードのリダイレクト先 |
scope=openid profile email |
要求するスコープ |
state=xyzABC123456 |
CSRF 防止用のランダムな値 |
nonce=abcdEFG789 |
ID Token のリプレイ攻撃を防ぐためのランダムな値 |
🔹 認可レスポンス(Authorization Response)
ユーザーが認証を完了すると、OIDC プロバイダ(OP)はクライアントの redirect_uri にレスポンスをリダイレクトします。
このとき、リクエスト時に送信した state をそのまま返します。
認可レスポンスの例
HTTP/1.1 302 Found Location: https://your-app.com/callback? code=SplxlOBeZQQYbYS6WxSbIA &state=xyzABC123456
各パラメータの説明
| パラメータ | 説明 |
|---|---|
code=SplxlOBeZQQYbYS6WxSbIA |
認可コード(後でトークンを取得するために使用) |
state=xyzABC123456 |
認可リクエスト時の state(照合用) |
クライアントは state の値を検証し、一致しなければレスポンスを拒否します。
🔹 トークンリクエスト(Token Request)
クライアント(RP)は、認可コードを使用してトークンエンドポイントにリクエストを送り、アクセストークンと ID トークンを取得します。
トークンリクエストの例
POST https://auth.example.com/token Content-Type: application/x-www-form-urlencoded grant_type=authorization_code &code=SplxlOBeZQQYbYS6WxSbIA &redirect_uri=https://your-app.com/callback &client_id=your-client-id &client_secret=your-client-secret
🔹 トークンレスポンス(Token Response)
OP は、アクセストークンと ID Token をクライアントに返します。
トークンレスポンスの例
{ "access_token": "SlAV32hkKG", "token_type": "Bearer", "expires_in": 3600, "id_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjEiLCJ0..." }
この id_token に nonce が含まれています。
🔹 ID トークンの内容
ID トークンは JWT(JSON Web Token) 形式で、デコードすると次のような JSON データが含まれます。
id_token のペイロード(デコード後)
{ "iss": "https://auth.example.com", "sub": "1234567890", "aud": "your-client-id", "exp": 1718154820, "iat": 1718151220, "nonce": "abcdEFG789" }
各パラメータの説明
| パラメータ | 説明 |
|---|---|
iss |
ID トークンの発行元(OIDC プロバイダの URL) |
sub |
ユーザー ID(一意の識別子) |
aud |
クライアント ID(このトークンが誰向けか) |
exp |
有効期限(UNIX 時間) |
iat |
発行時刻(UNIX 時間) |
nonce |
認可リクエスト時に送信した nonce |
クライアントは nonce を検証し、一致しなければ ID Token を拒否します。
🔹 まとめ
| パラメータ | 送信先 | 戻り先 | 役割 |
|---|---|---|---|
state |
認可リクエスト | 認可レスポンス | CSRF 防止、リクエストとレスポンスの関連付け |
nonce |
認可リクエスト | ID トークン | ID Token のリプレイ攻撃防止 |
state は URL に含まれ、CSRF 攻撃を防ぐために使われます。
nonce は ID Token に埋め込まれ、リプレイ攻撃を防ぐために使われます。
OIDC の実装では、state と nonce の正しい取り扱いがセキュリティ上の重要なポイントとなります。