Skip to content

Commit eee50c2

Browse files
SOIVclaude
andcommitted
fix(auth): 세션 무효화 시 즉시 로그인 페이지 이동 보장
페이지 새로고침(F5) 후 sessionStorage에서 인증 상태를 복원할 때 handleLoginSuccess를 거치지 않아 sessionExpiredHandler가 미등록되는 버그 수정. isAuthenticated 상태 변화를 감지하는 useEffect로 핸들러 등록을 일원화: - 로그인 시, 새로고침 후 복원 시 모두 자동 등록 - 로그아웃 시 useEffect cleanup으로 자동 해제 이제 서버 재부팅·토큰 만료 등 세션 무효화 상황에서 앱이 "로그인 된 척" 상태로 멈추지 않고 즉시 로그인 화면으로 이동. 단순 유휴 상태라면 refresh 토큰으로 자동 갱신돼 로그인 유지. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent fd8f0d7 commit eee50c2

1 file changed

Lines changed: 10 additions & 4 deletions

File tree

apps/web/src/main.tsx

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,16 @@ function App() {
173173
return () => window.removeEventListener("hashchange", handleHashChange);
174174
}, []);
175175

176+
// 페이지 새로고침 후 세션 복원 시에도 만료 핸들러 등록
177+
// (handleLoginSuccess를 거치지 않고 sessionStorage에서 바로 복원되는 경우 대응)
178+
useEffect(() => {
179+
if (isAuthenticated) {
180+
setSessionExpiredHandler(() => onLogout(true));
181+
}
182+
return () => setSessionExpiredHandler(null);
183+
// eslint-disable-next-line react-hooks/exhaustive-deps
184+
}, [isAuthenticated]);
185+
176186
// 관리자 PIN 세션 30분 만료
177187
useEffect(() => {
178188
if (!isPinVerified || pinVerifiedAt === null) return;
@@ -223,8 +233,6 @@ function App() {
223233
setLoginLockedUntil(null);
224234
setSessionExpired(false);
225235
setIsAuthenticated(true);
226-
// 세션 만료 시 자동 로그아웃 콜백 등록
227-
setSessionExpiredHandler(() => onLogout(true));
228236
setIsAdmin(isAdmin);
229237
if (isAdmin) sessionStorage.setItem(SS.admin, "true");
230238
setCurrentUser({ email });
@@ -372,8 +380,6 @@ function App() {
372380
};
373381

374382
const onLogout = (expired = false) => {
375-
// 세션 만료 핸들러 해제 (중복 호출 방지)
376-
setSessionExpiredHandler(null);
377383
// 토큰이 있으면 서버 세션 폐기 (실패해도 로컬 상태는 초기화)
378384
const token = sessionStorage.getItem(SS.token);
379385
if (token) {

0 commit comments

Comments
 (0)