
JWT 는 JSON 객체를 사용해서 토큰 자체에 정보들을 저장하고 있는 Web Token 이다.
JSON Web Token 의 약어로, 사용자의 정보를 JSON 객체로 안전하게 전송하기 위한 독립적인 방법을 정의한 개방형 표준이다. JWT 는 디지털 서명이 되어 신뢰할 수 있다. 이때 HMAC 또는 RSA, ECDSA 를 사용하는 공개/개인 키 쌍을 사용하여 서명할 수 있다.
1. 인증이 필요할 때
사용자가 로그인을 하면 이때 JWT 가 포함되어 해당 토큰으로 허용되는 경로나 서비스 및 리소스에 액세스할 수 있는 정보가 포함된다. SSO(Single Sign On) 은 작은 오버헤드와 다른 도메인에서 쉽게 사용할 수 있기 때문에 JWT 를 사용하는 것이 좋다.
2. 정보를 교환할 때
공개/개인 키 쌍을 사용하여 JWT 에 서명할 수 있기 때문에 당사자 간에 정보를 안전하게 전송할 수 있다. 또한, 서명은 헤더와 페이로드를 사용하여 저장되기 때문에 변조되지 않았는지 확인할 수도 있다.
JWT 는 Header / Payload / Signature 3개의 부분으로 구성되어 있다. 이때 3개의 부분은 점(. ) 으로 구분된다.
ex) xxxxx.yyyyy.zzzzz → Header.Payload.Signature
Header 는 Signature 를 해싱하기 위한 정보를 담고 있다.
{
"alg": "HS256", //서명 알고리즘
"typ": "JWT" //토큰의 타입
}※ 보통 JWT 의 크기를 줄이기 위해 자주 사용되는 필드들은 세 글자로 표현한다.
Payload 는 서버와 클라이언트가 주고받는, 시스템에서 실제로 사용될 정보를 담고 있다.
→ 헤더와 페이로드를 base64Url 로 인코딩하여 저장한다.
Signature 는 토큰의 유효성을 검증하기 위한 문자열이다.
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret
)만약, JWT 를 생성 또는 확인하고 싶다면 jwt.io 를 사용하면 된다.

사용자가 성공적으로 로그인을 하면 JWT 이 반환된다. 이때 보안상 토큰을 오랫동안 보관하면 안된다. 또한 브라우저 저장소에 세션 데이터를 저장해서도 안된다.
따라서 사용자가 보호된 경로나 리소스에 액세스하고자 할 때마다, 일반적으로 Bearer 스키마를 헤더에 담아 보내야 한다. 이때 헤더의 내용은 다음과 같아야 한다.
Authorization: Bearer <token>
서버는 헤더에서 유효한 토큰이 담겼는지 확인하고 접근을 허용한다. 토큰에 필요한 데이터가 포함되어 있다면, 특정 작업에 대한 DB 쿼리가 줄어들 수 있다. (그렇다고 항상 그런 것은 아니다.)
아래는 JWT 를 이용한 API 또는 리소스 접근 과정에 대한 다이어그램이다.

JSON 은 XML 보다 덜 장황하기도 하고 무엇보다 인코딩될 때 크기도 작아서 JWT 를 HTML 과 HTTP 환경에서 유연하게 사용할 수 있다.
사용 측면에서, JWT 는 인터넷 규모로 사용된다. 즉, 여러 플랫폼, 특히 모바일에서 JWT 의 클라이언트 측 처리가 용이하다.
보안 측면에서, SWT(Simple Web Token) 는 HAMC 알고리즘을 사용하여 공유 비밀로만 대칭적으로 서명할 수 있다. 하지만 JWT 는 SAML(Security Assertion Markup Language) 토큰은 X.509 인증서 형식의 공개/개인 키 쌍을 사용하여 서명할 수 있어 간소하다.

보다시피 인코딩된 JWT 와 인코딩된 SMAL 의 길이를 비교할 때 확연히 JWT 가 간소함을 알 수 있다.