JWTの構造: ヘッダー、ペイロード、署名

JWTの3つの構成要素(ヘッダー、ペイロード、署名)を解説。各パートのエンコード方法、含まれる内容、パート間の関連性を詳しく説明します。

Concept

詳細な説明

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で定義、subexpissなど)、公開(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をデコーダーに貼り付けてヘッダーのアルゴリズム、ペイロードのクレーム、署名構造を検査します。

試してみる — JWT Decoder

フルツールを開く