JWT란 JSON Web Token의 준말로 JS의 Key : Value 자료구조를 가지고 있다.
HTTP는 기본적으로 state-less를 지향하고 있다.
이때, state-less 상태란 서버가 클라이언트의 정보를 가지고 있지 않는 것을 의미한다.
state-less 장단점
장점
- 서버 확장성이 높고 대량의 트래픽도 대처 가능.
- 단일 서버만이 아닌 분리된 서버의 형태에서도 DB나 서버에 의존하지 않아 세션 정보 등의 교환이 가능.
단점
- state-ful 방식보다 비교적 많은 양의 데이터가 반복 전송되므로 성능 저하 발생 가능성이 있음.
- 데이터 노출로 인해 보안 문제가 발생할 수 있음.
위와 같은 단점을 보완하기 위해 JWT를 사용하기 시작했다.
JWT의 구성
aaaaaaa.bbbbbbb.ccccccc //헤더.페이로드.시그니처
헤더, 페이로드, 시그니처로 나뉘어 있다.
- 헤더: 토큰 타입이며, 암호화 알고리즘을 명시한다.
- 페이로드: JWT에 넣을 데이터와 발급, 만료일 등을 명시한다.
- 시그니처: 헤더와 페이로드가 변조 되었는지 판별하는 역할을 한다.
토큰 방식은 토큰 그 자체로서 보안 및 데이터를 관리하며,
세션 방식은 서버에 보안 및 데이터를 관리한다.
이 두 방식의 큰 차이는 보안이 뚫릴 때에 있다. 세션 방식이 뚫린다면 세션을 만료시켜 추가 피해를 막을 수 있다.
하지만 토큰 방식이라면 토큰을 만료시키거나 하는 방법을 할수가 없다.
여기서 메모리나 DB에 저장해두고 그 데이터를 지우면 되는 것이 아닌가? 하는 생각이 든다면 그것은 토큰 방식이 아닌 토큰을 사용하는
세션 기반의 인증방식이라고 하는 게 맞다.
따라서, 이때 사용할 방법은 리프레시 토큰을 사용해야 한다.
- 엑세스 토큰: 서버 API를 직접 요청할 때 사용한다.
- 리프레시 토큰: 엑세스 토큰이 만료되었을 때 엑세스 토큰을 재발급할 목적으로 사용한다.
클라이언트와 서버 간의 API 통신 중, 토큰이 탈취당할 수 있기 때문에 두 종류의 토큰으로 분리하여 사용한다.
이 토큰 방식은 중간에 탈취당하는 등의 보안 문제를 고려하기 때문에 엑세스 토큰에는 중요한 값을 넣지 않고 사용한다.
따라서 토큰에는
가장 쓸모없는 데이터를 사용하고, 이와 동시에 서버에서 유저를 식별할 수 있는 데이터로 설정하는 것이 가장 좋은 방식이 될 것이다.