JSON Web Key (JWK)이란?
JSON Web Key (JWK)은 암호화 키를 표현하기 위해 사용되는 JSON 기반 형식입니다. 이는 JSON 웹 서명 (JSON Web Signature, JWS) 및 JSON 웹 암호화 (JSON Web Encryption, JWE) 의 맥락에서 JSON Web Tokens 의 무결성과 기밀성을 검증하는 데 널리 사용됩니다. 또한 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
입니다.EC
는 RFC 7518 에서 “Recommended+“로 표시되었습니다.use
(Public Key Use): 공개 키의 의도된 사용. 일반적인 값은sig
(서명) 및enc
(암호화)입니다.key_ops
(Key Operations): 키가 지원하는 키 작업. 일반적인 값은sign
,verify
,encrypt
,decrypt
입니다.alg
(Algorithm): 키와 함께 사용될 알고리즘. 키 유형에 따라 알고리즘이 달라질 수 있습니다. 예를 들어,RS256
은 RSA 키와 함께 사용될 수 있으며,ES256
은 EC 키와 함께 사용될 수 있습니다.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 객체입니다. 이는 JWT 서명 키 (Signing key) 검증을 위한 공개 키를 제공하기 위해 OpenID Connect (OIDC) 디스커버리 (Discovery) 의 jwks_uri
엔드포인트 응답에서 일반적으로 사용됩니다.
여기 두 개의 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가 두 개의 JWK, 하나의 RSA 키와 하나의 EC 키를 포함하고 있습니다. keys
속성은 서로 다른 키를 나타내는 JWK의 배열입니다.