JSON Web Token (JWT) 은 웹표준 (RFC 7519) 으로서 두 개체에서 JSON 객체를 사용하여 가볍고 자가수용적인 (self-contained) 방식으로 정보를 안전성 있게 전달해준다.
헤더는 두가지 정보를 지님
-> 인코딩 하면
const header = {
"typ": "JWT",
"alg": "HS256"
};
// encode to base64
const encodedPayload = new Buffer(JSON.stringify(payload))
.toString('base64')
.replace('=', '');
console.log('payload: ',encodedPayload);
결과
header: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
서비스에서 필요한 정보들이 아닌, 토큰에 대한 정보를 담기위하여 이름이 이미 정해진 클레임
iss
: 토큰 발급자sub
: 토큰 제목aud
: 토큰 대상자exp
: 토큰 만료시간nbf
: Not Before. 토큰 활성 날짜iat
: 토큰이 발급된 시간jti
: JWT의 고유 식별자로서, 주로 중복적인 처리를 방지하기 위하여 사용됨클레임 이름을 URI형식으로 지음(충돌 방지를 위해)
ex)
{
"https://velopert.com/jwt_claims/is_admin": true
}
등록X, 공개X인 클레임. 양측이 협의하에 사용되고 중복이 되어 충돌날 수 있으니 주의해야함
ex)
{
"username": "velopert"
}
-> 인코딩 하면
const payload = {
"iss": "velopert.com",
"exp": "1485270000000",
"https://velopert.com/jwt_claims/is_admin": true,
"userId": "11028373727102",
"username": "velopert"
};
// encode to base64
const encodedPayload = new Buffer(JSON.stringify(payload))
.toString('base64')
.replace('=', '');
console.log('payload: ',encodedPayload);
결과
payload: eyJpc3MiOiJ2ZWxvcGVydC5jb20iLCJleHAiOiIxNDg1MjcwMDAwMDAwIiwiaHR0cHM6Ly92ZWxvcGVydC5jb20vand0X2NsYWltcy9pc19hZG1pbiI6dHJ1ZSwidXNlcklkIjoiMTEwMjgzNzM3MjcxMDIiLCJ1c2VybmFtZSI6InZlbG9wZXJ0In0
헤더의 인코딩값과, 정보의 인코딩값을 합친후 주어진 비밀키로 해쉬를 하여 생성한다.
secret
으로 해싱하고 const crypto = require('crypto');
const signature = crypto.createHmac('sha256', 'secret')
.update(encodedHeader + '.' + encodedPayload)
.digest('base64')
.replace('=', '');
console.log('signature: ',signature);
결과
signiture: WE5fMufM0NDSVGJ8cAolXGkyB5RmYwCto1pQwDIqo2w