スコープとクレーム
スコープは「何を許可するか」を定義し、 クレームは「トークンに何が含まれるか」を表します。 この2つの関係を理解することが、OIDC を使いこなす鍵です。
スコープ (Scope) - 権限の範囲
スコープは、クライアントがアクセスしたい情報や操作の「範囲」を宣言するものです。 ユーザーは認可画面で、どのスコープを許可するか選択できます。
例え話
スコープは「注文書」のようなもの。レストランで「ドリンクメニューだけ見せてください」 と頼むのと、「全メニュー見せてください」と頼むのでは、見られる範囲が違います。 スコープで「何を要求するか」を明確にし、お客さん(ユーザー)が承認します。
openidOIDC を使うことを示す必須スコープ。IDトークンが返される。
必須profile名前、ニックネーム、写真などのプロフィール情報。
emailメールアドレスとメール確認状態。
address住所情報。
phone電話番号と電話番号確認状態。
offline_accessリフレッシュトークンの発行を要求する。
認可リクエストでのスコープ指定
# 認可エンドポイントへのリクエスト
GET /authorize?
response_type=code&
client_id=my-app&
scope=openid profile email&
redirect_uri=https://my-app.com/callback
# スコープはスペース区切りで複数指定可能
クレーム (Claim) - トークンに含まれる情報
クレームは、トークン(特にIDトークン)の中に含まれる個々の情報のことです。 「名前」「メールアドレス」「発行者」「有効期限」などが、それぞれ1つのクレームです。
| クレーム | 説明 | スコープ |
|---|---|---|
sub | ユーザーの一意識別子 | openid |
name | フルネーム | profile |
given_name | 名 | profile |
family_name | 姓 | profile |
picture | プロフィール画像のURL | profile |
email | メールアドレス | email |
email_verified | メール確認済みかどうか | email |
iss | トークン発行者 | (必須) |
aud | トークンの対象者 | (必須) |
exp | 有効期限 | (必須) |
iat | 発行日時 | (必須) |
スコープとクレームの関係
スコープを要求すると、そのスコープに対応するクレームがトークンに含まれます。 つまり、スコープは「クレームのグループ」と考えることができます。
# scope=openid profile email を要求した場合
openid → sub
profile → name, given_name, family_name, picture, ...
email → email, email_verified
# IDトークンのペイロード
{
"sub": "user-123",
"name": "田中太郎",
"email": "tanaka@example.com",
"email_verified": true,
"iss": "https://auth.example.com",
"aud": "my-app",
"exp": 1700000000,
"iat": 1699996400
}
覚えておきたいポイント
openid スコープがないと OIDC として扱われない(純粋な OAuth 2.0 になる)
プロバイダーによっては独自のスコープやクレームを提供している (例: Google の https://www.googleapis.com/auth/drive.readonly)
最小権限の原則に従い、必要なスコープだけを要求すべき