JWT(JSON Web Token)는 당사자 간 정보를 안전하게 전송하기 위한 개방형 표준(RFC 7519)이다. 이 표준은 정보를 JSON 객체 형태로 인코딩하여 전달한다.
그럼 이런 특징을 가진 JWT가 보통 어디에서 쓰일까?
JWT는 주로 인가 목적으로 사용된다. 그렇다면 인가란 뭘까?
인가(Authorization) : 인증된 사용자가 특정 자원에 접근할 수 있는 권한을 가지고 있는지 확인하는 과정
인증과 인가를 헷갈리기 쉬운데, 인증(Authentication)은 사용자가 자신이 주장하는 사람이 맞는지 확인하는 과정이다.
사용자가 로그인하면 서버는 JWT를 생성하여 반환한다. 이후 사용자는 각 요청에 JWT를 포함시켜 보내며, 서버는 JWT를 검증하여 사용자의 접근을 허용한다.
JWT는 정보 교환에도 사용된다. 당사자 간에 정보를 안전하게 전송할 수 있는 좋은 방법이다. JWT는 서명될 수 있기 때문에 발신자가 자신이 주장하는 사람임을 확신할 수 있다.
세 부분으로 구성되며 점(.)으로 구분된다.
xxxxx.yyyyy.zzzzz
{
"alg": "HS256",
"typ": "JWT"
} JSON은 Base64Url로 인코딩되어 JWT의 첫 번째 부분이 된다.Registered claims(등록된 클레임): 이는 미리 정의된 클레임 집합으로, 필수는 아니지만 여러 시스템에서 공통으로 이해하고 사용되는 정보를 담고 있어 사용이 권장된다. 예를 들어 iss(발행자), exp(만료 시간), sub(주제), aud(대상) 등이 있다.
클레임 이름이 단 세 글자인 이유는 JWT가 간결성을 목표로 하기 때문이다.
Public claims(공개 클레임): JWT를 사용하는 사람들이 자유롭게 정의할 수 있다. 하지만 충돌을 피하기 위해 IANA JSON Web Token Registry에 정의되어 있거나, URI을 사용해 정의해야 한다.
Private claims(비공개 클레임): 이는 당사자들 간에 정보를 공유하기 위해 만든 사용자 지정 클레임으로, '등록된 클레임'이나 '공개 클레임'에 해당하지 않는다.
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
페이로드는 Base64Url로 인코딩되어 JWT의 두 번째 부분이 된다.
💡 서명된 토큰의 경우, 정보가 변조로부터 보호되지만 누구나 읽을 수 있다. 따라서 암호화되지 않은 JWT의 페이로드나 헤더에는 민감한 정보를 넣으면 안된다.HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret
) 서명은 메시지가 도중에 변경되지 않았음을 검증하는 데 사용되며, 개인 키로 서명된 토큰의 경우 JWT 발신자가 실제로 그 사람이 맞음을 인증할 수 있다.사용자가 성공적으로 로그인하면 JWT이 반환된다. 토큰은 자격 증명이므로 보안 문제를 방지하기 위해 주의가 필요하다. 일반적으로 토큰은 필요한 기간 이상 유지하지 않는 것이 좋다.
사용자가 보호된 루트나 리소스에 접근하려면 사용자 에이전트는 JWT를 Authorization 헤더에 Bearer 스키마를 사용해 보내야한다.
Authorization: Bearer <token>
JWT 토큰을 HTTP 헤더를 통해 전송할 경우, 크기가 너무 커지지 않도록 주의해야 한다.

Get Started with JSON Web Tokens
JWT.IO - JSON Web Tokens Introduction