JWT는 유저를 인증하고 식별하기 위한 토큰(Token)기반 인증이다.

명세: RFC 7519

토큰은 세션과 달리 서버가 아닌 클라이언트에 저장되기 때문에, 메모리나 스토리지 등을 통해 세션을 관리했던 서버의 부담을 덜 수 있다.

핵심적인 특징은, 토큰 자체에 사용자의 권한 정보다 서비스를 사용하기 위한 정보가 포함(Self-contained)된다는 것이다.

데이터가 많아지면 토큰이 커질 수 있으며, 토큰이 한 번 발급된 이후 사용자의 정보를 바꾸더라도 토큰을 재발급하지 않는 이상 반영되지 않는다.

JWT를 사용하면 RESTful과 같은 무상태(Stateless)인 환경에서 사용자 데이터를 주고받을 수 있게 된다. 세션을 사용하게될 경우 쿠키 등을 통해 식별하고 서버에 세션을 저장했지만, JWT와 같은 토큰을 클라이언트에 저장하고 요청시 단순히 HTTP 헤더에 토큰을 첨부하는 것만으로도 단순하게 데이터를 요청하고 응답을 받아올 수 있다.

사용 순서

  1. 클라이언트 사용자가 아이디, 패스워드를 통해 웹서비스 인증.
  2. 서버에서 서명된(Signed) JWT를 생성하여 클라이언트에 응답으로 돌려줌
  3. 클라이언트가 서버에 데이터를 추가적으로 요구할 때 JWT를 HTTP Header에 첨부
  4. 서버에서 클라이언트로부터 온 JWT를 검증

JWT는 JSON 데이터를 Base64 URL-saft Encode를 통해 인코딩하여 직렬화한 것이 포함되며 토큰 내부에는 위변조 방지를 위해 개인키를 통한 전자서명도 있다. 따라서 사용자가 JWT를 서버로 전송하면 서버는 서명을 검증하는 과정을 거치게 되며 검증이 완료되면 요청한 응답을 돌려준다.

구조

Header, Payload, Signature로 구성

각 요소는 .으로 구분된다