티스토리 뷰
<두 줄 정리>
JSON 형식의 데이터를 전자 서명(Sign)하여 URL-safe문자열로 표현한으로 것으로
인증된 사용자를 식별하는 데 주로 사용된다.
*URL Safe : URL에 포함할 수 없는 문자를 포함하지 않는 것을 말한다.
What is JWT?
JWT는 일반적으로 클라이언트와 서버 두 개체 간의 정보를 공유할 때, 인증된 사용자인지 식별하는데 사용되는 토큰입니다.
각 JWT는 다른 클라이언트나 악의적인 당사자가 JWT Clams(JSON Contents)을 변경할 수 없도록
암호화를 사용하여 서명(Signed)되어 있다.
JWT 구조
- Header : 사용된 서명알고리즘, 토큰 타입
- Paylaod: 토큰의 담을 정보가 들어있다. 여기에 담는 정보의 한 조각을 클레임(Claim)이라고 부른다.
* Claim 구성요소 : sub, iat, aud, iss .... 등등
- signature : 암호화 알고리즘을 통해 만들어진 문자열로 이 문자열은 JSON Payload의 무결성을 확인하는데 사용된다.
JWT 생성 과정
1) JSON 생성
{
"userId": "abcd123",
"expiry": 1646635611301
}
2) JWT 서명에 사용될 키를 만들고, 어떤 알고리즘으로 서명할지 결정한다.
Signing Key:
NTNv7j0TuYARvmNMmWXo6fKvM4o6nv/aUi9ryX38ZH+L1bkrnD1ObOQ8JAUmHCBq7Iy7otZcyAagBLHVKvvYaIpmMuxmARQ97jUVG16Jkpkp1wXOPsrF9zwew6TpczyHkHgX5EuLg2MeBuiT/qJACs1J0apruOOJCg/gOtkjB4c=
Signing algorithm :
HS256
3) 헤더를 만든다
헤더는 서명 알고리즘에 대한 정보를 가지고 있다. Payload와 마찬가지로 이것도 JSON 형식으로 되어있다.
{
"typ": "JWT",
"alg": "HS256"
}
4) 서명(Signature)을 만든다
- (1) Payload JSON 의 공백을 제거한 후 , 그리고 base64 로 인코딩하면 아래 문자열이 나온다
eyJ1c2VySWQiOiJhYmNkMTIzIiwiZXhwaXJ5IjoxNjQ2NjM1NjExMzAxfQ
- (2) 헤더JSON도 (1)과 같은 방식으로 인코딩한다.
- (3) (1)(2)을 통해 생성된 base64문자열들 사이에 점(.)을 두고 연결한다.
- (4) 헤더의 인코딩 값과 페이로드의 인코딩값을 합친후 주어진 비밀키(secret)로 해쉬(hash)를 하여 최종적으로 서명(Signature)을 생성한다. 그리고 나서 결과로 산출된 해쉬를 base64형태로 나타내준다.
Base64URLSafe(
HMACSHA256("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOiJhYmNkMTIzIiwiZXhwaXJ5IjoxNjQ2NjM1NjExMzAxfQ", "NTNv7j0TuYARvmNMmWXo6fKvM4o6nv/aUi9ryX38ZH+L1bkrnD1ObOQ8JAUmHCBq7Iy7otZcyAagBLHVKvvYaIpmMuxmARQ97jUVG16Jkpkp1wXOPsrF9zwew6TpczyHkHgX5EuLg2MeBuiT/qJACs1J0apruOOJCg/gOtkjB4c=")
)
Results in:
3Thp81rDFrKXr3WrY1MyMnNK8kKoZBX9lg-JwFznR-M
5) 위에서 만든 문자열들을 연결시켜 JWT를 만든다.
<header>.<body>.<secret> 형식
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOiJhYmNkMTIzIiwiZXhwaXJ5IjoxNjQ2NjM1NjExMzAxfQ.3Thp81rDFrKXr3WrY1MyMnNK8kKoZBX9lg-JwFznR-M
참고
'기타' 카테고리의 다른 글
행동 - 디자인 패턴 (0) | 2022.11.13 |
---|---|
구조 - 디자인패턴 (0) | 2022.11.13 |
생성 - 디자인 패턴 (0) | 2022.11.12 |