JSON 웹 토큰이란 무엇인가요?
JSON 웹 토큰(JWT)은 RFC 7519에 정의된 간결하고 URL 안전한 토큰 형식으로, 두 당사자 간의 클레임을 디지털 서명된 JSON 객체로 표현하여 무상태 인증과 정보 교환을 가능하게 한다.
다른 이름: JSON Web Token, JWTs
JWT는 점으로 구분된 세 개의 base64url 인코딩 부분으로 구성된다. 헤더(서명 알고리즘 명시), 페이로드(사용자 ID, 역할, 만료 시각 같은 키-값 쌍의 클레임 포함), 그리고 서명(비밀 키나 개인 키로 헤더와 페이로드에 대해 계산)이다. 서명을 통해 검증 키를 가진 모든 당사자는 토큰이 변조되지 않았음을 확인할 수 있다.
JWT는 API 인증에서 베어러 토큰으로 흔히 쓰인다. 로그인 후 서버는 사용자의 신원과 권한을 담은 JWT를 발급한다. 클라이언트는 이 JWT를 이후 요청에 포함하며(보통 Authorization 헤더에), 서버는 데이터베이스나 세션 저장소를 조회할 필요 없이 서명을 검증한다. 이 무상태성 때문에 JWT는 서비스 간 세션 상태 공유가 비현실적인 분산 시스템과 마이크로서비스 아키텍처에 매력적이다.
JWT에는 중요한 보안 고려 사항이 따른다. 페이로드는 암호화가 아니라 단지 base64로 인코딩되므로, JWT를 가로챈 누구나 그 내용을 읽을 수 있다. JWE(JSON Web Encryption)를 쓰지 않는 한 JWT 페이로드에 절대 비밀을 넣지 말라. 토큰은 발급 후 쉽게 해지할 수 없으므로 만료 시간을 짧게 둬야 한다. 공격자가 헤더를 "none"으로 바꾸거나 비대칭에서 대칭 검증으로 전환하는 알고리즘 혼동 공격은 JWT 라이브러리에서 반복적으로 나타난 취약점이었다.
Vaulted가 JSON 웹 토큰을 사용하는 방법
Vaulted는 사용자 계정이 없으므로 인증이나 세션 관리에 JWT를 사용하지 않는다. 그러나 JWT와 기타 베어러 토큰은 안전한 전달이 필요한 흔히 공유되는 자격 증명이다. 예를 들어 사고 대응 중 동료와 장수명 API 토큰이나 서비스 간 JWT 시크릿을 공유하는 경우다. Vaulted는 그런 토큰에 대해 암호화된 자기 파기 전달을 제공하여 통신 채널에 남지 않도록 보장한다.