ITエンジニアが仕事に対して思うこと

ITエンジニアとして働く中で感じたことを、現場の温度感そのままに言語化するブログです。設計・実装・運用のリアル、学び続ける負荷、品質とスピードのせめぎ合い、コミュニケーションの難しさなど、きれいごとだけでは語れない「仕事の実態」を整理します。誰かを責めるのではなく、なぜそうなるのかを構造で捉え、明日から少し楽に、少し強く働ける視点を提供します。新人から中堅、マネジメントまで参考に。

OIDC における `nonce` と `state` の具体的な送信データ

                                   ここでは、OIDC の認可リクエスト・レスポンスにおいて `nonce` と `state` がどのようにやり取りされるのか、**具体的な送信データ** を示しながら説明します。

🔹 認可リクエスト(Authorization Request)

OIDC クライアント(RP)は、ユーザーを認証するために認可エンドポイントにリクエストを送ります。
このとき、noncestate をランダムに生成し、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_tokennonce が含まれています。


🔹 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 攻撃を防ぐために使われます。
nonceID Token に埋め込まれ、リプレイ攻撃を防ぐために使われます。

OIDC の実装では、statenonce の正しい取り扱いがセキュリティ上の重要なポイントとなります。