JWT ( Json Web Token ) 이란?

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

⚠️ [RFC 7519](https://datatracker.ietf.org/doc/html/rfc7519) 에 자세한 명세가 나와있다.

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

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

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

JWT 를 사용하면 RESTful 과 같은 **무상태(Stateless)**인 환경에서 사용자 데이터를 주고 받을 수 있음

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

일반적으로 JWT 를 사용하면 아래와 같은 순서로 진행된다.

  1. 클라이언트 사용자가 아이디, 패스워드를 통해 웹서비스 인증.
  2. 서버에서 서명된(Signed) JWT 를 생성하여 클라이언트에 응답으로 돌려주기.
  3. 클라이언트는 응답받은 JWT를 저장관리하게 된다.

Spark

  1. 클라이언트가 서버에 데이터를 추가적으로 요구할 때 JWT 를 HTTP Header 에 첨부.
  2. 서버에서 클라이언트로부터 온 JWT 를 검증.

JWT 는 JSON 데이터를 Base64 URL-safe Encode 를 통해 인코딩하여 직렬화한 것이 포함되며 토큰 내부에는 위변조 방지를 위해 개인키를 통한 전자서명도 있다.