강화된 JWT (Access Token / Refresh Token)
기존 JWT와의 차이점
- JWT의 문제점은 제 3자에게 토큰을 탈취당할 경우 보안이 취약해진다는 점이다.
- 기존 JWT 방식에서 보안을 높이기 위해 토큰의 유효기간을 단축시킬 경우 그만큼 사용자는 로그인을 더욱 자주 해줘야 하는 불편함이 있다.
- 유효기간을 짧게하면서 보안은 향상 시키는 방법으로 기존 Access Token과 더불어 Refresh Token이라는 새로운 토큰도 발급하는 방법이 생겨났다.
- Access Token
- 기존의 JWT에서의 Access Token과 같다.
- Refresh Token
- Access Token과 같은 형태의 JWT이다.
- 처음에 로그인을 완료할때 Access Token과 동시에 발급된다.
- 긴 유효기간
- 유효기간이 짧은 Access Token이 만료되었을때 새로 발급해주는 열쇠가 된다.
- 작동방식
- 사용자가 정상적으로 로그인을 시도하면, 서버로부터 Access Token과 Refresh Token을 부여받는다.
- 이때 일반적으로 Refresh Token은 회원 DB에 저장된다.(비교적 더 안전한 저장소)
- 사용자가 Access Token이 만료되기까지 기존의 방식대로 api를 요청하고(Access Token은 헤더에 실어서 요청을 보낸다.) 서버 역시 기존의 방식대로 요청을 검증하여 api를 수행한다.
- Access Token이 만료되면 서버는 Access Token의 만료를 확인하고 권한없음 신호를 보낸다.
- 사용자는 Refresh Token과 Access Token을 서버로 보낸다.
- 서버는 Access Token이 정상적인지 확인 후, Access Token과 Refresh Token을 비교하여 정상적이라면 새로운 Access Token을 발급해준다.
- 2번으로 돌아간다.
- 장점
- 단점
- 구현이 복잡하다.
- Access Token이 만료되어 새로 발급되는 과정에서 생기는 HTTP 요청 횟수가 많아 서버의 자원 낭비가 발생한다.
- 질문들
- Q 왜 Access Token만 사용하면 사용하면 보안이 취약한가
- A 서버에서는 한 번 Token을 발급하고 나면 정보를 저장하지 않고 정상적인 사용자라고 인식하기 때문에 Token의 만료 시간까지 없앨 수 없다.
- Q Access Token이 만료되기 직전에 새로운 Access Token을 자동으로 발급 해주도록 하면 되지 않은가
- A Access Token은 정상적인 로그인 시에만 발급된다. 정상적인 로그인은 사용자의 ID와 PW가 필요하고 이는 재로그인이 필요하다는 뜻이며 따라서 Access Token은 로그인 과정을 거치지 않으면 발급될 수 없다.