ヘッダー
通常 typ(多くは "JWT")と alg(署名アルゴリズム)を含みます。JWKS から公開鍵を選ぶ kid など、スタックが要求するメタデータも載ります。
RFC 7519 · JSON Web Signature
JSON Web Token(JWT)は、クレームをコンパクトで URL 安全な文字列として表すオープン標準(RFC 7519)です。OAuth 2.0 や OpenID Connect で広く使われますが、形式自体は汎用的で、正しい検証材料を持つ者は署名を確認しクレームを解釈できます(鍵と時刻管理の範囲内で)。
本ページでは JWT の組み立て方、各部分の読み方、トーク単体から期待できる保証とできないことを説明します。
コンパクト形式: ドットで区切られた 3 つの Base64URL セグメント。
通常の形(JSON Web Signature, JWS)では、JWT はドットで区切られた 3 セグメント(ヘッダー、ペイロード、署名)です。最初の 2 つは JSON を Base64URL でエンコードしたもの(標準 Base64 ではない)で、パディング省略や URL 安全な文字によりヘッダーやクエリに載せやすくなります。
Base64URL は暗号化ではありません。ヘッダーとペイロードは文字列を持つ者なら誰でも読めます。署名は、署名鍵を制御する者が最初の 2 セグメントを生成したことを示しますが、内容を隠しません。
コンパクトな JWS 形では各セグメントの役割は次のとおりです。
通常 typ(多くは "JWT")と alg(署名アルゴリズム)を含みます。JWKS から公開鍵を選ぶ kid など、スタックが要求するメタデータも載ります。
クレームを含む JSON オブジェクト: 主体、有効期間、オーディエンス、アプリ固有フィールドなど。発行者が定義すればネストも可能です。
"header.payload" のバイト列(2 つのエンコード済みセグメントとその間のドット)に対する暗号値で、ヘッダーのアルゴリズムと共有秘密(HMAC)または非対称秘密鍵(RSA、ECDSA、EdDSA)を用います。
クレームは名前と値のペアです。意味は文脈に依存しますが、RFC 7519 は登録済み名を定め、ライブラリや API が一貫して解釈できるようにしています。
例: iss, sub, aud, exp, nbf, iat, jti。exp と nbf は Unix 時刻です。正しく検証するには検証側に信頼できる時刻が必要です。
IANA の「JSON Web Token Claims」レジストリに登録すると多くの実装間で相互運用しやすくなりますが、意味は当事者が合意するまで慣習にすぎません。
発行者と利用者の間で合意した名前(内部ロールやテナント ID など)。登録名と衝突させないか、両側を完全に制御する場合に限って使ってください。
ヘッダーの alg が署名の計算方法を選びます。モデルを誤ると、誰が検証できるかや秘密の共有方法に影響します。
有効な署名は、署名鍵を制御する者が発行し、ヘッダーとペイロードが改ざんされていないことを示します。それ自体は暗号化ではありません。
パスワード、API キー、長寿命の秘密をペイロードに入れないでください。署名に加えて機密性が必要なら転送は TLS、形式は JWE など別ワークフローを検討します。
サーバーは期待する鍵または JWKS で署名を検証し、exp(通常は nbf も)を確認し、アーキテクチャが依存する場合は aud と iss を強制し、適切なら短命とリフレッシュを使います。
JWT は次のような用途で使われます:
JWT を設計するときの制約の例: