JOSE 한눈에 보기: JWT를 떠받치는 표준 가족
JWT는 익숙한데 JWS, JWE, JWK, JWA까지 줄줄이 나오면 갑자기 머리가 복잡해지는데요.
이름도 비슷하고 죄다 eyJ로 시작하는 긴 문자열을 다루는 것 같은데, 도대체 뭐가 뭔지 경계가 흐릿합니다. 🤔
사실 이 다섯은 JOSE라는 한 가족입니다. 서로 다른 일을 맡은 형제들이 모여 “JSON으로 데이터를 안전하게 주고받는다”는 하나의 목표를 이루는 구조죠. 이 글은 JOSE 가족의 큰 그림을 그리고, 각 멤버가 무슨 역할을 하며 어떻게 맞물리는지, 그리고 더 깊이 알고 싶을 때 어느 글로 가면 되는지를 안내하는 지도 역할을 합니다.
JOSE란 무엇일까요?
JOSE는 JavaScript Object Signing and Encryption의 약자로, JSON 기반으로 데이터에 서명하고 암호화하는 방법을 정한 IETF 표준 묶음입니다.
왜 이런 표준이 필요했을까요? 웹에서는 서버와 클라이언트, 또는 서비스끼리 정보를 주고받을 일이 끊임없이 생기는데요. 그 정보가 중간에 위조되지 않았는지, 정말 믿을 만한 곳에서 왔는지, 또 정해진 상대만 볼 수 있는지를 보장할 방법이 필요했습니다. JOSE는 이걸 JSON이라는 친숙한 형식 위에서, URL이나 HTTP 헤더에 그대로 실어 보낼 수 있는 형태로 표준화했습니다.
흥미로운 점은 JOSE가 하나의 거대한 스펙이 아니라 역할별로 쪼개진 여러 RFC의 집합이라는 것입니다. 그래서 각각을 따로 이해한 뒤 조합하면 전체가 보입니다.
가족 구성원
JOSE 가족은 다음 다섯으로 이루어집니다.
| 멤버 | RFC | 역할 |
|---|---|---|
| JWS | RFC 7515 | 데이터에 서명해 위변조를 막음 |
| JWE | RFC 7516 | 데이터를 암호화해 내용을 숨김 |
| JWK | RFC 7517 | 키를 JSON으로 표현하는 형식 |
| JWA | RFC 7518 | 위에서 쓰는 알고리즘의 이름과 규약 |
| JWT | RFC 7519 | 이들을 조합해 만든 토큰 |
여기서 한 가지 관계가 보이는데요. JWS와 JWE가 “그릇”이라면, JWA는 그 그릇이 쓰는 알고리즘을 공급하고, JWK는 거기에 들어가는 키를 표현하며, JWT는 이 모든 걸 조합한 응용입니다. JWS·JWE·JWK·JWA가 부품이라면 JWT는 완성품인 셈이죠.
어떻게 맞물릴까요?
추상적으로 들리니 JWT를 검증하는 한 장면으로 풀어 보겠습니다. 어떤 서버가 들어온 JWT access token을 검증한다고 해볼게요.
우선 토큰은 JWS 구조(헤더.페이로드.서명)로 되어 있습니다. JWT는 페이로드에 사용자 claim을 담은 JWS니까요.
서버는 헤더의 alg를 보고 어떤 서명 알고리즘으로 검증해야 하는지 압니다. 이 alg 값의 의미를 정의하는 게 JWA고요.
그리고 헤더의 kid로 어떤 키를 써야 하는지 찾는데, 그 공개 키는 JWKS 문서에 JWK 형식으로 담겨 있습니다.
즉 JWT 하나를 검증하는 데 JWS(구조)·JWA(알고리즘)·JWK(키)가 한꺼번에 동원됩니다. 이름이 비슷해 헷갈렸던 것들이, 사실은 한 작업의 서로 다른 부분을 맡고 있었던 거죠. 내용을 숨겨야 하는 경우라면 여기에 JWE가 더해집니다.
어디서부터 읽으면 좋을까요?
JOSE 가족은 한 번에 다 외우기보다 필요한 순서대로 익히는 게 좋습니다. 목적에 따라 이렇게 따라가 보세요.
처음이라면 가장 널리 쓰이는 JWT(JSON Web Token)로 시작해 토큰의 기본 개념과 구조를 잡는 것을 추천합니다. 그다음 토큰의 서명이 내부에서 어떻게 동작하는지 궁금해지면 JWS로 이해하는 JSON 데이터 서명으로 한 단계 깊이 들어가고, 서명 알고리즘을 골라야 한다면 HS256 vs RS256 vs ES256 비교를 참고하면 됩니다. 공개 키를 어떻게 배포하고 교체하는지는 JWK와 JWKS 이해하기에서, 내용을 암호화해야 한다면 JWE로 JSON 데이터 암호화하기에서 다룹니다.
마치며
지금까지 JOSE가 JSON으로 데이터를 안전하게 다루기 위한 표준 가족이라는 점, 그리고 JWS·JWE·JWK·JWA·JWT가 각자 어떤 역할을 맡고 어떻게 맞물리는지를 큰 그림으로 살펴봤습니다. 핵심은 이 다섯이 경쟁하는 별개의 기술이 아니라, 한 작업을 나눠 맡은 형제들이라는 것입니다. JWS·JWE는 그릇, JWA는 알고리즘, JWK는 키, JWT는 그 조합이라는 관계만 기억하면 어떤 약어를 만나도 제자리에 놓을 수 있습니다.
각 주제의 깊은 내용은 위에 링크한 글들에서 이어가시고, 표준 묶음의 출발점인 서명 명세는 RFC 7515 - JSON Web Signature부터 살펴보면 좋습니다.
This work is licensed under
CC BY 4.0