프로그래밍/Web
JWT
거드
2021. 3. 6. 14:56
JWT(Json Web Token)이란?
JWT는 인증에 필요한 정보들을 암호화시킨 문자열로 RFC7519 표준입니다.
사용자는 JSON 객체를 HTTP Authorization 헤더에 실어 서버로 보내서 헤더에 포함된 JWT 정보를 통해 인증을 할 수 있습니다.
해싱 알고리즘으로는 HMAC SHA256, RSA등이 사용된다.
JWT 토큰의 구성
JWT 토큰은 크게 세 부분으로 나뉘는데 Header, Payload, Signature로 불리며 문자열에서 온점(.)으로 구분됩니다.
xxxxxx.yyyyy.zzzzz
헤더(Header)
Header는 해싱 알고리즘과 토큰의 타입으로 구성됩니다.
{
"alg": "HS256",
"typ": "JWT"
}
정보(Payload)
Payload는 토큰에 담을 정보를 지닙니다. 여기서 정보를 클레임(Claim)이라고 부르고, name과 value쌍으로 이루어져 있으며 토큰에는 여러 개의 클레임을 넣을 수 있습니다.
클레임은 크게 세 가지로 분류됩니다.
- Registered claims
- 토큰에 대한 정보들을 담기 위한 사용
- 토큰 발급자, 대상자, 만료기간 등등의 정보를 가지고 있음
{ "iss": "yang", "exp": "1485270000000" }
- Public claims
- 충돌 방지를 위해 클레임의 이름을 URI형식으로 함.
{ "https://giantdwarf.tistory.com/": true }
- 충돌 방지를 위해 클레임의 이름을 URI형식으로 함.
- Private claims
- 서버와 클라이언트 간에 협의하에 사용되는 클레임으로 정보를 공유하기 위해 사용.
{ "username": "Seungin Yang", "admin": true }
- 서버와 클라이언트 간에 협의하에 사용되는 클레임으로 정보를 공유하기 위해 사용.
전체 payload
{
"iss": "yang",
"exp": "1485270000000",
"https://giantdwarf.tistory.com/": true,
"username": "Seungin Yang",
"admin": true
}
서명(Signature)
서명은 JWT토큰의 마지막 문자열이며 인코딩한 헤더와 정보를 합치고 비밀키로 해쉬하여 생성한 후 base64 형태로 인코딩하여 생성합니다.
예를 들어 HMAC SHA256 알고리즘을 사용하려는 경우 서명은 다음과 같은 방식으로 생성됩니다.
//슈도코드
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
이렇게 만든 만든 해쉬를, BASE64로 인코딩하면 토큰이 완성됩니다.
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ5YW5nIiwiZXhwIjoiMTQ4NTI3MDAwMDAwMCIsImh0dHBzOi8vZ2lhbnRkd2FyZi50aXN0b3J5LmNvbS8iOnRydWUsInVzZXJuYW1lIjoiU2V1bmdpbiBZYW5nIiwiYWRtaW4iOnRydWV9.Sj1vI3ITY5jQvAchCB-rx_7fh_EcManxmLrZzMSmXQw
이 값을 JWT디버거에 encoded에 넣어보면 서명이 되는것 까지 확인할 수 있습니다.
JWT를 쉽게 사용하기위한 다양한 라이브러리들이 존재하는데 jwt.io에서 확인할 수 있습니다.