JWT(JSON Web Token)은 인증에 필요한 정보들을 암호화시킨 JSON 토큰을 의미한다.
토큰(Access Token) 은 세션과는 달리 서버가 아닌 클라이언트에 저장되기 때문에, 메모리나 스토리지 등을 통해 세션을 관리했던 서버의 부담을 덜 수 있다는 장점이 있다.
JWT는 토큰 자체에 사용자의 권한 정보 혹은 서비스를 사용하기 위한 정보를 포함시키기 때문에, 데이터가 많아지면 토큰이 커진다는 특성이 있다.
또한 토큰이 한번 발급되었다면, 사용자의 정보를 바꾸더라도 토큰을 재발급하지 않는 이상 반영되지 않는다.
즉, JWT 토큰을 HTTP 헤더에 실어 서버가 클라이언트를 식별하는 방법이다.
JWT는 .
을 구분자로 Header
, Payload
, Signature
로 구성된다.
JWT에서 사용할 타입과 해시 알고리즘의 종류가 담겨있다
서버에서 첨부한 사용자 권한 정보와 데이터가 담겨있다.
Header, Payload 를 Base64 URL-safe Encode 를 한 이후 Header 에 명시된 해시함수를 적용하고, 개인키(Private Key)로 서명한 전자서명이 담겨있다.
전자서명에는 비대칭 암호화 알고리즘을 사용하므로 암호화를 위한 키와 복호화를 위한 키가 다르다. 암호화(전자서명)에는 개인키를, 복호화(검증)에는 공개키를 사용한다.
- 사용자가 ID, PW를 입력하여 서버에 로그인 인증을 요청한다.
- 서버가 클라이언트로부터 인증 요청을 받으면 Header, Payload, Signature를 정의한다.
(Hedaer, PayLoad, Signature를 각각 Base64로 한 번 더 암호화하여 JWT를 생성하고 이를 쿠키에 담아 클라이언트에게 발급한다.)
- 클라이언트는 서버로부터 받은 JWT를 로컬 스토리지에 저장한다. (쿠키나 다른 곳에 저장할 수도 있다.)
(API를 서버에 요청할때 Authorization header에 Access Token을 담아서 보낸다.)
- 서버가 할 일은 클라이언트가 Header에 담아서 보낸 JWT가 내 서버에서 발행한 토큰인지 일치 여부를 확인하여 일치한다면 인증을 통과시켜주고 아니라면 통과시키지 않으면 된다.
(인증이 통과되었으므로 페이로드에 들어있는 유저의 정보들을 select해서 클라이언트에 돌려준다.)
- 클라이언트가 서버에 요청을 했는데, 만일 액세스 토큰의 시간이 만료되면 클라이언트는 리프래시 토큰을 이용해서 서버로부터 새로운 엑세스 토큰을 발급 받는다.
장점
1. Cookie만 사용하는 방식보다 보안이 향상된다.
2. 서버 쪽에서 Session 통제 가능하다.
3. 네트워크 부하 가능성이 낮다.
단점
1. 세션 저장소 사용으로 서버가 부하된다.
장점
1. 인증을 위한 별도의 저장소가 필요가 없다.
2. 별도의 I/O 작업이 없는 빠른 인증 처리가 가능하다.
3. 확장성이 우수하다.
4. Header와 Payload를 가지고 Signature를 생성하기 때문에 데이터의 위변조를 막을 수 있다.
5. 토큰 기반으로 다른 로그인 시스템에 접근 및 권한 공유가 가능하다.
6. 모바일 어플리케이션 환경에서도 잘 작동한다.
단점
1. 토큰의 길이가 늘어날수록 네트워크가 부하된다.
2. 특정 토큰을 강제로 만료시키기가 어렵다.
📚 Reference