JWT 암호화
JWT 암호화 (JWE, RFC 7516)
JWE(JSON Web Encryption)는 JSON 기반 데이터 구조의 콘텐츠를 암호화해서 기밀성(confidentiality)을 보장하는 표준이에요. JWS가 '서명(무결성)'이라면 JWE는 '암호화(기밀성)'에 초점을 맞춰요. 토큰을 외부에 노출시켜도 내용을 읽을 수 없게 하고 싶을 때 써요.
JWE는 JOSE 헤더, 암호화된 키(Encrypted Key), 초기화 벡터(IV), 암호문(Ciphertext), 인증 태그(Authentication Tag) 다섯 부분으로 구성돼요. alg와 enc라는 두 개의 중요한 알고리즘 파라미터를 사용해요.
JWE 구조
첫 번째, JWE는 평문 페이로드를 직접 보내지 않고 암호화해요. 구조는 아래와 같아요.
protected header—alg와enc를 포함하는 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-SHA2A128GCM,A192GCM,A256GCM— AES-GCM
처리 순서
생성 과정은 대략 이렇게 진행돼요.
- 무작위 콘텐츠 암호화 키(CEK)를 생성해요.
alg가 지정한 키 관리 알고리즘으로 CEK를 암호화해 Encrypted Key를 만들어요.enc가 지정한 대칭 알고리즘으로 IV와 함께 페이로드를 암호화해 Ciphertext를 만들어요.- 인증 태그를 계산해서 헤더·암호문과 함께 연결해요.
복호화는 역순으로, 인증 태그 검증 후 CEK를 복구하고 페이로드를 복호화해요.
사용 시점
- 토큰 내용이 민감해서 서명만으로 부족할 때(예: 개인정보, 결제 정보)
- 제3자가 페이로드를 읽지 못하게 해야 할 때
- JWS는 부인 방지·무결성만, JWE는 기밀성까지 필요할 때
보통 실무에서는 JWS로 '읽을 수는 있지만 위조 불가'한 토큰을 많이 쓰고, 진짜 비밀 값은 JWE로 감쌉니다.