모바일 환경 세션 타임아웃 연장 (30분 → 24시간) #274

Merged
hyeonsu merged 2 commits from common/feat/dashboard-map into main 2025-12-11 11:18:49 +09:00
2 changed files with 39 additions and 2 deletions

View File

@ -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) => {

View File

@ -1,6 +1,10 @@
/**
*
* , ,
*
* / :
* - 데스크톱: 30분 , 5
* - 모바일: 24시간 , 1 (WebView localStorage )
*/
interface SessionConfig {