결론부터 말하자면... Access Token의 단점을 보완하려고!
Access Token의 Stateless 특성
JWT Access Token은 상태 정보를 서버에 저장하지 않고 클라이언트에게 전달되어 검증되는데, 이로 인해 탈취당한 경우를 대비하기 어렵습니다. 따라서 Access Token의 만료 기간을 짧게 설정하여 보안을 강화하는데 문제가 발생할 수 있습니다.
그.러.나
Access Token의 만료 기간을 짧게 설정하면 보안은 높아질 수 있지만, 사용자 편의성은 감소합니다. 사용자가 로그인 후 자주 Access Token을 재발급받아야 하는 번거로움이 발생할 수 있습니다.
그래서 Refresh Token을 사용합니다.
Refresh Token은 Access Token이 만료되었을 때만 사용되며, 상대적으로 더 긴 유효 기간을 가집니다. 따라서 탈취당할 위험이 적어집니다. Refresh Token을 사용하면 만료 기간이 긴 Access Token을 발급하지 않아도 됩니다. 사용자는 자주 로그인하지 않아도 되며, 대신 Refresh Token을 사용하여 Access Token을 재발급 받습니다. 이로써 보안과 사용자 경험을 모두 보장할 수 있습니다.
Refresh Token을 사용할 때 서버는 발급한 Refresh Token을 저장하고, Access Token 재발급 요청 시 저장된 내용과 비교하여 유효성을 검증합니다. 이를 통해 탈취된 Refresh Token으로부터의 공격을 방지할 수 있습니다. 또한, 매번 Refresh Token을 사용할 때마다 새로운 Token을 생성하여 공격자가 훔친 Refresh Token이 무의미해지도록 할 수 있습니다.
Refresh Token을 사용할 때 주의할 것
1. 토큰 갱신 주기 조정
Refresh Token의 만료 기간은 Access Token보다 길게 설정되지만, 너무 길게 설정하면 보안 위험이 커질 수 있습니다. 따라서 적절한 갱신 주기를 선택하여 사용자 편의성과 보안을 균형있게 유지해야 합니다.
2. Refresh Token 저장 보안
발급한 Refresh Token은 안전한 저장소에 저장되어야 합니다. 서버 측에서는 데이터베이스나 안전한 저장 매체를 활용하여 Refresh Token을 저장하여 탈취를 방지해야 합니다. 이번 프로젝트의 경우 Redis에 저장합니다.
관련 글: https://un-lazy-midnight.tistory.com/160
3. Access Token 갱신 제어
Refresh Token을 통한 Access Token 재발급은 사용자의 명시적인 요청에 의해 이루어져야 합니다. 이를 통해 사용자가 원하지 않는 갱신을 방지하고 보안을 강화할 수 있습니다. 이번 프로젝트의 경우 재발급 API으로 요청합니다.
관련 글: https://un-lazy-midnight.tistory.com/170