JWT는 Json Web Token의 약자로 모바일이나 웹의 사용자 인증을 위해 사용하는 암호화된 토큰을 의미한다. JWT 정보를 request에 담아 사용자용 정보 열람, 수정 등 개인적인 작업을 수행할 수 있게한다.
JWT는 세 파트로 나누어지고, 각 파트는 . 으로 구분하여 aaaaa.bbbbb.ccccc 이런식으로 표현된다. JWT는 URL에서 파라미터로 사용할 수 있도록 URL_Safe 한 Base64url 인코딩을 사용한다.
클라이언트가 로그인 하기 위해서는 인증정보 ID, Password 등 으로 인증을 해야한다. 인증이 완료되면 언제, 어디서 라는 사용사 식별 정보를 포함하고 있는 JWT를 발급한다.
로그인 후 JWT를 브라우저의 저장소인 local storage, session storage, cookie에 저장 할 수 있다.
무상태(stateless), 확장성이 있다. 기존 서버에 세션을 저장하는 방식에서 서버 여러대를 사용하여 요청을 분산하였다면 어떤 유저가 로그인했을 때 그 유저는 처음 로그인한 서버에만 요청을 내보내도록 설정 해야한다. 하지만 토큰을 사용하면 토큰 값만 알고 있다면 어떤 서버로 요청이 들어가든 상관이 없다. 즉, 세션스토리지가 필요없다.
보안성 쿠키를 전달하지 않아도 되므로 쿠키를 사용함으로써 발생하는 취약점이 사라진다.
여러 플랫폼 및 도메인 어플리케이션 규모가 커지면 여러 디바이스를 호환 시키고 더 많은 종류의 서비스를 제공한다. 토큰을 사용한다면 그 어떤 디바이스에서도 그 어떤 도메인에서도 토큰만 유효하다면 요청이 정상적으로 처리 된다.
길이 claim에 넣는 데이터가 많아질 수록 JWT토큰이 길어진다. API호출 시 매 호출마다 토큰 데이터를 서버에 전달해야 하는데 길이가 길다는 것은 그만큼 네트워크 대역폭 낭비가 심할 수 있다.
보안 JWT는 기본적으로 Payload에 대한 정보를 암호화 하지 않는다. 단순히 BASE64로 인코딩만 하기 때문에 중간에 패킷을 가로채거나 기타 방법으로 토큰을 취득했으면 디코딩을 통해 데이터를 볼 수 있다. 그래서 JWE(JSON Web Encryption)를 통해 암호화 하거나 중요데이터를 Payload에 넣지 말아야 한다.