JWT란?
- Json Web Token의 약자로 모바일이나 웹의 사용자 인증을 위해 사용하는 암호화된 토큰을 의미한다.
- JWT 정보를 request에 담아 사용자 정보 열람, 수정 등 개인적인 작업 등을 수행할 수 있다.
JWT에는 어떤 정보를 포함하는가?
- JWT는 크게 세가지 파트로 나누어지며 .(점)으로 구분하여 aaaaa.bbbbb.cccc형태로 표현된다.
- header, payload, signature 세가지로 구성되어 있다.
- JWT는 URL에서 파라미터로 사용할 수 있도록 URL_Safe한 Base64url 인코딩을 사용한다.
header
- 토큰의 타입과 해시 암호화 알고리즘으로 구성되어 있다.
{ "typ" : "JWT" "alg" : "HS256" }
payload
- 토큰에 담을 정보가 들어으며 담은 정보의 한 ‘조각'을 클레임(claim) 이라고 부른다.
- 클레임은 name/value의 한 쌍으로 이루어져 있다.
- 클레임의 종류는 등록된(public)클레임, 공개(public)클레임, 비공개(private)클레임이 존재한다.
{ "sub" : "123456789", "name" : "hyounguk", }
signature
- 서명은 [header + bayload + secretkey] 사용하여 서버에서 JWT를 발행한다.
- 각 요청 시 서명이 확인되며 헤더 또는 페이로드의 정보가 클라이언트에 의해 변경이 된 경우 서명이 무효화 된다.
기존의 인증/ 인가 방식과 다른점은?
세션방식
- 세션 방식은 서버측에서 유저들의 정보를 세션에 기억하고 있어야 한다.
- 이 세션을 유지하기 위해서는 여러가지 방법이 사용되는데 메모리/디스크/데이터베이스 등의 시스템에 세션을 담아서 사용한다.

토큰방식
- 토큰 기반 시스템은 stateless하기 때문에 유저의 인증 정보를 서버나 세션에 담아두지 않는다.
- 따라서 인증정보를 서버에 담아둠으로써 발생하는 많은 문제점들이 해소된다.

JWT의 장단점
장점
- 무상태(Stateless) 확장성이 있다.
- 기존 서버에 세션을 저장하는 방식에서 서버 여러대를 사용하여 요청을 분산하였다면 어떤 유저가 로그인했을 때 그 유저는 처음 로그인 서버에만 요청을 보내도록 설정을 해야 했지만, 토큰을 사용하면 토큰 값만 알고 있다면 어떤 서버로 요청이 들어가던 상관없다.
- 보안성 쿠키를 전달하지 않아도 되기 때문에 쿠키를 사용함으로써 발생하는 취약점이 사라진다.
- 여러 플랫폼 및 도메인 애플리케이션 규모가 커지면 여러 디바이스를 호환 시키고 더 많은 종류의 서비스를 제공한다.
- 토큰을 사용한다면 어떤 디바이스에서도 어떤 도메인에서도 토큰만 유효하다면 요청이 정상적으로 처리된다.
단점
- 길이 claim에 넣는 데이터가 많아질 수록 JWT 토큰 값이 길어진다.
- API호출 시 매 호출마다 토큰 데이터를 서버에 전달해야 하는데, 길이가 길다는 것은 그만큼 네트워크 대역폭 낭비가 심할 수 있다.
- 보안 JWT는 기본적으로 payload에 대한 정보를 암호화 하지 않는다. 단순히 base64로 인코딩만 하기 때문에 중간에 패킷을 가로채거나 기타 방법으로 토큰을 취득했으면 디코딩을 통해 데이터를 볼 수 있다.
- 따라서 JWE를 통해 암호화하거나 중요 데이터는 payload에 포함시키면 안된다.