Logo Logo
GitHub Designed by Logto

JSON Web Key (JWK) とは?

JSON Web Key (JWK) は暗号キーを表現するために使用される JSON ベースのフォーマットです。 JSON Web Signature (JWS) や JSON Web Encryption (JWE) の文脈で、 JSON Web Tokens (JWT) の安全性と機密性を確認するために広く使用されています。また、 OpenID Connect (OIDC) におけるアイデンティティおよびアクセス管理にも使用されます。

例えば、PEM エンコードされた ECDSA 公開鍵は次のように表現されます。

-----BEGIN PUBLIC KEY-----
MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEF/xQdbOho2Jw0hgmNPD0VAEPAgkQrfD4
f1Qx3y49cUm646fMBX9DYx+43HzXm6VdX77uFymz90aO4dBunpTdUzLFRAiT7+In
gzZGDrIE+FG6CcqQuRP65r65SUzDOmP5
-----END PUBLIC KEY-----

…は JWK として次のように表現できます。

{
  "kty": "EC",
  "crv": "P-384",
  "x": "F_xQdbOho2Jw0hgmNPD0VAEPAgkQrfD4f1Qx3y49cUm646fMBX9DYx-43HzXm6Vd",
  "y": "X77uFymz90aO4dBunpTdUzLFRAiT7-IngzZGDrIE-FG6CcqQuRP65r65SUzDOmP5"
}

JWK はどのように機能しますか?

JWK は JSON ベースのフォーマットであるため、PEM のような従来のフォーマットと比較して、キーに関する豊富なメタデータを含めることができます。JWK の一般的な属性を以下に示します:

  • kty (Key Type): キーと共に使用される暗号アルゴリズムファミリ。一般的な値には RSA、EC、および oct が含まれます。 RFC 7518 では、EC が「推奨+」とされています。
  • use (Public Key Use): 公開鍵の意図された使用。一般的な値には sig (署名) や enc (暗号化) が含まれます。
  • key_ops (Key Operations): キーによってサポートされる操作。一般的な値には sign、verify、encrypt、および decrypt が含まれます。
  • alg (Algorithm): キーと共に使用するためのアルゴリズム。キーのタイプに応じてアルゴリズムは異なります。例えば、RSA キーには RS256 が、EC キーには ES256 が使用されます。
  • kid (Key ID): キーの一意の識別子。特定のキーをキーの集合の中で一致させるために使用されます。

kty を除く他の属性はオプションであり、キーに関する追加のコンテキストを提供するために使用できます。kty の値に応じて、他の属性が必須またはオプションとなる場合があります。上記の例では、JWK は P-384 (crv: "P-384") 曲線を持つ ECDSA キー (kty: "EC") を表しています。x と y 属性には公開鍵座標が含まれています。

もう一つの標準ではない RSA 公開鍵 JWK の例を示します。

{
  "kty": "RSA",
  "use": "sig",
  "alg": "RS256",
  "n": "0vx7agoebGcQSuuPiLJXZpt...-TmV4HCA1T8jXg3fE2VbA",
  "e": "AQAB",
  "kid": "2011-04-29-1234"
}

JWK 属性とその意味についての詳細な情報は、 RFC 7517 を参照してください。

JSON Web Key Set (JWKS)

複数の JWK をまとめる必要がある場合、JSON Web Key Set (JWKS) として整理されます。JWKS は JWK の配列を含む JSON オブジェクトです。これは、 OpenID Connect (OIDC) ディスカバリー (Discovery) の jwks_uri エンドポイントのレスポンスで、JWT 署名キー (Signing key) の検証のための公開鍵を提供する際に一般的に使用されます。

2 つの JWK を含む JWKS の非標準的な例を示します。

{
  "keys": [
    {
      "kty": "RSA",
      "use": "sig",
      "alg": "RS256",
      "n": "0vx7agoebGcQSuuPiLJXZpt...-TmV4HCA1T8jXg3fE2VbA",
      "e": "AQAB",
      "kid": "2011-04-29-1234"
    },
    {
      "kty": "EC",
      "crv": "P-384",
      "x": "F_xQdbOho2Jw0hgmNPD0VAEPAgkQrfD4f1Qx3y49cUm646fMBX9DYx-43HzXm6Vd",
      "y": "X77uFymz90aO4dBunpTdUzLFRAiT7-IngzZGDrIE-FG6CcqQuRP65r65SUzDOmP5"
    }
  ]
}

この例では、JWKS は 1 つの RSA キーと 1 つの EC キーを含んでいます。keys 属性は JWK の配列であり、それぞれが異なるキーを表しています。

関連項目