diff --git a/src/App.js b/src/App.js index 0dd250e25c1216cfbf912f0c13ede69396ae6667..35f2d12a991eb51e711a5cf119cdcbe8015e0417 100644 --- a/src/App.js +++ b/src/App.js @@ -61,6 +61,34 @@ function App() { return null; }); + // 토큰 만료 체크 함수 + const checkTokenExpiration = () => { + const token = localStorage.getItem('token'); + if (token) { + try { + const decoded = jwt_decode(token); + if (decoded.exp * 1000 < Date.now()) { + // 토큰 만료시 로그아웃과 동일한 효과 + localStorage.removeItem('token'); + setUser(null); + setIsAuthenticated(false); + toast.info('세션이 만료되었습니다. 다시 로그인해주세요.'); + } + } catch (error) { + localStorage.removeItem('token'); + setUser(null); + setIsAuthenticated(false); + } + } + }; + + // 주기적으로 토큰 체크 (30초마다) + React.useEffect(() => { + const timer = setInterval(checkTokenExpiration, 30000); + // 컴포넌트가 언마운트될 때 타이머 정리 + return () => clearInterval(timer); + }, []); + const login = (userData) => { setUser(userData); setIsAuthenticated(true); diff --git a/src/pages/Login.js b/src/pages/Login.js index c92837ae556c84623e179bc2df3016f70c6504db..aa7cb641dda3ca1925f613b9d8dcb5c231ca6ceb 100644 --- a/src/pages/Login.js +++ b/src/pages/Login.js @@ -124,6 +124,15 @@ const handleLogin = async (e) => { localStorage.setItem('token', token); const decoded = jwt_decode(token); + console.log('로그인 토큰 정보:', { + 토큰: token, + 만료시간: new Date(decoded.exp * 1000).toLocaleString(), + 현재시간: new Date().toLocaleString(), + 남은시간: Math.floor((decoded.exp * 1000 - Date.now()) / 1000 / 60) + '분', + 사용자: decoded.name, + 이메일: decoded.email, + 전체_디코딩_정보: decoded + }); const userData = { _id: decoded.userId, email: decoded.email,