피드로 돌아가기
The JWT Refresh Race Condition Nobody Talks About (And How I Fixed It)
Dev.toDev.to
Security

JWT 중복 갱신으로 인한 강제 로그아웃 문제 해결 전략

The JWT Refresh Race Condition Nobody Talks About (And How I Fixed It)

Devil2026년 4월 7일3intermediate

Context

Proactive 타이머와 Reactive 인터셉터가 동시에 작동하는 JWT 갱신 구조. 동일한 Refresh Token으로 중복 요청이 발생하여 Token Rotation 정책에 의해 세션이 파괴되는 현상. 원인 불명의 무작위 로그아웃을 유발하는 레이스 컨디션 문제.

Technical Solution

  • Proactive 타이머와 Reactive 인터셉터 간의 상태 공유를 위한 단일 Lock 메커니즘 도입
  • acquireLock() 함수를 통한 현재 갱신 프로세스 진행 여부 확인 및 중복 요청 차단
  • 이미 갱신이 진행 중인 경우 enqueue()를 통해 요청을 대기 큐에 등록하는 방식
  • 토큰 갱신 완료 후 flushQueue()를 호출하여 대기 중인 모든 요청을 일괄 처리하는 구조
  • axios-refresh-sync 패키지를 통해 백엔드 종류와 저장소 방식에 상관없이 적용 가능한 추상화 설계
  • setTokensgetTokens 콜백 함수를 제공하여 localStorage나 Cookie 등 다양한 저장소 대응

Key Takeaway

비동기 환경에서 동일한 자원을 갱신하는 서로 다른 트리거가 존재할 경우, 상태 동기화를 위한 중앙 집중식 Lock 설계가 필수적임.


Token Rotation을 사용하는 JWT 환경에서 타이머 기반 갱신과 401 인터셉터를 함께 사용할 때 반드시 요청 큐잉(Queueing) 로직을 구현할 것

원문 읽기