OIDC / OAuth 2.0

IDトークン詳解

OIDC

OIDCの中核となるIDトークン。JWT形式の構造、標準クレーム、検証手順を理解しましょう。

IDトークンの構造(JWT形式)

IDトークンは JSON Web Token (JWT) 形式で発行されます。 JWTはドット(.)で区切られた3つの部分から構成されます。

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJodHRwczovL2V4YW1wbGUuY29tIiwic3ViIjoiMTIzNDUifQ.SflKxwRJSMeKKF2QT4fwpM...

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トークン vs アクセストークン
項目IDトークンアクセストークン
目的認証(誰であるか)認可(何ができるか)
対象クライアントアプリリソースサーバー
形式JWT(必須)任意(JWT、opaque等)
送信先APIに送ってはいけないAPIに送る
検証者クライアントが検証リソースサーバーが検証

IDトークンをAPIのアクセス制御に使ってはいけません。 IDトークンはクライアントアプリが「誰がログインしたか」を知るためのものです。 APIへのアクセスにはアクセストークンを使いましょう。

IDトークンの検証手順
1

JWTの署名を検証する

プロバイダーのJWKSエンドポイントから公開鍵を取得し、IDトークンの署名が正しいことを確認する。ヘッダーのkidで鍵を特定する。

2

issクレームを検証する

issの値が期待するプロバイダーのURLと一致することを確認する。異なるプロバイダーが発行したトークンを受け入れてはならない。

3

audクレームを検証する

audに自分のclient_idが含まれていることを確認する。他のクライアント向けのトークンを受け入れてはならない。

4

expクレームを検証する

現在時刻がexpを超えていないことを確認する。クロックスキューを考慮して数分の猶予を持たせることが一般的。

5

nonceを検証する(使用した場合)

認可リクエストでnonceを送った場合、IDトークン内のnonceが一致することを確認する。リプレイ攻撃を防止する。

次のステップ

IDトークンの仕組みを理解したら、次は ディスカバリドキュメント で、OIDCプロバイダーの自動設定の仕組みを学びましょう。