JWT 토큰이란?
사용자 인증을 위해 사용하는 암호화된 토큰으로, 인증받은 사용자에게 토큰을 발급해주고 사용자는 헤더에 이 토큰 정보를 담아 특정 작업을 요청한다. 이러한 토큰은 서버에 따로 저장되지 않고 사용되기 때문에 stateless하다고 할 수 있다.
JWT 토큰은 헤더, 페이로드, 서명으로 구성되어 있다.
1. 헤더
-> 토큰 타입과, 암호화 알고리즘에 대한 정보가 담긴다.
{
"alg": "HS256",
"typ": "JWT"
}
2. 페이로드
토큰에 담을 정보가 들어가며, 정보의 한 조각을 클레임이라고 부른다. 클레임은 key, value 형태로 한 쌍을 이루고 있다.
2-1. 기본적으로 제공되는 클레임 : 발행시간, 만료 시간 등
2-2. 공개 클레임 :충돌을 방지하기 위해 URI 형식으로 이름을 갖는다.
2-3. 비공개 클레임 : 클라이언트와 서버 간에 사용되는 커스텀된 클레임이다.
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
3. 서명
토큰을 인코딩하거나 유효성 검증을 할 때 사용되며, 헤더와 페이로드를 암호화한 정보가 담겨 있다.
JWT토큰을 왜 사용할까요?
이전에는 사용자의 정보를 저장하고 관리(인가)하기 위해 쿠키와 세션을 사용했다. 하지만 이 둘은 다음과 같은 문제가 있다.
1. 쿠키
- 요청 시 쿠키의 값을 그대로 보내기 때문에 유출 및 조작 당할 위험이 존재한다.
- 용량 제한이 있어 많은 정보를 담을 수 없다.
- 웹 브라우저마다 쿠키의 지원 형태가 다르기 때문에 브라우저간의 공유가 불가능하다
2. 세션
- 사용자의 정보를 세션 저장소에 저장하고 쓰기 때문에 성능 이슈가 있을 수 있다.
- 세션 ID가 탈취되면 악용될 수 있는 단점이 있다.
토큰의 장점과 단점
1. 장점
토큰은 세션과 달리 세션 정보를 서버가 아닌 클라이언트 측에 저장하기 때문에 서버의 부담이 확 줄어 든다.
2. 단점
발급된 토큰이 유출이 되는 경우 session과 같이 악의적으로 사용될 가능성이 존재하다. 따라서 엑세스 토큰은 유효시간을 짧게 하고, 리프레시 토큰을 이용해 엑세스 토큰을 갱신하는 방향을 이용한다.