Logo Logo
GitHub Designed by Logto

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")를 나타냅니다. xy 속성은 공개 키 좌표를 포함합니다.

여기 또 다른 규범적인 예시가 아닌 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의 배열입니다.

참고