인증에 필요한 정보들을 암호화시킨 토큰을 사용해 인증하는 방식.
사용자가 Access Token을 HTTP 헤더에 실어 서버로 보낸다.
토큰의 구성 요소 :
최종적인 토큰의 모습 : Encoded Header + “.” + Encoded Payload + “.” + Verify Signature
Header, Payload는 인코딩되어 16진수로 변경되지만, 따로 암호화되지는 않는다. 따라서 Header, Payload는 디코딩만으로 누구나 쉽게 확인할 수 있다.
Verify Signature는 SECRET KEY를 알지 못하면 복호화할 수 없다.
인증 과정 :
세션/쿠키 인증 방식과의 차이점 :
장점 :
단점 :
Access Token (JWT)를 이용한 인증 방식의 문제점 : 제3자에게 토큰을 탈취당할 경우 보안에 취약할 수 있다. 이 점을 해결하기 위해 유효기간을 짧게 하면, 그만큼 사용자가 로그인을 자주 해야 하는 불편함이 생긴다.
Access Token의 유효기간을 짧게 하면서도, 사용자의 불편함을 줄일 수 있는 방법으로 나온 것이 Refresh Token이다.
Refresh Token은 Access Token과 똑같은 형태의 JWT이다. Refresh Token은, 처음에 로그인을 완료했을 때 Access Token과 동시에 발급된다. Refresh Token은 긴 유효기간을 가지면서, Access Token이 만료되었을 때 Access Token을 새로 발급해주는 열쇠로 사용된다.
Refresh Token의 유효기간이 만료되었을 경우에만 사용자가 새로 로그인을 하면 된다. 단, Refresh Token도 탈취될 가능성이 있기 때문에 적절한 유효기간 설정이 필요하다. (주로 2주 정도)
사용자 로그인 -> 서버에서 사용자 확인(회원 DB에서 ID, PW 값 비교) -> 로그인 완료
서버에서 Access Token, Refresh Token 발급, 응답에 담아 보냄 (이 때 일반적으로 회원DB에 Refresh Token을 저장해 둠)
사용자는 Refresh Token을 안전한 저장소에 저장한 후, Access Token만 헤더에 실어 요청을 보냄.
서버에서 Access Token을 검증한 후 응답함.
Access Token이 만료된 경우, 사용자는 Refresh Token과 Access Token을 같이 서버로 보냄.
서버는 받은 Access Token과 (조작 여부 확인) Refresh Token (회원 DB에 저장해둔 Refresh Token과 대조)을 확인한 후, 새로운 Access Token을 발급해 준다.
사용자는 새로 발급받은 Access Token을 헤더에 실어 다시 API 요청을 진행한다.
장점 : Access Token만 사용할 때보다 안전하다.
단점 : 검증 프로세스가 길어 구현이 복잡해졌다. Access Token이 만료될 때마다 재발급하는 과정에서 생기는 HTTP 요청횟수가 많아 서버의 자원 낭비가 발생한다.