JWT 키

JWT 키 (JWK, RFC 7517)

JWK(JSON Web Key)는 암호화 키를 JSON 객체로 표현하는 표준이에요. 키 종류는 kty(key type) 파라미터로 구분하고, 알고리즘·용도·키 ID 같은 메타데이터를 함께 담을 수 있어요. JWT 서명·암호화에 쓰는 공개키와 개인키, 대칭 키를 교환할 때 표준 포맷으로 써요.

시스템 간에 키를 주고받을 때 라이브러리마다 제각각인 포맷 대신 JWK를 쓰면 호환성이 좋아져요. 특히 공개키 버전은 JWKS(JSON Web Key Set) 문서로 묶어서 /jwks 같은 엔드포인트로 공개하기도 해요.

출처: https://www.rfc-editor.org/rfc/rfc7517.txt

JWK 구조

JWK는 단일 키 하나를 나타내는 JSON 객체예요.

{
  "kty": "RSA",
  "kid": "key-2026",
  "use": "sig",
  "alg": "RS256",
  "n": "0vx7agoebGcQSuuPiLJXZptN9nndrQmbXEps2aiQBb-H7qzX",
  "e": "AQAB"
}

주요 파라미터는 이래요.

  • kty — 키 유형. RSA, EC, oct(대칭), OKP(Ed25519 등)가 있어요. 필수.
  • use — 키 용도. sig(서명) 또는 enc(암호화).
  • alg — 이 키로 쓸 알고리즘(예: RS256, ES256).
  • kid — 키 ID. 토큰의 헤더에서 참조해서 여러 키 중 알맞은 걸 고를 때 써요.
  • n, e — RSA 공개키의 modulus와 exponent.
  • crv, x, y — 타원곡선 키의 곡선과 점 좌표.
  • koct(대칭) 키의 base64url 인코딩된 비밀 값.

JWK Set (JWKS)

여러 키를 모아서 제공하는 문서가 JWKS예요.

{
  "keys": [
    { "kty": "RSA", "kid": "key-1", "use": "sig", "n": "...", "e": "AQAB" },
    { "kty": "EC", "kid": "key-2", "use": "sig", "crv": "P-256", "x": "...", "y": "..." }
  ]
}

인증 서버나 ID 공급자는 자주 이 JWKS 엔드포인트를 열어두고, 리소스 서버나 클라이언트는 kid로 해당 키를 찾아 JWT 서명을 검증해요.

키 포맷 변환

JWK은 PEM·DER 같은 기존 포맷과 상호 변환이 가능해요. 대부분의 암호화 라이브러리(OpenSSL, Node.js jose, PyJWT+cryptography 등)가 JWK을 지원해서, 기존 인증서 기반 키를 JWKS로 노출하기 쉽도록 도와줘요.

더 알아보기