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 の配列であり、それぞれが異なるキーを表しています。