JWT (Json Web Token)
JWT는 약자 그대로 Json 형식의 웹 토큰을 의미한다.
공식 홈페이지를 방문해보자 >> 클릭!!아주아주 흉물스럽다 ..
우선 인코드된 문자열을 확인해보자 !
*공식문서에서 확인 할 수 있는 JWT 토큰
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
.으로 세 영역을 구분하고 있는데 각각 살펴보자
HEADER:ALGORITHM & TOKEN TYPE.
PAYLOAD:DATA.VERIFY SIGNATURE
헤더에서는 두 가지의 정보를 가지고 있다.
ALGORITHM : 해시 알고리즘의 정보, 데이터를 암호화 해주는 알고리즘의 정보를 넣어준다.
+추가로 주로 사용하는 알고리즘은 HS256라고들 한다!!
TOKEN TYPE : 토큰의 타입을 지정해준다.
당연하게도 JWT가 들어가 있다
// 예시 !
{ "alg": "HS256", "typ": "JWT" }
위와 같은 정보가 암호화가 되어서 JWT의 HEADER를 구성한다.
HEADER:ALGORITHM & TOKEN TYPE.PAYLOAD:DATA.VERIFY SIGNATURE
payload 에는 토큰에 넣어줄 정보를 가지고 있다.
Registered claims(등록된 클레임) : 사전에 이름이 정의 된 클레임이다. 필수 값은 아님!!!
1. iss : 토큰 발급자 (issuer)
2. sub : 토큰 제목 (subject), 토큰의 주제를 설명한다.
3. aud : 토큰 대상자 (audience)
4. exp : 토큰의 만료시간 (expiraton), 숫자 형식으로 유효기간이 지난 토큰은 사용 불가능 하도록 처리한다. 또한 현재 시간보다 이후로 설정되어야한다.
5. nbf : Not Before 를 의미하며, 만료시간과 마찬 가지로 숫자 형식이며, 해당 시간 이전에는 사용라지 않도록 처리 합니다.
6. iat : 토큰이 발급된 시간 (issued at)
7. jti : JWT ID, 주로 중복적인 처리를 방지하기 위하여 사용됩니다
공개 (public) 클레임
공개용 정보를 위해 사용 된다, 일반적으로 충돌 방지를 위해 URI 형태로 구성된다.
Private claims(비공개 클레임)
토큰을 주고 받는 양측에서 사전 협의된 이름으로 사용되는 클레임이다.
이 글에서는 간단하게 예시를 들고 넘어가도록 하겠다.
// 예시 !
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
위와 같은 정보가 암호화가 되어서 JWT의 payload를 구성한다.
HEADER:ALGORITHM & TOKEN TYPE.PAYLOAD:DATA.VERIFY SIGNATURE
VERIFY SIGNATURE (서명) 에는 JWT의 위변조를 검증하기 위한 정보를 가지고 있다.
인코딩한 Header, Payload 값을 합친 후, 헤더의 alg에서 정의된 알로리즘으로 인코딩하여 생성한다.
//서명을 만드는 슈도코드(pseudocode)의 구조이다.
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret
)
JWT 동작 방식
더 자세하게 포스팅 된 글을 보고싶다면 ?!
https://bravenamme.github.io/2021/03/25/jwt/
https://velopert.com/2389
https://sudo-minz.tistory.com/53
*오타 혹은 오류 지적해주시면 감사하겠습니다 !!