You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
4. ⚠️ 로그인 직후 이전 사용자 데이터 순간 노출 (Flash of Wrong Content)
Issue 1, 2가 해결되지 않은 상태에서, 사용자 B가 로그인하면:
TanStack Query가 캐시에서 사용자 A의 데이터를 즉시 렌더링 (stale-while-revalidate 동작)
백그라운드에서 사용자 B의 데이터를 fetch
응답이 오기 전까지 사용자 A의 알림 내용이 화면에 표시됨
hasUnread 레드닷도 이전 사용자의 읽지 않은 알림 여부를 기준으로 잘못 표시될 수 있습니다.
✅ 권장 수정 요약
문제
위치
수정 방법
로그아웃 시 캐시 미정리
useAuthStore.ts
logout()에 queryClient.clear() 추가
사용자 미식별 쿼리 키
useNotificationQueries.ts
키에 userId 포함
enabled 가드 누락
useNotificationQueries.ts
useNotificationSettingsQuery, useInfiniteNotificationsQuery에도 enabled 추가
가장 빠른 해결은 logout() 함수에서 queryClient.clear()를 호출하는 것입니다. queryClient를 Zustand store 외부에서 접근하려면 싱글톤 패턴으로 QueryClient 인스턴스를 관리하거나, 로그아웃 처리 로직을 컴포넌트 레이어로 올려서 useQueryClient() 훅을 활용하는 방법을 고려해 보세요.
Tip
For best results, initiate chat on the files or code changes.
🧩 Analysis chain
🏁 Script executed:
Length of output: 18608
@shinwokkang코드베이스를 분석한 결과, TanStack Query 캐시에 이전 사용자 데이터가 잔류할 수 있는 문제점들을 아래와 같이 정리했습니다.🔍 발견된 문제 목록
1. 🚨 [가장 심각] 로그아웃 시 캐시를 초기화하지 않음
useAuthStore의logout()함수는 쿠키 제거와 Zustand 상태 리셋만 수행합니다.TanStack Query의 기본
gcTime(구cacheTime)은 5분입니다. 즉, 로그아웃 후 5분 이내에 다른 사용자가 로그인하면, 이전 사용자의 알림 데이터가 캐시에 그대로 남아있어 새 사용자에게 노출될 수 있습니다.해결책:
logout()시queryClient.clear()호출2. 🚨 사용자 식별자가 없는 쿼리 키
현재 모든 알림 관련 쿼리 키에 사용자 ID가 포함되지 않습니다.
사용자 A가 로그아웃하고 사용자 B가 로그인하더라도 쿼리 키가 동일하기 때문에, TanStack Query는 기존 캐시를 그대로 재사용합니다. 위 Issue 1이 해결되어도, 이 구조가 유지되는 한 근본적으로 안전하지 않습니다.
해결책: 쿼리 키에
userId포함3.⚠️
useNotificationSettingsQuery,useInfiniteNotificationsQuery에enabled가드 없음이번 PR에서
useNotificationPreviewQuery에는enabled옵션이 추가되었지만, 나머지 두 쿼리에는 아직 적용되지 않았습니다.4.⚠️ 로그인 직후 이전 사용자 데이터 순간 노출 (Flash of Wrong Content)
Issue 1, 2가 해결되지 않은 상태에서, 사용자 B가 로그인하면:
hasUnread레드닷도 이전 사용자의 읽지 않은 알림 여부를 기준으로 잘못 표시될 수 있습니다.✅ 권장 수정 요약
useAuthStore.tslogout()에queryClient.clear()추가useNotificationQueries.tsuserId포함enabled가드 누락useNotificationQueries.tsuseNotificationSettingsQuery,useInfiniteNotificationsQuery에도enabled추가가장 빠른 해결은
logout()함수에서queryClient.clear()를 호출하는 것입니다.queryClient를 Zustand store 외부에서 접근하려면 싱글톤 패턴으로 QueryClient 인스턴스를 관리하거나, 로그아웃 처리 로직을 컴포넌트 레이어로 올려서useQueryClient()훅을 활용하는 방법을 고려해 보세요.