JWT 암호화

JWT 암호화 (JWE, RFC 7516)

JWE(JSON Web Encryption)는 JSON 기반 데이터 구조의 콘텐츠를 암호화해서 기밀성(confidentiality)을 보장하는 표준이에요. JWS가 '서명(무결성)'이라면 JWE는 '암호화(기밀성)'에 초점을 맞춰요. 토큰을 외부에 노출시켜도 내용을 읽을 수 없게 하고 싶을 때 써요.

JWE는 JOSE 헤더, 암호화된 키(Encrypted Key), 초기화 벡터(IV), 암호문(Ciphertext), 인증 태그(Authentication Tag) 다섯 부분으로 구성돼요. algenc라는 두 개의 중요한 알고리즘 파라미터를 사용해요.

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

JWE 구조

첫 번째, JWE는 평문 페이로드를 직접 보내지 않고 암호화해요. 구조는 아래와 같아요.

  • protected headeralgenc를 포함하는 JOSE 헤더예요.
  • encrypted key — 콘텐츠 암호화 키(CEK)를 alg가 지정한 키 관리 알고리즘으로 암호화한 결과예요.
  • initialization vector — 암호화에 쓰이는 IV예요.
  • ciphertext — CEK로 암호화된 실제 페이로드예요.
  • authentication tag — 인증 태그로, 암호문이 변조되지 않았는지 확인하는 데 써요.

두 가지 알고리즘 파라미터

JWS와 달리 JWE는 두 개의 알고리즘을 따로 지정해요.

  • alg (Key Management Algorithm) — 콘텐츠 암호화 키를 어떻게 관리(래핑/교환)할지 정의해요.
    • RSA-OAEP, RSA1_5 — RSA 키 교환
    • dir — 직접 대칭 키 사용(CEK가 그대로 KEK 역할)
    • ECDH-ES, ECDH-ES+A128KW 등 — ECDH 기반 키 합의
  • enc (Content Encryption Algorithm) — 실제 콘텐츠를 암호화하는 대칭 알고리즘을 정의해요.
    • A128CBC-HS256, A192CBC-HS384, A256CBC-HS512 — AES-CBC with HMAC-SHA2
    • A128GCM, A192GCM, A256GCM — AES-GCM

처리 순서

생성 과정은 대략 이렇게 진행돼요.

  1. 무작위 콘텐츠 암호화 키(CEK)를 생성해요.
  2. alg가 지정한 키 관리 알고리즘으로 CEK를 암호화해 Encrypted Key를 만들어요.
  3. enc가 지정한 대칭 알고리즘으로 IV와 함께 페이로드를 암호화해 Ciphertext를 만들어요.
  4. 인증 태그를 계산해서 헤더·암호문과 함께 연결해요.

복호화는 역순으로, 인증 태그 검증 후 CEK를 복구하고 페이로드를 복호화해요.

사용 시점

  • 토큰 내용이 민감해서 서명만으로 부족할 때(예: 개인정보, 결제 정보)
  • 제3자가 페이로드를 읽지 못하게 해야 할 때
  • JWS는 부인 방지·무결성만, JWE는 기밀성까지 필요할 때

보통 실무에서는 JWS로 '읽을 수는 있지만 위조 불가'한 토큰을 많이 쓰고, 진짜 비밀 값은 JWE로 감쌉니다.

더 알아보기