JWT(Json Web Token) 이란?
- 전자 서명 된 URL-safe (URL로 이용할 수 있는 문자만 구성된)의 Json 입니다.
- JWT는 서버와 클라이언트 간 정보를 주고 받을 때 Http Request Header에 Json Token을 넣은 후 서버는 별도의 인증 과정없이 헤더에 포함되어 있는 JWT 정보를 통해 인증합니다.
- JWT는 HMAC 알고리즘을 사용하여 비밀키 또는 RSA를 이용한 Public Key/Private Key 쌍으로 서명할 수 있습니다.
JWT는 .(점)을 기준으로 세 파트로 나누어집니다.
순서대로 헤더(Header), 페이로드 (Payload), 서명(Sinature)로 구성합니다.
Base64 인코딩의 경우 "+", "/", "="이 포함되지만 JWT는 URI에서 파라미터로 사용할 수 있도록 URL-safe한 Base64url 인코딩을 사용합니다.
1. 헤더(Header)
토큰의 타입과 해시 암호화 알고리즘으로 구성되어 있습니다.
첫째는 토큰의 유형(JWT)을 나타내고, 두 번째는 HMAC, SHA256 도는 RSA와 같은 해시 알고리즘을 나타내는 부분입니다.
ex) Header 예시
{
"typ": "JWT",
"lag": "HS256"
}
type: type, 여기에서 토큰 유형이 JWT임을 나타낸다.
alg: 토큰 서명 생성을 위한 해시 알고리즘인 algorithm을 의미한다. HS256은 HMAC-SHA256으로, 비밀 키를 사용하는 알고리즘
2. 페이로드(Payload)
{
"userId": "abcd1111",
"username": "test1111",
"email": "test@test.com",
"iss": "testissu",
"iat": 1515232545,
"exp": 1517889808
}
userId, username, email에는 원하는 값을 저장할 수 있다.
Standard Fields (선택 사항)
3. 서명(Signature)
secret key를 포함하여 암호화되어 있습니다.
ex) Signature 예시
const data = Base64UrlEncode(header) + '.' + Base64UrlEncode(payload);
const hashedData = Hash(data, secret);
const signature = Base64UrlEncode(hashedData);
먼저 Heder와 Payload를 인코딩하고 점(.)으로 결합한다.
해시 알고리즘(Header에서 정의)을 사용하여 데이터를 해시한다.
해싱 결과를 인코딩하여 Signature를 얻는다.