토큰은 애플리케이션이 사용자를 인증했음을 증명하며 해당 사용자의 권한을 부여받는 방법의 일종으로 출입카드와 같은 개념이다.
토큰을 이용하면 요청할 떄마다 자격 증명을 공유할 필요가 없다.
토큰의 수명을 짧게 지정할 수 있다.
토큰은 요청에 필요한 세부 정보를 저장할 수 있다.
토큰을 이용하면 인증 책임을 시스템의 다른 구성 요소로 분리할 수 있다.
많은 애플리케이션에서 사용되는 토큰의 구체적인 구현체이다.
헤더.본문.디지털서명와 같은 형식을 가진다. 디지털 서명 부분은 생략이 가능은 하지만 변조되지 않음을 보장하는 중요한 부분이다.
| 명칭 | 형식 | 설명 |
|---|---|---|
| 헤더(Header) | JSON 형식 (Base64URL 인코딩) | - JWT의 타입(typ: JWT)과 서명 알고리즘(alg) 정보를 포함 - 가볍고 간결하게 설계됨 |
| 본문(Payload) | JSON 형식 (Base64URL 인코딩) | - 사용자 데이터(Claim) 포함 - 필수 필드는 없으며, 공개/등록/비공개 Claim으로 구성 - 보안 민감 정보 포함 금지 |
| 디지털 서명(Signature) | 해시 값 (HMAC, RSA, etc.) | - Header와 Payload를 비밀키 또는 비공개 키로 서명 - 변조 방지 기능 제공 |
본문 클레임은 토큰의 주요 정보를 말하며 아래와 같은 유형이 있습니다.
| 유형 | 설명 | |
|---|---|---|
| 등록된 클레임 (Registered Claims) | 사전에 정의된 표준 클레임 예: iss (발급자), exp (만료시간), sub (주제), aud (대상) | |
| 공개 클레임 (Public Claims) | 누구나 정의 가능 (충돌 방지를 위해 네임스페이스 사용 권장) | |
| 비공개 클레임 (Private Claims) | 클라이언트와 서버 간에만 사용되는 클레임 |
JWT를 사용하기 위해서는 해당 의존성이 필요하며 링크를 통해 사용 방법을 숙지하자
implementation group: 'io.jsonwebtoken', name: 'jjwt-api', version: '0.11.5'
runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-impl', version: '0.11.5'
runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-jackson', version: '0.11.5'
implementation group: 'jakarta.xml.bind', name: 'jakarta.xml.bind-api', version: '4.0.2'
implementation group: 'org.glassfish.jaxb', name: 'jaxb-runtime', version: '4.0.5'