JWTの構造: ヘッダー、ペイロード、署名
JWTの3つの構成要素(ヘッダー、ペイロード、署名)を解説。各パートのエンコード方法、含まれる内容、パート間の関連性を詳しく説明します。
詳細な説明
JSON Web Tokenは、ピリオドで区切られた3つの部分で構成されます: header.payload.signature。各部分はbase64urlエンコードされており、HTTPヘッダー、クエリパラメータ、リクエストボディで送信可能なコンパクトでURLセーフな文字列を形成します。
パート1: ヘッダー
{
"alg": "RS256",
"typ": "JWT",
"kid": "key-2024-01"
}
ヘッダー(JOSEヘッダーとも呼ばれる)は、トークンの種類と署名アルゴリズムを宣言します。algフィールドは必須で、署名の作成に使用されたアルゴリズム(HS256、RS256、ES256など)を指定します。typフィールドは慣例として「JWT」に設定されます。kid(鍵ID)フィールドは、検証者が鍵セットから正しい鍵を選択するのに役立ちます。ヘッダーはbase64urlエンコードされていますが暗号化されていないため、その内容は誰でも読むことができます。
パート2: ペイロード
{
"sub": "1234567890",
"name": "Jane Doe",
"iat": 1700000000,
"exp": 1700003600,
"roles": ["admin", "editor"]
}
ペイロードにはクレームが含まれます。クレームとは、エンティティ(通常はユーザー)に関する記述と追加のメタデータです。クレームは、登録済み(RFC 7519で定義、sub、exp、issなど)、公開(IANA JSON Web Token Claims registryに登録)、プライベート(発行者と消費者の間で合意されたカスタムクレーム)に分類されます。ヘッダーと同様に、ペイロードはbase64urlエンコードされており、暗号化されていません。パスワードやクレジットカード番号などの機密データをペイロードに保存しないでください。
パート3: 署名
署名は、ヘッダーで指定されたアルゴリズムを使用して、エンコードされたヘッダーとペイロードに対して計算されます。HS256の場合: HMAC-SHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)。署名により、ヘッダーとペイロードが改ざんされていないことが保証されます。ヘッダーまたはペイロードの1文字でも変更すると、署名が無効になります。
完全なトークン:
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.signature
このコンパクトな形式が、JWTがHTTP認証で人気がある理由です。Authorizationヘッダーに収まり、独自の整合性証明を持ち運びます。
ユースケース
開発者がAPI認証の問題をデバッグする際に、JWTをデコーダーに貼り付けてヘッダーのアルゴリズム、ペイロードのクレーム、署名構造を検査します。