JSON Web Token (JWT)는 웹표준으로 두 개체에서 JSON 객체를 사용하여 안정성 있게 통신하는것을 지원한다.
거의 대부분의 언어 (Java, C, Python, C++, PHP, JavaScript-node, Go, Swift, Ruby 등)에서 JWT를 지원하고 있다.
가장 많이 사용되는 상황으로는
사용자가 어떠한 작업을 요청할 때마다 JWT토큰이 유효한지 만료가 되지 않았는지 권한이 있는지 등을 체크한다.
AAAAA.BBBB.CCCC
위와같이 JWT는 ’.’(dot)을 기준으로 Header, Payload, Signature 3개로 분리된다.
{
"alg": "HS256",
"typ": "JWT"
}
헤더는 암호화 방식과 어떤 타입인지를 명시해준다. HMAC SHA256혹은 RSA등이 주로 사용된다. 이곳에 명시된 알고리즘을 이용하여 추후 signature를 생성한다.
{
"user_id": 1,
"age": 26,
"name": "홍길동"
}
Payload에는 실제 통신할 데이터가 들어간다.
HMACSHA256(
base64UrlEncode(header) + '.' +
base64UrlEncode(payload),
secret)
Header를 Base64인코딩 + ’.’ + Payload를 Base64인코딩 한 후 secret_key를 이용하여 HMAC SHA256으로 암호화해준다.
그리고 각각 생성된 Header + ’.’ + Payload + ’.’ + Signature를 이어주면 JWT 완성
Payload
const encodedPayload = new Buffer(JSON.stringify(payload))
.toString('base64')
.replace('=', '');
위와같이 간단히 생성이 가능한다. (Header, Payload) 이 정보를 이용하여 Signature까지
Signature생성 시 필요한 HMACSHA256은 node기본 내장모듈인 crypto
안에 함수가 있다. (crypto.createHmac
)
그런데 위와같이 구현하다보면 작업이 너무 많다.
그래서 친절한 어떤 친절한 개발자분께서 오픈소스로 제공했다.
jsonwebtoken
(url은 아래 참고에 첨부)