Merge pull request '모바일 환경 세션 타임아웃 연장 (30분 → 24시간)' (#274) from common/feat/dashboard-map into main
Reviewed-on: http://39.117.244.52:3000/kjs/ERP-node/pulls/274
This commit is contained in:
commit
6735142db4
|
|
@ -16,6 +16,31 @@ interface AuthProviderProps {
|
||||||
children: React.ReactNode;
|
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(() => {
|
useEffect(() => {
|
||||||
if (isLoggedIn) {
|
if (isLoggedIn) {
|
||||||
|
// 모바일 환경 여부에 따라 타임아웃 시간 조정
|
||||||
|
const isMobile = isMobileEnvironment();
|
||||||
|
|
||||||
|
// 모바일: 24시간 (JWT 토큰 만료 시간과 동일), 데스크톱: 30분
|
||||||
|
const maxInactiveTime = isMobile ? 86400000 : 1800000;
|
||||||
|
// 모바일: 1시간 전 경고, 데스크톱: 5분 전 경고
|
||||||
|
const warningTimeConfig = isMobile ? 3600000 : 300000;
|
||||||
|
|
||||||
// 세션 매니저 초기화
|
// 세션 매니저 초기화
|
||||||
const manager = initSessionManager(
|
const manager = initSessionManager(
|
||||||
{
|
{
|
||||||
checkInterval: 60000, // 1분마다 체크
|
checkInterval: 60000, // 1분마다 체크
|
||||||
warningTime: 300000, // 5분 전 경고
|
warningTime: warningTimeConfig,
|
||||||
maxInactiveTime: 1800000, // 30분 비활성 시 만료
|
maxInactiveTime: maxInactiveTime,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
onWarning: (remainingTime: number) => {
|
onWarning: (remainingTime: number) => {
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,10 @@
|
||||||
/**
|
/**
|
||||||
* 세션 관리 유틸리티
|
* 세션 관리 유틸리티
|
||||||
* 세션 만료 감지, 자동 로그아웃, 세션 갱신 등을 담당
|
* 세션 만료 감지, 자동 로그아웃, 세션 갱신 등을 담당
|
||||||
|
*
|
||||||
|
* 모바일/데스크톱 환경별 타임아웃 설정:
|
||||||
|
* - 데스크톱: 30분 비활성 시 만료, 5분 전 경고
|
||||||
|
* - 모바일: 24시간 비활성 시 만료, 1시간 전 경고 (WebView localStorage 초기화 이슈 대응)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
interface SessionConfig {
|
interface SessionConfig {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue