RFC 7519: JSON Web Token(JWT)
RFC 7519 は、JSON 形式でクレーム(主張)を表現するためのトークン仕様です。このドキュメントでは、JWT の構造と使用方法を解説します。
第1部: 概要編
JWT とは何か?
JWT(JSON Web Token、ジョットと読む)は、2 者間で情報を安全にやり取りするためのコンパクトで URL セーフなトークン形式です。
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
└─────────────┬─────────────┘.└───────────────────────────┬───────────────────────────┘.└──────────────────┬───── ─────────────┘
Header Payload Signature
JWT の用途
| 用途 | 説明 |
|---|---|
| アクセストークン | OAuth 2.0 のアクセストークンとして使用 |
| ID トークン | OpenID Connect でユーザー情報を伝達 |
| クライアント認証 | private_key_jwt / client_secret_jwt |
| 情報交換 | サービス間で署名付きデータをやり取り |
JWT の特徴
| 特徴 | 説明 |
|---|---|
| コンパクト | Base64URL エンコードで URL やヘッダーに含めやすい |
| 自己完結 | トークン自体に必要な情報が含まれる |
| 検証可能 | 署名により改ざんを検知できる |
| 暗号化可能 | JWE を使えば内容を秘匿できる |
第2部: 詳細編
JWT の構造
JWT は 3 つのパートをドット(.)で連結した文字列です。
Header.Payload.Signature
Header(ヘッダー)
トークンのメタデータ。署名アルゴリズムとトークンタイプを指定。
{
"alg": "RS256",
"typ": "JWT",
"kid": "key-id-123"
}
| フィールド | 必須 | 説明 |
|---|---|---|
alg | ✅ | 署名アルゴリズム(HS256, RS256, ES256 など) |
typ | △ | トークンタイプ(通常 "JWT") |
kid | △ | 鍵 ID(複数鍵がある場合に使用) |
Payload(ペイロード)
クレーム(主張)のセット。ユーザー情報やトークンのメタデータを含む。
{
"iss": "https://auth.example.com",
"sub": "user-123",
"aud": "https://api.example.com",
"exp": 1704070800,
"iat": 1704067200,
"nbf": 1704067200,
"jti": "unique-token-id"
}
Signature(署名)
ヘッダーとペイロードを署名したもの。改ざん検知に使用。
RSASHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
privateKey
)
登録済みクレーム(Registered Claims)
RFC 7519 で定義されている標準クレーム。
| クレーム | 名前 | 説明 |
|---|---|---|
iss | Issuer | トークン発行者 |
sub | Subject | トークンの主体(ユーザー ID など) |
aud | Audience | トークンの対象者(受信者) |
exp | Expiration Time | 有効期限(Unix タイムスタンプ) |
nbf | Not Before | 有効開始時刻 |
iat | Issued At | 発行時刻 |
jti | JWT ID | トークンの一意識別子 |
すべて任意だが、用途に応じて必須になる。
公開クレーム(Public Claims)
IANA に登録されているか、衝突回避のために URI 形式で定義されるクレーム。
{
"https://example.com/claims/role": "admin",
"email": "user@example.com",
"name": "John Doe"
}
プライベートクレーム(Private Claims)
発行者と受信者の間で合意されたカスタムクレーム。
{
"department": "engineering",
"employee_id": "EMP-12345"
}