[JWT] JWT 구성과 생성 과정

우디혜 2020. 11. 16. 23:31

JWTJson Web Token의 약자이다

헤더.페이로드.서명 이 세 가지로 구성되어있고 각각의 요소는 '.'을 통해서 구분된다.

 

가장 먼저 헤더(Header)는 해당 JWT를 어떻게 검증할 지에 대한 정보를 담고있다.

{
    "alg": "서명 시에 사용하는 알고리즘",
    "kid": "서명 시에 사용하는 키 식별 값(public/private key)"
}

위의 JSON 객체 직렬화 → '{"alg": "알고리즘","kid": "키 식별 값"}' UTF-8로 인코딩 UTF-8(직렬화된 JSON객체)  → Base64 URL-Safe로 인코딩→ Base64URLSafe(UTF-8 인코딩 결과)eyAAAAAA 헤더 짜란

 

JSON 객체를 직렬화하고 인코딩한 최종결과가 헤더이다. (ey~~ 요론게)

 

페이로드(payload)는 JWT 자체에 대한 내용(토큰 생성자인 클라이언트 정보 혹은 생성 시각 etc), 클라이언트나 서버가 주고받기로 한 값들로 구성되는데 이러한 속성을 클라임셋(Claim Set)이라고 부른다.

{
    "iss": "클라이언트 정보",
    "iat":  "생성 일시"
}

 

위의 JSON 객체 직렬화 → '{"iss": "클라이언트 정보","iat": "생성 일시"}'  Base64 URL-Safe로 인코딩→ Base64URLSafe(직렬화된 JSON객체)  eyBBBBBB 페이로드 짜란

 

서명(Signature)은 '헤더.페이로드' 값을 합친 문자열을 서명한 값이다.

 

서명 생성 → Sign('ES256', '${PRIVATE_KEY}', '헤더.페이로드')Base64 URL-Safe로 인코딩 Base64URLSafe(서명 객체)eyCCCCCC  서명 완서엉~~

 

최종적인 JWT 모습은

(header).(payload).(signature)
eyAAAAAA.eyBBBBBB.eyCCCCCC  

이렇게 생성된 JWT는 헤더의 알고리즘 정보(alg)와 서명 시 사용하는 키 식별값(kid) 그리고 공개키를 이용해 검증할 수 있다. 검증 성공 시 JWT는 최종적으로 신뢰 가능한 토큰이 되고 페이로드 값으로 원하는 작업을 수행할 수 있게된다.

 

참조

meetup.toast.com/posts/239