JWT란 JSON Web Token의 약자로, 인증에 필요한 정보들을 암호화한 JSON토큰을 의미한다.
JWT 기반 인증은 JWT 토큰을 HTTP 헤더에 실어서 서버가 클라이언트를 식별하는 방식이다.
JWT는 JSON 데이터를 Base64 URL-safe-Encode를 통해 인코딩을 직렬화 한 것이며, 토큰 내부에는 위•변조 방지를 위한 개인키를 통한 전자서명도 들어가 있다.
따라서 사용자가 JWT를 서버로 전송하면 서버는 서명을 검증하는 과정을 거치고, 검증이 완료되면 요청한 응답을 돌려준다.
JWT는 구분자 .을 통해 나누어지는 세가지 문자열의 조합이다.
이 .을 기준으로 각각 Header, Payload, Signature를 의미한다.
JWT에서 사용할 타입과 해시 알고리즘의 종류가 담겨있다.
서버에서 첨부한 사용자 권한 정보와 데이터가 담겨있다.
단, Payload는 해독이 가능하기에 중요한 정보는 포함되어서는 안된다.
Header, Payload를 Base64 URL-safe Encode를 한 이후 Header에 명시된 해시함수를 적용하고, 개인키로 서명한 전자서명이 담겨있다.
사용자가 로그인을 하면, 서버에서는 계정 정보를 읽어서 사용자를 확인 후, 사용자 고유 ID값을 부여하고, 기타 정보와 함께 Payload에 넣는다.
JWT의 유효기간을 설정하고, 암호화할 SECRET KEY를 이용해서 Access Token을 발급한다.
사용자는 Access Token을 받아서 로컬 스토리지(혹은 쿠키)에 저장한 후, 인증이 필요한 요청마다 토큰을 헤더에 실어서 보낸다.
서버에서는 해당 토큰의 Verify Signature를 SECRET KEY를 복호화한 뒤, 조작 여부 및 유효 기간을 확인한다.
검증이 완료되면, Payload를 디코딩하여 사용자의 ID에 맞는 데이터를 가져온다.
Header와 Payload를 가지고 Signature를 생성해서 데이터의 위 • 변조를 막을 수 있다.
인증 정보에 대한 별도의 저장소가 필요 없다.
토큰 기반으로 다른 로그인 시스템에 접근 및 권한 공유가 가능하다.
JWT는 발급한 후 검증만 하면 되기 때문에, Stateless한 서버를 만드는 입장에서 용이하다.
이미 발급된 JWT에 대해서는 돌이킬 수 없다.
Payload의 정보가 제한적이다.
인증이 필요한 요청이 많아질수록 서버의 리소스가 낭비된다.
첫번째 단점인 발급한 JWT의 유효기간에 대한 문제를 해결하기 위한 것이 바로 Refresh Token이다.
Access Token과 Refresh Token으로 이중으로 나누어 인증을 한다.
처음 로그인 시, Access Token과 같이 발급되는 Refresh Token은 긴 유효기간을 가지면서, Access Token이 만료되었을 때 새로 발급해주는 열쇠가 된다.
즉, Access Token의 유효기간을 짧게 하고, 만료될 때마다 Refresh Token을 통해 새로 발급을 받음으로서 보안을 조금이라도 더 안전하게 한 것이다.
