Refresh Token은 어떻게 동작할까

Refresh Token이란 무엇인가

웹 서비스에 로그인하면 서버는 사용자를 식별하기 위해 Access Token을 발급합니다. 하지만 Access Token은 탈취되었을 때 피해를 줄이기 위해 보통 수명이 짧게 설정됩니다(예: 15분~1시간). 문제는 사용자가 매번 짧은 시간마다 로그인을 다시 해야 한다면 불편하다는 점입니다. 이때 등장하는 것이 Refresh Token입니다. Refresh Token은 Access Token보다 훨씬 긴 수명(예: 2주~1개월)을 가지며, Access Token이 만료되었을 때 재로그인 없이 새로운 Access Token을 발급받기 위한 용도로만 사용됩니다.

동작 원리와 예시

비유하자면 Access Token은 ‘놀이공원 자유이용권’이고, Refresh Token은 ‘연간회원권’입니다. 자유이용권은 하루가 지나면 무효가 되지만, 연간회원권이 있으면 매표소에서 다시 발급받을 수 있습니다. 실제 흐름은 다음과 같습니다.

  • 로그인 성공 시 서버가 Access Token과 Refresh Token을 함께 발급
  • 클라이언트는 API 요청 시 Access Token을 ‘Authorization: Bearer …’ 헤더에 담아 전송
  • Access Token이 만료되면 401 에러 발생
  • 클라이언트는 저장해둔 Refresh Token을 ‘/auth/refresh’ 같은 엔드포인트로 전송
  • 서버는 Refresh Token의 유효성을 검증하고 새로운 Access Token(때로는 Refresh Token도 함께) 재발급

이 과정에서 Refresh Token은 일반적으로 httpOnly 쿠키나 안전한 서버 저장소에 보관해 자바스크립트로 직접 접근하지 못하게 막는 것이 보안상 중요합니다.

실무에서 왜 사용할까

Refresh Token을 쓰는 핵심 이유는 보안과 사용자 경험 사이의 균형입니다. Access Token 수명을 짧게 유지하면 탈취되더라도 피해 범위가 제한되고, Refresh Token 덕분에 사용자는 매번 로그인하는 불편을 겪지 않습니다. 또한 서버는 Refresh Token 목록을 DB에 저장해 특정 사용자의 토큰만 강제로 무효화(로그아웃, 탈취 감지 시 폐기)할 수 있어 세밀한 세션 제어가 가능합니다. 다만 Refresh Token 자체가 탈취되면 장기간 악용될 수 있으므로, 재발급 시마다 토큰을 교체하는 ‘Rotation’ 전략을 함께 적용하는 경우가 많습니다.

댓글 남기기