Skip to content

RFC 7517 - JSON Web Key (JWK)

概要

RFC 7517は、JSON Web Key(JWK) を定義する標準仕様である。JWKは暗号鍵をJSONオブジェクトとして表現するためのデータ構造で、公開鍵・秘密鍵・対称鍵のいずれも表現できる。

JWKはJOSE(JSON Object Signing and Encryption) フレームワークの鍵表現層として機能し、JWS・JWEで使用する鍵の標準的な配布・管理方法を提供する。

複数のJWKをまとめたJWK Set(JWKS) は、OpenID Connectのディスカバリメタデータで広く使われており、署名検証用公開鍵の動的な取得・ローテーションを可能にする。

解決する課題

JWK策定以前、暗号鍵の交換にはX.509証明書(PEM/DER形式)やPKCS#8といった形式が使用されていた。これらには以下の課題があった:

  • 複雑な解析: ASN.1/DERベースのフォーマットはJSONを前提とするWebエコシステムと相性が悪い
  • メタデータの欠如: 鍵の用途や識別子を標準的に付与する仕組みがない
  • 複数鍵の管理: 複数の公開鍵をひとつのドキュメントで表現する標準的な方法がない

JWKはJSONネイティブな鍵表現を提供し、Web APIでの鍵配布を簡素化する。

主要概念・用語

用語説明
JWKJSON Web Key。単一の暗号鍵を表すJSONオブジェクト
JWK Set複数のJWKを含むJSONオブジェクト(keys配列を持つ)
ktyKey Type。鍵の種類を示す(RSA, EC, oct 等)
usePublic Key Use。鍵の用途(sig=署名, enc=暗号化)
key_opsKey Operations。鍵の操作(sign, verify, encrypt 等)
kidKey ID。鍵を識別するための任意の文字列
JWKS URIJWK Setを公開するURL(OpenID Connectで広く使用)

JWKの構造

共通パラメータ

すべての鍵タイプに適用可能なパラメータ:

パラメータ必須/任意説明
kty必須鍵タイプ(RSA, EC, oct
use任意用途(sig, enc)。key_opsと同時使用は非推奨
key_ops任意許可する操作の配列
alg任意この鍵で使用するアルゴリズム(例: RS256
kid任意鍵識別子。JWSのkidヘッダーと照合して鍵を選択する
x5u任意X.509証明書またはチェーンのURL
x5c任意X.509証明書チェーン(Base64エンコード)
x5t任意X.509証明書のSHA-1フィンガープリント
x5t#S256任意X.509証明書のSHA-256フィンガープリント

RSA鍵

json
{
  "kty": "RSA",
  "use": "sig",
  "kid": "my-rsa-key-1",
  "alg": "RS256",
  "n": "0vx7agoebGcQSuuPiLJXZptN9nndrQmbXEps2aiAFbWhM78LhWx...",
  "e": "AQAB",
  "d": "X4cTteJY_gn4FYPsXB8rdXix5vwsg1FLN5E3EaG6RJoVH-HLLKD9...",
  "p": "83i-7IvMGXoMXCskv73TKr8637FiO7Z27zv8oj6pbWUQyLPQBQxtPV...",
  "q": "3dfOR9cuYq-0S-mkFLzgItgMEfFzB2q3hWehMuG0oCuqnb3vobLyum...",
  "dp": "G4sPXkc6Ya9y8oJW9_ILj4xuppu0lzi_H7VTkS8xj5SdX3coE0oim...",
  "dq": "s9lAH9fggBsoFR33s8IWSighagAZA4UMwx2lB2CJNgQxTxlZ4Wj3ZW...",
  "qi": "GyM_p6JrXySiz1toFgKbWV-JdI3jT4s9e-4sUCCsrAKobo-nXEjcWA..."
}

RSA鍵のパラメータ(いずれもBase64URL エンコード):

パラメータ説明
nモジュラス(公開鍵)
e公開指数(公開鍵)
d秘密指数(秘密鍵のみ)
p, q素因数(秘密鍵の最適化に使用)
dp, dqCRT指数(秘密鍵の最適化)
qiCRT係数(秘密鍵の最適化)

EC鍵(楕円曲線)

json
{
  "kty": "EC",
  "use": "sig",
  "kid": "my-ec-key-1",
  "alg": "ES256",
  "crv": "P-256",
  "x": "f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU",
  "y": "x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0",
  "d": "jpsQnnGQmL-YBIffH1136cspYG6-0iY7X1fCE9-E9LI"
}

EC鍵のパラメータ:

パラメータ説明
crv曲線名(P-256, P-384, P-521
xX座標(Base64URL)
yY座標(Base64URL)
d秘密スカラー(秘密鍵のみ)

対称鍵(oct)

json
{
  "kty": "oct",
  "use": "sig",
  "kid": "my-hmac-key",
  "alg": "HS256",
  "k": "GawgguFyGrWKav7AX4VKUg"
}
パラメータ説明
k鍵値(Base64URLエンコード)

JWK Set

複数のJWKをひとつのドキュメントにまとめた形式。keysメンバーが必須。

json
{
  "keys": [
    {
      "kty": "RSA",
      "use": "sig",
      "kid": "rsa-sig-2024",
      "alg": "RS256",
      "n": "...",
      "e": "AQAB"
    },
    {
      "kty": "EC",
      "use": "enc",
      "kid": "ec-enc-2024",
      "crv": "P-256",
      "x": "...",
      "y": "..."
    }
  ]
}

JWKS URIを使った鍵配布

OpenID Connectでは認証サーバーが/.well-known/openid-configurationでJWKS URIを公開し、クライアントはそこからID Tokenの検証用公開鍵を動的に取得する。

鍵のライフサイクル管理

鍵ローテーション時は以下の手順が一般的:

  1. 新しい鍵ペアを生成し、新kidを付与
  2. JWKS URIに新鍵を追加(旧鍵も残す)
  3. 新鍵で署名を開始
  4. 旧鍵で発行されたトークンの有効期限が切れるまで旧鍵を保持
  5. 旧鍵をJWKS URIから削除

セキュリティに関する考慮事項

秘密鍵の保護

JWKに秘密鍵パラメータ(d等)を含める場合、その配布は厳重に制限しなければならない。JWKS URIで公開するJWK Setには公開鍵のみを含めること。

JWKS URIのTLS保護

JWKS URIはHTTPSで提供しなければならない。JWKの改ざんはJWS署名の検証を完全に無効化する。

kidの衝突

JWK Set内の異なる鍵には通常、一意のkidを使用すべきである(SHOULD)。ただし、異なるktyを持つ等価な代替鍵については、同じkidを使用できる例外がある。

usekey_opsの一貫性

usekey_opsを同時に指定する場合、両者の意味は一貫していなければならない。たとえばuse: sigkey_ops: ["encrypt"]を同時に指定してはならない。

関連仕様

参考文献