IDトークンは JSON Web Token (JWT) 形式で発行されます。 JWTはドット(.)で区切られた3つの部分から構成されます。
Header
署名アルゴリズム (alg) とトークンタイプ (typ) を含む
Payload
ユーザー情報や発行者情報などのクレームを含む
Signature
Header + Payload を秘密鍵で署名した値
iss(Issuer)必須IDトークンを発行した認可サーバーの識別子(URL)
例: "https://accounts.example.com"
sub(Subject)必須ユーザーの一意な識別子。プロバイダー内でユニークであることが保証される
例: "user-12345"
aud(Audience)必須このトークンの対象となるクライアントのclient_id。配列の場合もある
例: "my-app-client-id"
exp(Expiration Time)必須トークンの有効期限(UNIXタイムスタンプ)。この時刻以降はトークンを受け入れてはならない
例: 1700000000
iat(Issued At)必須トークンが発行された時刻(UNIXタイムスタンプ)
例: 1699996400
nonce(Nonce)任意リプレイ攻撃防止用。認可リクエストで送ったnonceと一致することを検証する
例: "abc123random"
auth_time(Authentication Time)任意ユーザーが実際に認証を行った時刻。max_ageを指定した場合は必須
例: 1699996000
| 項目 | IDトークン | アクセストークン |
|---|---|---|
| 目的 | 認証(誰であるか) | 認可(何ができるか) |
| 対象 | クライアントアプリ | リソースサーバー |
| 形式 | JWT(必須) | 任意(JWT、opaque等) |
| 送信先 | APIに送ってはいけない | APIに送る |
| 検証者 | クライアントが検証 | リソースサーバーが検証 |
IDトークンをAPIのアクセス制御に使ってはいけません。 IDトークンはクライアントアプリが「誰がログインしたか」を知るためのものです。 APIへのアクセスにはアクセストークンを使いましょう。
JWTの署名を検証する
プロバイダーのJWKSエンドポイントから公開鍵を取得し、IDトークンの署名が正しいことを確認する。ヘッダーのkidで鍵を特定する。
issクレームを検証する
issの値が期待するプロバイダーのURLと一致することを確認する。異なるプロバイダーが発行したトークンを受け入れてはならない。
audクレームを検証する
audに自分のclient_idが含まれていることを確認する。他のクライアント向けのトークンを受け入れてはならない。
expクレームを検証する
現在時刻がexpを超えていないことを確認する。クロックスキューを考慮して数分の猶予を持たせることが一般的。
nonceを検証する(使用した場合)
認可リクエストでnonceを送った場合、IDトークン内のnonceが一致することを確認する。リプレイ攻撃を防止する。
次のステップ
IDトークンの仕組みを理解したら、次は ディスカバリドキュメント で、OIDCプロバイダーの自動設定の仕組みを学びましょう。