JOSE・JWT標準徹底解説:RFC 7515から7519まで
モダンなWeb認証を実装したことがあるなら、JSON Web Token (JWT) を使用したことがあるでしょう。しかし、JWTは JOSE (JSON Object Signing and Encryption) と呼ばれるより大きな標準ファミリーの1つの要素に過ぎません。これらの標準間の関係を理解することは、セキュアなアプリケーションを構築するために不可欠です。
このガイドでは、JOSEスタックを構成する5つのコアRFCについて解説します。
- RFC 7515: JWS (JSON Web Signature)
- RFC 7516: JWE (JSON Web Encryption)
- RFC 7517: JWK (JSON Web Key)
- RFC 7518: JWA (JSON Web Algorithms)
- RFC 7519: JWT (JSON Web Token)
1. RFC 7515: JSON Web Signature (JWS)
JWSは、JWTの最も一般的な形式です。トークンの内容が改ざんされていないことを保証します。完全性と真正性を提供しますが、機密性は提供しません(内容はトークンを見た誰にでも見えます)。
構造:
JWSは通常、ドットで区切られた3つの部分からなる Compact Serialization 形式で表現されます。
BASE64URL(Header) . BASE64URL(Payload) . BASE64URL(Signature)
- Header: 署名に使用されるアルゴリズムを指定します(例:
{"alg": "HS256"})。 - Payload: 実際に署名されるデータ。
- Signature: ヘッダーとペイロードを署名した結果。
2. RFC 7516: JSON Web Encryption (JWE)
JWSが完全性を提供するのに対し、JWEは機密性を提供します。ペイロードを暗号化し、意図した受信者だけが読み取れるようにします。
構造:
JWE Compact Serializationには5つの部分があります。
BASE64URL(Header) . BASE64URL(Encrypted Key) . BASE64URL(Initialization Vector) . BASE64URL(Ciphertext) . BASE64URL(Authentication Tag)
JWEは、トークンにPII(個人を特定できる情報)などの機密情報が含まれており、クライアントや中間プロキシに見せてはいけない場合によく使用されます。
3. RFC 7517: JSON Web Key (JWK)
JWKは、暗号鍵を表現するJSONデータ構造です。サーバー間で公開鍵を標準化された方法で共有するために使用されます。
例:
{
"kty": "RSA",
"use": "sig",
"kid": "1b94c",
"n": "vXl...",
"e": "AQAB"
}
JWKの集合は JWKS (JSON Web Key Set) と呼ばれ、通常 /.well-known/jwks.json のようなエンドポイントに配置されます。
4. RFC 7518: JSON Web Algorithms (JWA)
JWAはJOSEスタックの「辞書」です。署名 (JWS) や暗号化 (JWE) に使用される特定のアルゴリズムを定義します。
一般的なアルゴリズム:
- HS256: SHA-256を使用したHMAC(共通鍵)。
- RS256: SHA-256を使用したRSASSA-PKCS1-v1_5(公開鍵)。
- ES256: P-256とSHA-256を使用したECDSA(公開鍵)。
- A128GCM: 128ビット鍵を使用したAES GCM(暗号化)。
5. RFC 7519: JSON Web Token (JWT)
JWTは、ペイロードが Claims (クレーム) の集合であるJWSまたはJWEの応用です。クレームは、エンティティ(通常はユーザー)に関する情報の一部です。
標準的なクレーム:
iss: 発行者 (Issuer)sub: 主体 (Subject、通常はユーザーID)aud: 対象者 (Audience)exp: 有効期限 (Expiration Time)iat: 発行時刻 (Issued At)
比較まとめ
| 標準 | 目的 | 例え |
|---|---|---|
| JWS | 完全性 | 署名された手紙 |
| JWE | 機密性 | 暗号化された封筒 |
| JWK | 鍵の表現 | 公開鍵ファイル |
| JWA | アルゴリズム目録 | 暗号リスト |
| JWT | データ形式 | トークンそのもの |
よくある質問 FAQ
Q: JWTは常にJWSですか? A: 常にではありませんが、99%のケースでそうです。JWTはJWS(署名済み)、JWE(暗号化済み)、あるいは署名なしのJWTである可能性があります。
Q: RS256とHS256のどちらを使うべきですか? A: 一般的には RS256(公開鍵)が推奨されます。クライアントが署名の検証に秘密鍵を必要としないためです。HS256(共通鍵)の方が高速ですが、秘密鍵の共有が必要です。
Q: JWTの中身はどこで確認できますか? A: JWSのペイロードはBase64エンコードされているだけなので、簡単にデコードできます。ただし、署名を検証するまではデータを信頼しないでください。
関連ツール
- JWT デコーダー - JWS/JWTトークンを即座にデコードして検査。
- ハッシュジェネレーター - 手動検証用のハッシュを生成。
- パスワードジェネレーター - HS256署名用のセキュアなシークレットを作成。