JWT란
- JSON Web Token의 약자로 모바일이나 웹의 사용자 인증을 위해 사용하는 암호화된 토큰을 의미한다.
- JSON 객체를 사용하여 가볍고 자가수용적인 방식으로 정보를 안정성 있게 전달해주기 위한 토큰이다.
- JWT 정보를 request에 담아 사용자의 정보 열람, 수정 등 개인적인 작업을 수행할 수 있게 한다.
JWT의 구성요소
- 헤더(header) : 토큰의 타입과 해시 암호화 알고리즘으로 구성되어 있다.
- 페이로드(payload) : 토큰에 담을 정보가 들어있다.
- 이 곳에 담은 정보의 한 조각을 클레임(claim)이라 부르고(한 토큰에 여러 클레임을 담을 수 있다.) 이는 name/value 한 쌍으로 이루어져있다.
- 클레임의 종류는 3가지로 등록된 클레임, 공개 클레임, 비공개 클레임이 있다.
- 서명(signature) : 토큰의 무결점을 검증하기 위한 값 / header와 payload, secret key로 구성된 문자열을 정해진 알고리즘으로 hashing하여 만들어진다.
JWT의 사용 목적
- 회원인증 : 기존에 세션을 이용한 방식으로 인해 stateful했던 서버를 stateless하게 만들어준다.
- stateful : 사용자와 서버의 동작, 상태를 기억하는 것
- stateless : 이 전의 상태를 기억하지 않는 것
- 정보교류 : 데이터를 주고 받을때 안정성 있게 진행할 수 있게 도와준다.
JWT의 작동 방식
- 사용자가 정상적으로 로그인을 시도하면, 서버로부터 access 토큰을 부여받는다.
- 이후 사용자가 모든 api 요청을 시도할때 access 토큰을 헤더에 포함하여 시도한다.
- 서버는 access 토큰을 검증하여 해당 api를 수행한다.
- 토큰의 기한이 만료 되면 서버는 사용자의 access 토큰을 삭제하고 재로그인을 요청한다.
JWT의 장점
- 사용자 인증에 필요한 모든 정보를 토큰 자체에 포함하기 때문에 서버에서 별도의 저장소가 필요하지 않다.
- stateless(무상태) : 확장성이 있다. / 토큰값만 있으면 자유롭게 서버에 접근할 수 있기 때문에 세션을 따로 저장하여 여러 서버에 분산하여 요청할 필요가 없다.
- 보안성 : 쿠키를 전달하지 않아 쿠키의 취약점이 사라진다.
- 호환성 : 여러 플랫폼 및 도메인 어플리케이션이 커지면 여러 디바이스를 호환시키고 많은 서비스를 제공하게 되는데 그 때 토큰값만으로 요청을 손쉽게 처리할 수 있다.
JWT의 단점
- 네트워크 : 클레임에 넣는 데이터가 많아질스록 JWT 토큰의 길이도 길어진다. API 호출 시 매 호출마다 토큰 데이터를 서버에 전달해야 하기 때문에 이 경우 네트워크 대역폭 낭비가 발생한다.
- 보안 : 기본적으로 정보가 담겨있는 payload를 암호화 하지않아 중간에 토큰을 다른 사용자가 취득하게 되면 해당 데이터를 볼 수 있게 된다. 그래서 이를 보완하기 위한 추가 작업이 필요하다.
- 제어 : 상태를 저장하지 않기 때문에 한 번 생성되면 제어가 불가능하다. 임의로 삭제하는 것이 불가능하여 만료시간을 꼭 넣어주어야만 한다.