JWT Token 사용하기
  • Infra

JWT (JSON Web Token)

JSON Web Token (JWT)는 웹표준으로 두 개체에서 JSON 객체를 사용하여 안정성 있게 통신하는것을 지원한다.

거의 대부분의 언어 (Java, C, Python, C++, PHP, JavaScript-node, Go, Swift, Ruby 등)에서 JWT를 지원하고 있다.

사용처

가장 많이 사용되는 상황으로는

  1. 회원인증 : 사용자가 로그인을하면 서버는 유저의 정보를 JWT를 기반한 토큰을 발행하여 서버는 클라이언트에게 전달하고 그 데이터를 사용하여 정상회원임을 인증한다.

사용자가 어떠한 작업을 요청할 때마다 JWT토큰이 유효한지 만료가 되지 않았는지 권한이 있는지 등을 체크한다.

  1. 외부 매체와의 통신 : A서버에서 B서버와 통신하기 위하여 JWT를 사용한다. 두 개체 사이에 안정성있고 보안을 유지하기 위하여 A서버는 통신할 데이터를 JWT형태로 만들어 B서버로 전달한다. 이를 통해 데이터가 중간에 바뀌지 않았는지, 유효한 데이터인지 등의 검증이 가능하다.

JWT 너는 어떻게 생겼니

AAAAA.BBBB.CCCC 위와같이 JWT는 ’.’(dot)을 기준으로 Header, Payload, Signature 3개로 분리된다.

  • Header
{
    "alg": "HS256",
    "typ": "JWT"
}

헤더는 암호화 방식과 어떤 타입인지를 명시해준다. HMAC SHA256혹은 RSA등이 주로 사용된다. 이곳에 명시된 알고리즘을 이용하여 추후 signature를 생성한다.

  • Payload
{
    "user_id": 1,
    "age": 26,
    "name": "홍길동"
}

Payload에는 실제 통신할 데이터가 들어간다.

  • Signature
HMACSHA256(
  base64UrlEncode(header) + '.' +
  base64UrlEncode(payload),
  secret)

Header를 Base64인코딩 + ’.’ + Payload를 Base64인코딩 한 후 secret_key를 이용하여 HMAC SHA256으로 암호화해준다.

그리고 각각 생성된 Header + ’.’ + Payload + ’.’ + Signature를 이어주면 JWT 완성

Node를 이용한 JWT 만들기

Payload

const encodedPayload = new Buffer(JSON.stringify(payload))
                            .toString('base64')
                            .replace('=', '');

위와같이 간단히 생성이 가능한다. (Header, Payload) 이 정보를 이용하여 Signature까지 Signature생성 시 필요한 HMACSHA256은 node기본 내장모듈인 crypto안에 함수가 있다. (crypto.createHmac)

그런데 위와같이 구현하다보면 작업이 너무 많다. 그래서 친절한 어떤 친절한 개발자분께서 오픈소스로 제공했다. jsonwebtoken (url은 아래 참고에 첨부)


  • References
  1. https://jwt.io/
  2. https://www.npmjs.com/package/jsonwebtoken