トークンの概要
OAuth 2.0 / OIDC では3種類のトークンが使われます。 それぞれの役割、特徴、ライフサイクルを理解しましょう。
アクセストークン
API にアクセスするための「通行証」です。 リソースサーバーに対して「この操作を行う権限があります」と証明します。
短い有効期限: 通常15分〜1時間。漏洩した場合の被害を最小限にする。
スコープで権限を制限: 「写真の読み取りのみ」のように、できることが限定される。
形式は仕様で定められていない: ランダム文字列の場合も、JWT 形式の場合もある。
例え話
ホテルのカードキーのようなもの。 チェックアウト日まで有効で、割り当てられた部屋だけを開けられる。 ホテル全体の管理はできない。
IDトークン
OIDC で追加された「身分証明書」です。 ユーザーが誰であるかという情報(クレーム)が含まれます。 必ず JWT (JSON Web Token) 形式です。
JWT 形式で署名されている: 改ざんを検出できる。
ユーザー情報を含む: 名前、メールアドレスなどのクレームが含まれる。
API アクセスには使わない: IDトークンはクライアント向け。API にはアクセストークンを使う。
JWT の構造
# IDトークンは3つのパートで構成
eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.SflKxwRJSMeKKF2QT4fw...
# デコードすると
ヘッダー: { alg: "RS256" }
ペイロード: {sub: "1234567890", name: "田中太郎" }
署名: 改ざん検出用のデジタル署名
リフレッシュトークン
アクセストークンの「更新チケット」です。 アクセストークンの有効期限が切れたとき、ユーザーに再ログインを 求めることなく新しいアクセストークンを取得できます。
長い有効期限: 数日〜数ヶ月。ユーザー体験のために長めに設定される。
厳重に保管が必要: 新しいアクセストークンを発行できるため、漏洩すると危険。
認可サーバーにのみ送信: リソースサーバーには送らない。トークンエンドポイントでのみ使用。
例え話
定期券の更新券のようなもの。 定期券(アクセストークン)が切れても、更新券(リフレッシュトークン)があれば 窓口(認可サーバー)で新しい定期券を受け取れる。 毎回購入手続き(ログイン)をやり直す必要がない。
トークンのライフサイクル
# トークンの一生
1. ユーザーが認証・認可
→ 認可サーバーがトークンを発行
2. クライアントがアクセストークンで API を呼び出す
→ リソースサーバーがトークンを検証
3. アクセストークンの有効期限が切れる (15分〜1時間後)
4. リフレッシュトークンで新しいアクセストークンを取得
→ ユーザーの操作は不要
5. リフレッシュトークンも期限切れ or 取り消し
→ ユーザーに再ログインを求める
3つのトークンの比較
| アクセストークン | IDトークン | リフレッシュトークン | |
|---|---|---|---|
| 目的 | API アクセス | ユーザー識別 | トークン更新 |
| 送信先 | リソースサーバー | クライアント内で利用 | 認可サーバー |
| 有効期限 | 短い (分〜時間) | 短い (分〜時間) | 長い (日〜月) |
| 形式 | 不定 / JWT | 必ず JWT | 不定 |