JSON Web Token(JWT)은 당사자 사이에 전달할 정보를 클레임 형태로 담는 토큰 형식이다. JSON 기반 내용을 서명 또는 암호화 형식으로 표현할 수 있다. 흔히 보는 점(.)으로 구분된 세 구획의 서명된 토큰은 내용을 숨기는 암호화와 다르다. JWT 명세
토큰 안에 담는 정보
서명된 압축 표현은 헤더, 페이로드, 서명으로 구성된다. 페이로드에는 누가 발급했는지, 누구를 대상으로 하는지, 언제까지 유효한지 같은 클레임을 담을 수 있다. 구체적으로 어떤 클레임이 필수인지는 사용 프로토콜과 서비스 계약에 따라 정해진다.
| 클레임 | 일반적인 의미 |
|---|---|
| iss | 발급자 |
| sub | 대상 주체 |
| aud | 토큰을 사용할 수신자 |
| exp | 만료 시각 |
예를 들어 OIDC의 ID 토큰은 사용자 인증 결과를 표현한다. 다른 목적의 JWT를 로그인 결과로 받아들이지 않도록 토큰 종류와 사용 대상을 구분해야 한다.
디코딩과 검증
Base64url 디코딩으로 내용을 읽었다고 그 정보가 신뢰되는 것은 아니다. 서버가 허용한 알고리즘과 키로 서명을 검증하고, 발급자·대상·유효 기간 등 맥락에 맞는 조건을 검사해야 한다. 요청자가 지정한 알고리즘을 무조건 신뢰하거나 서로 다른 용도의 검증 규칙을 섞지 않는다. JWT 보안 권고
운영에서 남는 문제
서명된 토큰에는 비밀번호나 공개되면 안 되는 개인정보를 편리하다는 이유로 넣지 않는다. 전송에는 HTTPS를 사용하고 로그에서도 값이 노출되지 않게 한다. 짧은 만료 시간, 키 교체, 로그아웃과 권한 회수 정책도 함께 설계해야 한다.
JWT를 사용한다고 모든 세션 상태를 없앨 수 있는 것은 아니다. 즉시 차단이나 토큰 폐기 요구가 있다면 별도의 상태 조회가 필요할 수 있다. 형식 선택은 서비스가 요구하는 만료·회수·확장 방식과 함께 판단한다.