
JWT 토큰을 사용한 인증, 인가 구현시 refresh 토큰이 왜 필요한지에 대해 의문이 들었다. refresh 토큰이 탈취되면 엑세스 토큰에 짧은 만료기한을 줄지라도 무용지물이라고 생각했기 때문이다. 탈취한 refresh 토큰으로 access 토큰을 계속 발급받아 사용할 수 있기 때문이다. 이런점에서 refresh 토큰을 사용하지 않고 구현의 간편함을 위해 access 토큰에 긴 만료시간을 갖게해서 사용해도 되지 않을까? 라는 생각을 하게 되었다.
먼저 JWT 토큰을 사용하여 어떻게 인증, 인가 과정이 진행되는지 알아보자

(A) 클라이언트는 Authorization 서버에게 인증(로그인)과 엑세스 토큰 발급을 요청한다.
(B) Authorization 서버는 클라이언트를 인증하고, 엑세스 토큰과 리프레시 토큰을 발급한다.
(C) 클라이언트는 엑세스 토큰과 함께 Resource 서버에 보호된 리소스를 요청한다.
(D) Resource 서버는 엑세스 토큰을 검증하고, 보호된 리소스를 리턴한다. C, D과정을 반복한다.
(E) C, D과정을 반복하다가, 엑세스 토큰이 만료되었고, 만료된 엑세스 토큰으로 Resource 서버에게 요청을 보낸다.
(F) Resource 서버는 만료된 엑세스 토큰에 대해 검증을 실패한다.
(G) 클라이언트는 엑세스 토큰이 만료되었다는 것을 알게 되었다. 그래서 새로운 엑세스 토큰을 발급 받기 위해 리프레시 토큰을 Authorization 서버로 보낸다.
(H) Authorization 서버는 리프레시 토큰 검증에 성공하면, 새로운 엑세스 토큰과 새로운 리프레시 토큰을 발급한다.
(추가) 토큰 무효화기능이 필요하다.토큰에 대한 해쉬값을 토큰 블랙리스트 db에 넣어서, 토큰을 무효화 한다.
만약 리프레시 토큰 마저 만료되었다면? (A) 과정을 통해 새로운 엑세스 토큰과 리프레시 토큰을 다시 발급받으면 된다.
POST /login: 이메일, 비밀번호를 보내면 refreshToken과 accessToken을 리턴한다.