JWT는 Json 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는 최종적으로 신뢰 가능한 토큰이 되고 페이로드 값으로 원하는 작업을 수행할 수 있게된다.
참조
'웹' 카테고리의 다른 글
[git] merge unrelated project (0) | 2020.11.21 |
---|---|
[Spring] Spring Boot 프로젝트 고군분투 1주차 리뷰 (0) | 2020.11.19 |
[Spring] Spring Boot 프로젝트 고군분투 1주차 (0) | 2020.11.11 |
[DB] SQL 문법 - 기본 함수 (0) | 2020.11.01 |
[DB] The Relational Model (SQL) (0) | 2020.10.31 |