[Fix] refreshToken이 유효하지 않을 때 무한 새로고침 발생하는 버그 수정#395
Conversation
|
Important Review skippedAuto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
Tip Try Coding Plans. Let us write the prompt for your AI agent so you can ship faster (with fewer bugs). Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
🎭 Playwright Report✨ E2E Test가 성공적으로 완료되었습니다. Test 요약 내용을 확인해주세요.
📊 Test Summary
📜 Test Details✅ Passed Tests (3)
|
📊 Coverage Report
📉 #395을 main에 병합하면 coverage가 Coverage 요약@@ Coverage Diff @@
## main #395 +/- ##
===========================================
- Coverage 35.36% 35.24% -0.12%
===========================================
Files 264 264 0
Lines 12104 12142 +38
Branches 474 474 0
===========================================
Hits 4280 4280 0
+ Misses 7824 7862 +38 영향받은 파일
|
🎨 Storybook Report✨ Story가 변경되었습니다 Chromatic에서 비주얼 변경사항을 확인하세요.
|
🚀 PR Preview Report✨ Build가 성공적으로 완료되었습니다. Preview에서 변경사항을 확인하세요.
|
📝 변경 사항
refreshToken 무한 새로고침 버그픽스 변경사항
커밋 히스토리
49539f69113e371. refreshToken 무한 새로고침 버그 수정
버그 원인
refreshToken이 쿠키에 존재하지만 유효하지 않은 경우, 아래 흐름이 무한 반복되는 버그가 존재했음.refresh 실패 시
refreshToken쿠키를 삭제하지 않아, 매 요청마다 유효하지 않은refreshToken으로 refresh를 반복하는 구조적 문제였음.수정 1.
proxy.ts- refresh 실패 시refreshToken쿠키 삭제refresh 실패 시
refreshFailed플래그를 세우고,refreshToken쿠키를 즉시 삭제하도록 수정.수정 2.
proxy.ts-/loginredirect 시에도refreshToken쿠키 삭제member-only 경로에서 refresh 실패 시
/login으로 redirect하는 응답 객체에도 별도로 쿠키 삭제를 적용.수정 3.
proxy.ts-API.authService.refresh()→fetch직접 호출로 교체기존에는
API.authService.refresh()를 통해 refresh를 호출했으나,createApiHelper가 응답 body만 반환하고 헤더를 버리는 구조로 인해 백엔드의Set-Cookie: refreshToken헤더가 브라우저에 전달되지 않는 문제가 있었음.백엔드는 Refresh Token Rotation 방식을 사용하므로 refresh 요청마다 새로운
refreshToken을Set-Cookie로 발급함. 이 헤더를 브라우저에 포워딩하기 위해fetch를 직접 호출하는 방식으로 변경.2. axios interceptor -
/login경로에서 redirect 방지버그 원인
axios interceptor의 401 처리에서 refresh 실패 시
/login으로 redirect하는데, 이미/login페이지에 있는 경우에도 redirect가 발생하여 불필요한 루프가 생길 수 있었음.수정 후 시나리오별 동작
/loginredirect (refreshToken 유지 → 무한루프)/loginredirect + refreshToken 삭제/login에서 API 401 발생/login으로 재redirect변경된 파일 목록
src/proxy.tssrc/api/core/base/index.ts/login경로 redirect 방지 조건 추가)TODO
에러 유형별 사용자 안내 메시지 처리
현재 모든 401 에러(토큰 만료, 중복 로그인, 위조 토큰 등)에 대해
/login?error=unauthorized로 redirect만 할 뿐, 사용자에게 구체적인 원인을 안내하지 않음.백엔드 명세(동시 로그인 제한 기능)에 따라 에러코드별로 다른 메시지를 노출하도록 개선 필요.
EXPIRED_TOKEN/loginredirectDUPLICATE_LOGIN/loginredirect(→/login에서 재redirect 무한루프 발생 → 수정 완료)INVALID_TOKEN/loginredirectNOT_FOUND_TOKEN/loginredirectDUPLICATE_LOGIN관련 이슈 (수정 완료)DUPLICATE_LOGIN에러 발생 시 axios interceptor가/login으로 redirect하는데, 이미/login페이지에 있는 경우 다시/login으로 redirect가 반복되는 무한루프 문제가 있었음.2번 항목(axios interceptor - /login 경로에서 redirect 방지)에서 함께 수정됨.구현 방향
errorCode를 파싱하여/login?error={errorCode}형태로 redirect/login페이지에서errorquery param에 따라 toast 또는 안내 문구 노출🔗 관련 이슈
Closes #
🧪 테스트 방법
📸 스크린샷 (선택)
📋 체크리스트
💬 추가 코멘트
CodeRabbit Review는 자동으로 실행되지 않습니다.
Review를 실행하려면 comment에 아래와 같이 작성해주세요