사용자간의 정보교환을 안전한 JSON 객체로 전달하는 표준이다. ( open standard (RFC 7519) )
JWT 는 HMAC, RSA or ECDSA 등과 같은 secret 키를 사용하여 암호화하게 된다.
따라서 신뢰성있는 정보를 주고 받을 수 있게끔 해준다.
JWT 는 3가지 부분으로 구성이 돼있다.
xxxxx.yyyyy.zzzzz
header 는 보통 2개의 부분으로 이루어진다.
어떤 알고리즘을 사용했는지, 어떤 타입인지가 들어가 있다.
{
"alg": "HS256",
"typ": "JWT"
}
위와 같은 JSON 타입을 Base64URL 인코딩을 하고 JWT 의 첫 번째 부분에 들어간다.
JWT의 두 번째 부분으로 Claims 를 담고 있는 부분이다.
Claims 는 유저에 대한 정보와 그외 여러 정보들을 담고있는 실질적인 데이터가 들어있는 부분이라고 할 수 있다.
Claims은 3가지가 존재한다.
{
"https://velog.io/jihwan94": true
}
Payload 또한 Base64URL 인코딩을 하고 JWT의 두 번재 부분에 들어간다.
Signature은 토큰을 인코딩하거나 유효성 검증을 할 때 사용하는 고유한 암호화 코드이다. 위에서 만든 Header와 Payload의 값을 각각 BASE64Url로 인코딩하고, 인코딩한 값을 비밀 키를 이용해 헤더(Header)에서 정의한 알고리즘으로 해싱을 하고, 이 값을 다시 BASE64Url로 인코딩하여 생성한다.
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
인증 과정중에서 유저가 로그인에 성공하게 되면 JWT 가 발급되게 된다. 그 후 유저가 인가가 필요한 route를 요청하게 되면 JWT를 보내야 한다.
JWT는 Header를 통해서 전송이되게 되고 다음과 같은 포맷으로 전송되는게 일반적이다.
Authorization: Bearer <token>
이와 같은 형태를 무상태성 인증이라고 하고 이를 통해서 서버의 확장이 더욱 편리해지게 된다. 서버가 유저의 상태정보를 가지고 있지 않아도 되기 때문에 이로 인한 제약이 사라지기 때문.