더 자세한 설명이 있는 블로그. 꼭 참고하세요.
velopert - [JWT] JSON Web Token 소개 및 구조
geunwoobaek - JWT란?
똑똑한 개발자 - JWT란 무엇인가
JWT (JSON Web Token) 이란?
JWT란 JSON Web Token의 약자로 웹 및 모바일에서 사용자 인증을 위해 사용되는 암호화된 토큰이다.
JWT의 구조


- 토큰의 타입, 해시알고리즘 정보가 들어간다.
- 헤더의 내용은 BASE64방식으로 인코딩해서 JWT의 가장 첫 부분에 기록된다.
PAYLOAD (내용)
- Payload에는 exp와 같이 만료시간을 나타내는 공개 클레임과 클라이언트와 서버간 협의하에 사용하는 비공개 클레임. 이 두가지 요소를 조합하여 작성한 뒤, BASE64 인코딩하여 두번째 요소로 위치한다.
- 예) {"user-id":1, "exp":1839247391}
SIGNATURE (서명)
- JWT가 원본 그대로라는 걸 확인할 때 사용하는 부분이다.
- 서명은 BASE64URL 인코드된 header와 payload 그리고 JWT secret(별도 생성) 을 헤더에 지정된 암호 알고리즘으로 암호화하여 전송한다. (복호화 가능)
- 프론트엔드가 JWT를 백엔드 API 서버로 전송하면 서버에서는 전송받은 JWT의 서명부분을 복호화하여 서버에서 생성한 JWT가 맞는지 확인한다.
- 계약서의 위변조를 막기위해 서로 사인하는 것과 같다고 보면 된다.
- 주의할 점은 header와 payload는 BASE64 인코딩한 것이므로(암호화가 아님) 누구나 원본을 볼 수 있으니 개인정보를 담아서는 안된다.
JWT는 어떤 상황에 사용되나?
회원 인증
JWT를 사용하는 가장 자주 사용하는 상황. JWT를 이용해서 유저가 회원 정보를 주고받으면 유저 정보를 세션에 유지할 필요없이 이용할 수 있다.
정보 교류
JWT는 두 개체 사이에서 안정성있게 정보를 교환하기에 좋은 방법이다. 정보를 보낸이가 바뀌진 않았는지, 정보가 도중에 조작되지는 않았는지 검증할 수 있다.
JWT 사용과정


- Authentication 절차(회원가입, 로그인)를 통해 토큰을 생성한다. 토큰에는 유저 정보를 확인할 수 있는 정보가 들어가 있어야 한다. (user id 등)
- 서버는 클라이언트에게 토큰을 보낸다.
- 클라이언트는 토큰을 가지고 있다가 필요시 서버에게 데이터를 요청한다. 요청을 할 때는 토큰을 첨부해서 보낸다.
- 서버는 클라이언트가 보낸 요청과 같이 온 토큰을 복호화해서 유저의 정보를 얻고 db에서 유저의 권한을 확인한다.
- 권한에 따라 응답을 한다. Unauthorized Response(401) 혹은 다른 에러 코드를 보낸다.
이전에 사용하던 인증 / 인가 방식

JWT 장점 및 단점
JWT 장점
- 무상태 (stateless). 기존에 서버에 세션을 저장하는 방식이 필요하지 않아서 서버에 부담이 덜하다.
- 확장성. 토큰을 사용하면 다른 서비스도 권한이 부여가 되고 선택적인 권한 부여가 가능하다. (앱에 SNS 로그인은 가능하지만 특정 기능 수행 불가 등)
- 보안 쿠키를 전달하지 않아도 되서 쿠키를 사용하면서 발생하는 취약점이 사라진다.
- 토큰을 사용하면 여러 디바이스를 사용해도 토큰만 유효하다면 요청이 정상적으로 처리된다.
JWT 단점
- claim에 넣는 데이터가 많아지면 JWT 토큰이 길어질 수 있다. 길이가 길어진다는 건 API 호출시마다 네트워크 대역폭 낭비가 심해질 수 있다는 뜻이다.
- 기본적으로 Payload를 암호화하지 않고 BASE64 인코딩만 하기에 중간에 패킷을 가로채거나 다른 방식으로 토큰을 취득하면 디코딩을 통해서 데이터를 볼 수 있다. 그래서 따로 암호화하거나 중요데이터를 Payload에 넣지 말아야한다.
- 계정 차단 및 비활성화해야될 때 완전히 적용디려면 유효했던 토큰이 만료될 때까지 기다려야한다.
- 사용자가 비밀번호를 변경하면 사전에 인증을 했던 이전 비밀번호로 생성된 토큰은 만료 될 때까지 유효하다.