Curious TechieDev Toolbox
すべてのガイド/認証 & セキュリティ8 min read

JWT(JSON Web Token)の構造と安全な認証設計 (RFC 7519)

ステートレス認証、ヘッダー/ペイロード/署名の3分割構造、Base64URL、alg:none攻撃と検証の要点を解説。

重要ポイント (要約)
  • JWTはドットで区切られた3つの要素(ヘッダーペイロード署名)で構成されます。
  • データは単にBase64URLでエンコードされているだけであり、秘密鍵なしで誰でも中身を閲覧できます。
  • デコードと検証は異なります。真正性の確認には秘密鍵を用いた署名の再計算が必須です。
  • 重大な脆弱性である alg: "none" 攻撃を防ぐため、未署名トークンの受け入れを拒否する必要があります。
  • ステートレスな特性上、即座の失効処理にはブラックリストや短い有効期限(exp)の設計が必要です。

最新のステートレスなマイクロサービスやOAuth 2.0 / OpenID Connect認証基盤において、JSON Web Token (JWT) はクライアントとリソースサーバー間で認証クレーム(本人証明情報)を安全に伝送するための業界標準仕様(RFC 7519)です。

1. 3つの構成要素(トークンの基本構造)

JWT文字列は、ピリオド(.)で区切られた3つのBase64URLエンコード文字列で構成されています:

1. ヘッダー (赤色)署名アルゴリズム & 種別
2. ペイロード (紫色)クレーム & ユーザー属性データ
3. デジタル署名 (青色)改ざん防止用 暗号学的検証値

2. 標準登録クレーム(iss、exp、sub、iat)

  • iss (Issuer / 発行者): トークンを発行した認証サーバーの識別子。
  • sub (Subject / 主体): 認証されたユーザーIDまたはプリンシパルの一意識別子。
  • exp (Expiration Time / 有効期限): トークンを失効させるUnixエポック秒(再送攻撃の防止)。
  • iat (Issued At / 発行日時): トークンが生成された日時のタイムスタンプ。

3. 共通鍵署名(HS256)と公開鍵署名(RS256)の比較

HS256 (HMAC-SHA256) は発行者と検証者の双方が同一の秘密共通鍵を共有します。一方、RS256 (RSA-SHA256) は発行側が秘密鍵で署名し、検証側は公開鍵(JWKS)を用いて検証するため、署名権限を漏洩させることなく第三者サービスでのトークン検証が可能になります。

4. 重大なセキュリティ上の落とし穴と脆弱性対策

よくある脆弱性として、ヘッダーの "alg": "none" を不正に許容してしまうアルゴリズム混乱攻撃、XSS攻撃に無防備な localStorage への機密トークン保存、および署名検証をスキップしてペイロードを信頼してしまう実装上の不備が挙げられます。