JWT

토큰 기반 인증방식이다. 제공되는 API를 유지보수 하던 중 jwt를 처음 봤다. 유저와의 인증 작업을 수행하는 어플리케이션은 직접 전체를 만들어본 적이 없기 때문이다. 너무나 흔하게 사용되는 기술이니만큼 잘 알아둬야겠다는 생각이들어 정리한다.

Stateless 서버

  • Stateful 서버 : 클라이언트 상태 정보를 계속해서 유지하고 이를 이용해 서비스를 제공
  • Stateless 서버 : 클라이언트 상태 정보를 유지하지 않고 요청만을 통해서 작업을 처리

Stateless 서버의 경우 확장성이 높다. 대표적인 예로 OAuth가 있다. 소셜 계정을 이용해 다른 웹서비스 로그인이 가능한 기술이다. 상태를 저장하지 않기 때문에 어떤 요청이 들어와도 처리할 수 있다. 또한 모바일 어플리케이션을 개발한다면 토큰 기반 인증이 가장 이상적이다.

세션

토큰을 사용하기 이전의 인증방식은 서버에서 유저의 정보, 즉 세션을 기억하고 이를 사용해 동작했다. 아직도 이런 방식으로 돌아가는 웹사이트가 많지만 결코 좋은 방식이라고 할 수 없다. 동시 로그인 중인 사용자의 수가 급격히 증가하는 경우 이를 저장하는 서버의 램에 과부하가 올 수 있고 이를 피하기 위해 데이터베이스에 저장하는 경우도 성능에 좋지 않다.

토큰 기반 인증

토큰 기반 인증은 stateless 연결 방식이다. 과정을 간략하게 정리하면 아래와 같다.

  1. 유저가 아이디와 비밀번호로 로그인
  2. 서버는 계정 정보를 검증 후 정확하다면 signed 토큰을 발급
  3. 클라이언트는 전달받은 토큰을 저장해두고 요청시 해당 토큰을 함께 전송
  4. 그 이후부터 서버는 토큰을 검증하며 요청에 응답

사용자는 http 헤더에 토큰을 포함해 전달할 수 있다.

JWT란?

JSON Web Token의 줄입말이다. 두 party 사이에서 보안이 보장된 json 정보 전달을 가능하게 해주는 웹 표준(RFC 7519)이다.디지털 서명이 되어있기 때문에 신뢰성이 있고 확인이 가능한 구현체이다.

jsonwebtoken이라는 모듈로 npm에도 올라와있다. 주 다운로드 수가 5백만이 넘어갈 정도로 보편적인 기술이다.

jsonwebtoken 사용법

jwt.sign(payload, secretOrPrivateKey, [options, callback])

payload는 string 이어야 한다. string이 아니라면 자체적으로 JSON.stringify()가 적용된다.
secretOrPrivateKey는 암호화 알고리즘에 사용될 키를 말한다.
다양한 옵션을 줄 수 있는데 예시로 아래 두 가지가 있다.

  • algorithm(default: HS256)
  • expiresIn

기본 사용 예

1
2
var jwt = require("jsonwebtoken");
var token = jwt.sign({ foo: "bar" }, "shhhhh");

참고