JWT는 Json Web Token으로, Json 객체에 인증에 필요한 정보를 담아 비밀/공개/개인 키로 서명한 토큰이다.
JWT는 세 부분으로 구성된다.
HEADER.PAYLOAD.SIGNATURE
헤더는 토큰의 타입과 서명 알고리즘의 정보를 표시한다.
{
"alg": "HS256",
"typ": "JWT"
}
토큰에 포함된 청구(claim) 정보를 담고 있다. 이는 사용자 정보나 토큰의 유효 기간 등을 포함할 수 있다.
{
"iss": "https://auth.example.com",
"sub": "1234567890",
"aud": "https://api.example.com",
"exp": 1622563200,
"iat": 1622556000,
"jti": "e9bc097a-7b4b-4b8b-87e2-543b43f7a0f9",
}
자주 사용되는 claim들을 넣은 페이로드이다.
가장 흔하게 사용되는 claim이지만 모두 다 넣지 않아도 상관없다.
토큰의 무결성을 검증하기 위해 사용된다.
헤더와 페이로드를 인코딩한 후 비밀 키와 함께 서명 알고리즘을 적용하여 생성된다.
서명의 생성 과정은 다음과 같다.
헤더와 페이로드 인코딩(각각 Base64Url로 인코딩)
서명 생성
서명 추가 : 생성된 서명을 JWT의 마지막 부분에 추가하여 최종 토큰을 완성한다.
header.payload.signature
서명 검증 과정은 다음을 따른다.
헤더와 페이로드 디코딩
서명 재생성 : 디코딩된 헤더와 페이로드를 통해 서명을 재생성한다.
서명 비교
JWT의 서명을 사용할 때에는 exp 클레임을 통해 토큰의 유효 기간을 설정하고, 만료된 토큰은 사용되지 않도록 하는 것이 안전하다.
만약 사용자가 인증이 필요한 리소스에 접근하게 된다면 클라이언트는 저장된 JWT를 헤더에 담아 서버에 보낸다.
GET /api
Authorization: Bearer "JWT토큰"
JWT는 데이터의 무결성을 보장할 수 있기 때문에, 서버 간 정보를 안전하게 교환할 수 있다.