→ “이 토큰은 서버가 발급했고 위조되지 않았다”
기존에는 서버는 클라이언트의 접속 상태정보를 세션이라는 이름으로 저장해두고, 클라이언트의 요청시 서버는 세션을 조회 해야했다.
하지만 JWT는 사용자 정보를 토큰 본문에 담기 때문에 서버는 상태를 저장하지 않고 토큰만 검증하면 된다.
이는 서버의 부담을 줄여주며 확장성이 높다.
원래 방식은 서버가 클러스터로 묶이는 등 이중화가 되면 각 서버에 세션 정보를 공유해야하는데, JWT는 상태 정보를 저장하지 않아도 되기 때문에 단순히 서버가 같은 secret키만 가지고있으면 되므로 서버 확장성이 높다.
Header.Payload.Signature
# 디코딩 시 아래와 같음
{
"alg": "HS256",
"typ": "JWT"
}
{
"sub": "123",
"name": "Alice",
"iat": 1516239022,
"role" : "admin" # 커스텀 값
}
HMACSHA256(Base64Url(header) + "." + Base64Url(payload), secret) 를 사용하여 생성.
GET /api/user HTTP/1.1
Host: example.com
Authorization: Bearer <JWT> # 이렇게 JWT를 담아서 전달
Authorization헤더는 HTTP표준에서 인증정보를 넣는 헤더이다. JWT토큰등의 로그인 토큰 뿐만 아니라 , API키, OAuth토큰등을 넣을 수 있다.
# python (requests사용)
headers = {
"Authorization": f"Bearer {token}"
}
requests.get(url, headers=headers)