브라우저 : 로컬 저장소,
IOS : KeyChain
Android : SharedPreferences
Header는 JWT를 어떻게 계산할 것인지 판별
{
"type" : "JWT", // 토큰 유형이 JWT임을 의미
"alg" : "HS256" // 토큰 서명 생성을 위한 해시 알고리즘을 의미
}
Payload는 JWT에 무엇을 저장할 것인지 정의
{
"userId" : "bbirds",
"userName" : "Angelo",
"email" : "ab@gmail.com",
// 하위 부터는 선택사항
"iss" : "Paul, manager of www.com" // JWT 발행 및 발급자
"iat" : 15802312 // JWT가 발행된 시간
"exp" : 15902312 // JWT 만료 시간
}
Signature는 Header의 해시 알고리즘을 사용하는 곳
Header와 Payload를 인코딩하고 결합.
알고리즘을 사용하여 데이터를 해시.
해시 결과를 인코딩하여 서명을 얻는다.
const data = Base64UrlEncode(header) + '.' + Base64UrlEncode(payload);
const hashedData = Hash(data, secret);
const signature = Base64UrlEncode(hashedData);
JWT 표준 구조로 결합
header.payload.signature
const encodedHeader = base64urlEncode(header);
/* Result */
"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9"
const encodedPayload = base64urlEncode(payload);
/* Result */
"eyJ1c2VySWQiOiJhYmNkMTIzNDVnaGlqayIsInVzZXJuYW1lIjoiYmV6a29kZXIiLCJlbWFpbCI6ImNvbnRhY3RAYmV6a29kZXIuY29tIn0"
const data = encodedHeader + "." + encodedPayload;
const hashedData = Hash(data, secret);
const signature = base64urlEncode(hashedData);
/* Result */
"crrCKWNGay10ZYbzNG3e0hfLKbL7ktolT7GqjUMwi3k"
// header.payload.signature
const JWT = encodedHeader + "." + encodedPayload + "." + signature;
/* Result */
"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOiJhYmNkMTIzNDVnaGlqayIsInVzZXJuYW1lIjoiYmV6a29kZXIiLCJlbWFpbCI6ImNvbnRhY3RAYmV6a29kZXIuY29tIn0.5IN4qmZTS3LEaXCisfJQhrSyhSPXEgM1ux-qXsGKacQ"