JSON 객체를 사용하여 가볍고 자가수용적인 (self-contained) 방식으로 정보를 안전성 있게 전달해주기 위한 토큰
장점
단점
로그인
서버는 유저의 세션을 유지할 필요가 없다.
유저가 보낸 토큰만 확인하면 된다.
서버의 자원을 아낄수 있다.
정보교류
JWT는 두 개체 사이에서 안정성있게 정보를 교환하기에 좋은 방법이다.
그 이유는, 정보가 sign 이 되어있기 때문에 정보를 보낸이가 바뀌진 않았는지, 또 정보가 도중에 조작되지는 않았는지 검증할 수 있다.
Header 는 두가지의 정보를 지니고 있다.
typ: 토큰의 타입을 지정한다.
EX)JWT
alg: 해싱 알고리즘을 지정한다.
EX) HMAC SHA256 or RSA
{
"alg" : "HS256",
"typ" : "JWT"
}
Payload 부분에는 토큰에 담을 정보가 들어있다. 정보는 클레임(claim)이라는 단위로 다뤄지며 name / value 의 한 쌍으로 이뤄져있다.
클레임은 3가지로 구분된다.
등록된 (registered) 클레임,
토큰에 대한 정보들을 담기위하여 이름이 이미 정해진 클레임
iss: 토큰 발급자 (issuer)
sub: 토큰 제목 (subject)
aud: 토큰 대상자 (audience)
exp: 토큰의 만료시간 (expiraton)
nbf: 토큰 시작시간(Not Before)
iat: 토큰이 발급된 시간 (issued at)
jti: JWT의 고유 식별자
공개 (public) 클레임
공개 클레임들은 충돌이 방지된 (collision-resistant) 이름을 가지고 있어야 한다. 충돌을 방지하기 위해 주로 클레임 이름을 URI 형식으로 짓는다.
{
"https://velopert.com/jwt_claims/is_admin": true
}
{
"username": "velopert"
}
JSON Web Token 의 마지막 부분은 바로 서명(signature) 이다. 이 서명은 헤더의 인코딩값과, 정보의 인코딩값을 합친후 주어진 비밀키로 해쉬를 하여 생성한다.
HMAC-SHA256(
secret,
base64urlEncoding(header) + '.' +
base64urlEncoding(payload)
)