From 7725cd1e870c0b39e03af00bba1f67ab692211af Mon Sep 17 00:00:00 2001 From: dohyeons Date: Thu, 11 Dec 2025 11:17:52 +0900 Subject: [PATCH] =?UTF-8?q?=EB=AA=A8=EB=B0=94=EC=9D=BC=20=ED=99=98?= =?UTF-8?q?=EA=B2=BD=20=EC=84=B8=EC=85=98=20=ED=83=80=EC=9E=84=EC=95=84?= =?UTF-8?q?=EC=9B=83=20=EC=97=B0=EC=9E=A5=20(30=EB=B6=84=20=E2=86=92=2024?= =?UTF-8?q?=EC=8B=9C=EA=B0=84)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/contexts/AuthContext.tsx | 37 +++++++++++++++++++++++++++++-- frontend/lib/sessionManager.ts | 4 ++++ 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/frontend/contexts/AuthContext.tsx b/frontend/contexts/AuthContext.tsx index 2e93aa57..c49c4ad4 100644 --- a/frontend/contexts/AuthContext.tsx +++ b/frontend/contexts/AuthContext.tsx @@ -16,6 +16,31 @@ interface AuthProviderProps { children: React.ReactNode; } +/** + * 모바일 환경 감지 함수 + * WebView, 모바일 브라우저 등을 감지 + */ +function isMobileEnvironment(): boolean { + if (typeof window === "undefined") return false; + + const userAgent = navigator.userAgent.toLowerCase(); + + // 모바일 기기 감지 + const isMobileDevice = /android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini/i.test(userAgent); + + // WebView 감지 (앱 내 브라우저) + const isWebView = + /wv/.test(userAgent) || // Android WebView + /webview/.test(userAgent) || + (window as unknown as { webkit?: unknown }).webkit !== undefined || // iOS WKWebView + /fb_iab|fban|fbav/.test(userAgent) || // Facebook 앱 내 브라우저 + /instagram/.test(userAgent) || // Instagram 앱 내 브라우저 + /kakaotalk/.test(userAgent) || // 카카오톡 앱 내 브라우저 + /naver/.test(userAgent); // 네이버 앱 내 브라우저 + + return isMobileDevice || isWebView; +} + /** * 인증 컨텍스트 프로바이더 * 전역 세션 관리 및 세션 만료 경고 처리 @@ -29,12 +54,20 @@ export function AuthProvider({ children }: AuthProviderProps) { // 세션 매니저 초기화 및 정리 useEffect(() => { if (isLoggedIn) { + // 모바일 환경 여부에 따라 타임아웃 시간 조정 + const isMobile = isMobileEnvironment(); + + // 모바일: 24시간 (JWT 토큰 만료 시간과 동일), 데스크톱: 30분 + const maxInactiveTime = isMobile ? 86400000 : 1800000; + // 모바일: 1시간 전 경고, 데스크톱: 5분 전 경고 + const warningTimeConfig = isMobile ? 3600000 : 300000; + // 세션 매니저 초기화 const manager = initSessionManager( { checkInterval: 60000, // 1분마다 체크 - warningTime: 300000, // 5분 전 경고 - maxInactiveTime: 1800000, // 30분 비활성 시 만료 + warningTime: warningTimeConfig, + maxInactiveTime: maxInactiveTime, }, { onWarning: (remainingTime: number) => { diff --git a/frontend/lib/sessionManager.ts b/frontend/lib/sessionManager.ts index d0fe7b1d..c5ca47f4 100644 --- a/frontend/lib/sessionManager.ts +++ b/frontend/lib/sessionManager.ts @@ -1,6 +1,10 @@ /** * 세션 관리 유틸리티 * 세션 만료 감지, 자동 로그아웃, 세션 갱신 등을 담당 + * + * 모바일/데스크톱 환경별 타임아웃 설정: + * - 데스크톱: 30분 비활성 시 만료, 5분 전 경고 + * - 모바일: 24시간 비활성 시 만료, 1시간 전 경고 (WebView localStorage 초기화 이슈 대응) */ interface SessionConfig {