로그인을 하고 유저의 요청과 응답 처리를 안전하게 주고 받기위해서 JWT 토큰을 사용하였다. 프론트엔드 작업을 할 때 서버에서 넘겨주는 토큰을 localstorage에 저장하고 인증여부를 체크했지만 좀더 이론을 알기위해 글을 작성하기로 했다.
출처: https://mangkyu.tistory.com/56 [MangKyu's Diary]
.
구분자를 반환한다. Header 는 두가지의 정보를 지니고 있습니다.
typ: 토큰의 타입을 지정합니다. ex)JWT
alg: 해싱 알고리즘을 지정합니다. 해싱 알고리즘으로는 보통 HMAC SHA256 혹은 RSA 가 사용되며, 이 알고리즘은, 토큰을 검증 할 때 사용되는 signature 부분에서 사용됩니다.
{
"alg": "HS256",
"typ": JWT
}
Payload 부분에는 토큰에 담을 정보가 들어있습니다. 여기에 담는 정보의 한 ‘조각’ 을 클레임(Claim) 이라고 부르고, 이는 Json(Key/Value) 형태의 한 쌍으로 이뤄져있습니다. 토큰에는 여러개의 클레임들을 넣을 수 있습니다.
클레임 의 종류는 다음과 같이 크게 세 분류로 나뉘어져있습니다:
등록된 (registered) 클레임
공개 (public) 클레임
비공개 (private) 클레임
1) 등록된 (registered) 클레임
iss
: 토큰 발급자 (issuer)
sub
: 토큰 제목 (subject)
aud
: 토큰 대상자 (audience)
exp
: 토큰의 만료시간 (expiraton), 시간은 NumericDate 형식으로 되어있어야 하며 (예: 1480849147370) 언제나 현재 시간보다 이후로 설정되어있어야합니다.
nbf
: Not Before 를 의미하며, 토큰의 활성 날짜와 비슷한 개념입니다. 여기에도 NumericDate 형식으로 날짜를 지정하며, 이 날짜가 지나기 전까지는 토큰이 처리되지 않습니다.
iat
: 토큰이 발급된 시간 (issued at), 이 값을 사용하여 토큰의 age 가 얼마나 되었는지 판단 할 수 있습니다.
jti
: JWT의 고유 식별자로서, 주로 중복적인 처리를 방지하기 위하여 사용됩니다. 일회용 토큰에 사용하면 유용합니다.
2) 공개(public)클레임
공개 클레임들은 충돌이 방지된 (collision-resistant) 이름을 가지고 있어야 합니다. 충돌을 방지하기 위해서는, 클레임 이름을 URI 형식으로 짓습니다.
{
"https://velopert.com/jwt_claims/is_admin": true
}
3) 비공개(private)클레임
등록된 클레임도아니고, 공개된 클레임들도 아닙니다. 양 측간에 (보통 클라이언트 <->서버) 협의하에 사용되는 클레임 이름들입니다. 공개 클레임과는 달리 이름이 중복되어 충돌이 될 수 있으니 사용할때에 유의해야합니다.
{
"username": "velopert"
}
Payload 예시 정리
{
"iss": "velopert.com",
"exp": "1485270000000",
"https://velopert.com/jwt_claims/is_admin": true,
"userId": "11028373727102",
"username": "velopert"
}
2개의 등록된 클레임, 1개의 공개 클레임, 2개의 비공개 클레임
JWT의 장점
JWT의 단점
참고)
https://velopert.com/2389
https://velog.io/@dnjscksdn98/JWT-JSON-Web-Token-%EC%86%8C%EA%B0%9C-%EB%B0%8F-%EA%B5%AC%EC%A1%B0
https://mangkyu.tistory.com/56
https://velopert.com/2389