# (OpenID Connect Core 1.0) 2. ID Token
###### tags: `oauth2/oidc`
担当::@oribe:
[TOC]
---
End-Userの認証を可能にするために行った、OAuth 2.0からOpenID Connectへの一番の拡張はID Tokenのデータ構造である
ID Tokenは、Clientを使用する際にAuthorization ServerからのEnd-Userの認証についてのClaim、または他にリクエストされた可能性のあるClaimを含んだsecurity tokenである
ID Tokenは[JSON Web Token(JWT)](https://openid.net/specs/openid-connect-core-1_0.html#JWT)として表現される
OpenID Connectで使用される全てのOAuth 2.0フローのためのID Tokenに含まれるClaimは以下の通り
## `iss`
**必須(REQUIRED)**
レスポンスを発行したIssuerのIssure Identifier
`iss`の値はcase sensitiveで`https`スキーマ形式なURLである
`https`スキーマは、スキーマやホスト、任意でのポート番号やパスを含み、クエリとフラグメントは含まない
## `sub`
**必須(REQUIRED)**
Subject Identifier
Issuer内で一意であり、決して再利用されないEnd-Userの識別子で、Clientに使用されることを意図している
例: `24400320`、`AItOawmwtWwcT0k51BayewNvutrJUqsvl6qs7A4`
ASCIIで長さが255を超えてはならない(**MUST NOT**)
`sub`の値は、case sensitiveな文字列
## `aud`
**必須(REQUIRED)**
audienceは、このID Tokenが何のために発行されたのかを示すもの
audienceの値として、Relying PartyのOAuth 2.0における`client_id`を必ず含まなければならない(**MUST**)
また、他のaudienceのための識別子を含んでもよい(**MAY**)
一般的に、`aud`の値はcase sensitiveな文字列の配列である
audienceが1つの場合のよくある特殊ケースとして、`aud`の値はcase sensitiveな単一の文字列でもよい(**MAY**)
## `exp`
**必須(REQUIRED)**
有効期限で、それ以降の処理でID Tokenを受領してはならない(**MUST NOT**)
このパラメータの処理において、現在の日時がこの有効期限の値よりも前でなければならない(**MUST**)
実装においては、時計のずれを考慮して多少の猶予(通常、数分以下)を提供してもよい(**MAY**)
この値は、UTCで計測した`1970-01-01T0:0:0Z`からその日時までの秒数の数字をJSONの数値で表現したもの
一般的な、また特にUTCにおける日時についての詳細は[RFC 3339](https://datatracker.ietf.org/doc/html/rfc3339)を参照
:::info
要するにUNIX timeのこと
:::
## `iat`
**必須(REQUIRED)**
JWTが発行された日時
この値は、UTCで計測した`1970-01-01T0:0:0Z`からその日時までの秒数の数字をJSONの数値で表現したもの
## `auth_time`
End-User認証が発生した日時
この値は、UTCで計測した`1970-01-01T0:0:0Z`からその日時までの秒数の数字をJSONの数値で表現したもの
`max_age`のリクエストが作成された時、または`auth_time`がEssential Claimとしてリクエストされた場合、このClaimは必須(**REQUIRED**)
そうでない場合は、この値を含むかどうかは任意(OPTIONAL)
(`auth_time`Claimは意味的に[OpenID 2.0 PAPE](https://openid.net/specs/openid-provider-authentication-policy-extension-1_0.html)のレスポンスパラメータ`auth_time`に対応する)
:::info
**[OpenID Provider Authentication Policy Extension(OpenID 2.0 PAPE)](https://openid.net/specs/openid-provider-authentication-policy-extension-1_0.html)**
End-Userの認証方法について、Relying PartyがOpenID Providorにリクエストする方法を提供する拡張
OpenID 1.1とOpenID 2.0の両方に使用可能
:::
## `nonce`
Client sessionをID Tokenと結びつけたり、replay attackを緩和したりに使用される文字列
この値は、Authentication Requestから変更されずにそのままID Tokenに渡される
ID Tokenにこの値が存在した場合、Clientは必ず`nonce`Claimの値がAuthentication Requestの`nonce`パラメータで送信された値と等しいことを検証しなければならない(**MUST**)
Authentication Requestにこの値が存在していた場合、Authorization Serverは必ず`nonce`ClaimをID Tokenに含めなければならず、その値はAuthentication Requestで送信された値としなければならない(**MUST**)
Authorization Serverは使用された`nonce`の値に対して他の処理を行うべきでない(**SHOULD**)
`nonce`の値はcase sensitiveな文字列である
:::info
**Replay Attack**
パスワードや暗号鍵、あるいは認証済みのセッションデータなどを再利用してそのユーザーになりすます攻撃
[OpenIDをとりまくセキュリティ上の脅威とその対策:OpenIDの仕様と技術(4)(3/3 ページ) - @IT](https://atmarkit.itmedia.co.jp/ait/articles/0711/20/news128_3.html)
:::
## `acr`
任意(OPTIONAL)
Authentication Context Class Reference
実施された認証が満たすAuthentication Context Classを識別する、Authentication Context Class Reference値を示す文字列
値"0"はそのEnd-User認証が[ISO/IEC 29115](https://www.iso.org/standard/45138.html)のlevel 1の要求を満たしていないことを示す
有効期間の長いブラウザのcookieを使用するAuthenticationは、"level 0"を使用するとことが適切な例の1つ
金銭に関わる値のリソースへのアクセスの認可において、level 0のAuthenticationは使用されるべきでない(**SHOULD NOT**)
(これは[OpenID 2.0 PAPE](https://openid.net/specs/openid-provider-authentication-policy-extension-1_0.html)の`nist_auth_level` 0に対応する)
`acr`の値には、完全なURI、または[RFC 6711](https://datatracker.ietf.org/doc/html/rfc6711)に登録された名称を使用すべきである(**SHOULD**)
登録された名称は、登録されたのと異なる意味合いで使用してはならない(**MUST NOT**)
このclaimの値の意味はコンテキスト固有となりうるため、これを使用する関係者はその値が使われる意味について合意しておく必要があるだろう
`acr`の値はcase sensitiveな文字列
:::info
**[ISO/IEC 29115](https://www.iso.org/standard/45138.html)**
特定の状況におけるエンティティ認証の保証を管理するための枠組みを提供する
エンティティ認証の保証において、4つのレベル(LoA)を規定する
(仕様書は有料)
:::
:::info
**[RFC 6711 - An IANA Registry for Level of Assurance (LoA) Profiles](https://datatracker.ietf.org/doc/html/rfc6711)**
LoAの定義などを発見するための支援として使用されるレジストリを確立するための仕様
:::
## `amr`
任意(OPTIONAL)
Authentication Methods Reference
認証で使用された認証方法をを示す識別子による文字列の、JSON配列
例えば、値はパスワード認証とOTP認証が使用されたことを示す
`amr`Claimで使われる個別の値の定義はこの仕様の範囲外である
このclaimの値の意味はコンテキスト固有となりうるため、これを使用する関係者はその値が使われる意味について合意しておく必要があるだろう
## `azp`
任意(OPTIONAL)
ID Tokenが発行された関係者、Authorized party
この値が存在した場合、このpartyのOAuth 2.0 Client IDを含めなければならない(**MUST**)
このClaimはID Tokenが単一のaudienceの値を持っていて、そのaudienceがauthorized partyと異なる場合にのみ必要
authorization partyが単一のaudienceの値と同じ時にこれを含んでもよい(**MAY**)
`azp`の値は、case sensitiveな文字列でStringOrURIの値を含む
:::info
**StringOrURI**
[RFC 7519 - JSON Web Token (JWT)](https://datatracker.ietf.org/doc/html/rfc7519)で定義されてる形式
任意の文字列値を使用してよいが、`:`を含む場合はURIでなければならない
:::
ID Tokenは他のClaimを含んでもよい(**MAY**)
解釈できないClaimは無視しなければならない(**MUST**)
この仕様で定義される追加のClaimについては、 3.1.3.6、3.3.2.11、5.1、7.4を参照
ID TokenはJWSを用いて署名されなければならない(**MUST**)
また、任意でJWSによって署名したのちJWEで暗号化できる
それによって、認証、完全性、否認防止、また任意で機密性を提供する
詳細は[Section 16.14](https://openid.net/specs/openid-connect-core-1_0.html#SigningOrder)
ID Tokenを暗号化する場合は署名を行ってから暗号化しなければならず(**MUST**)、その結果は[JWT](https://datatracker.ietf.org/doc/html/rfc7519)で定義されるNested JWTとなる
使われたResponse TypeがAuthorization EndpointからID Tokenを返さず(Authorization Code Flowの使用時など)、かつClientがRegistrationの時に明確に`none`の使用を要求した場合を除いて、ID Tokenは`alg`の値として`none`を使用してはならない(**MUST NOT**)
ID TokenはJWSやJWEの`x5u`、`x5c`、`jku`、`jwk`のHeader Parameterのフィールドを使うべきでない(**SHOULD NOT**)
代わりに、使われた鍵への言及は、Section 10の通りDiscoveryとRegistrationパラメータを使って前もって伝える
以下はID Tokenにおける規範的でない、Claimの集合(JWT Claims Set)の例
```json
{
"iss": "https://server.example.com",
"sub": "24400320",
"aud": "s6BhdRkqt3",
"nonce": "n-0S6_WzA2Mj",
"exp": 1311281970,
"iat": 1311280970,
"auth_time": 1311280969,
"acr": "urn:mace:incommon:iap:silver"
}
```