Skip to content
Snippets Groups Projects
Commit 307e010f authored by 민재 조's avatar 민재 조
Browse files

Merge branch 'refactor/loginTimeout' into 'main'

refactor: 토큰 활성 시간 경과 시 로그인 페이지로 이동

See merge request !41
parents 09a3849b da7bccf3
No related branches found
No related tags found
1 merge request!41refactor: 토큰 활성 시간 경과 시 로그인 페이지로 이동
Pipeline #10827 failed
...@@ -2,10 +2,12 @@ import React from "react"; ...@@ -2,10 +2,12 @@ import React from "react";
import { BrowserRouter as Router } from "react-router-dom"; import { BrowserRouter as Router } from "react-router-dom";
import Layout from "./layout"; import Layout from "./layout";
import AppRoutes from "./AppRoutes"; import AppRoutes from "./AppRoutes";
import TokenExpirationChecker from './components/TokenExpirationChecker';
function App() { function App() {
return ( return (
<Router> <Router>
<TokenExpirationChecker />
<Layout> <Layout>
<AppRoutes /> <AppRoutes />
</Layout> </Layout>
......
...@@ -10,7 +10,19 @@ const api = axios.create({ ...@@ -10,7 +10,19 @@ const api = axios.create({
api.interceptors.request.use(config => { api.interceptors.request.use(config => {
const token = sessionStorage.getItem('accessToken'); const token = sessionStorage.getItem('accessToken');
const expiresAt = sessionStorage.getItem('tokenExpiresAt');
if (token) { if (token) {
// 토큰 만료 체크
if (expiresAt && Date.now() >= parseInt(expiresAt)) {
sessionStorage.removeItem('accessToken');
sessionStorage.removeItem('tokenExpiresAt');
if (!window.location.pathname.includes('/login')) {
alert('로그인이 만료되었습니다. 다시 로그인해주세요.');
window.location.href = '/login';
}
return Promise.reject('Token expired');
}
config.headers.Authorization = `Bearer ${token}`; config.headers.Authorization = `Bearer ${token}`;
} }
return config; return config;
...@@ -19,10 +31,16 @@ api.interceptors.request.use(config => { ...@@ -19,10 +31,16 @@ api.interceptors.request.use(config => {
api.interceptors.response.use( api.interceptors.response.use(
response => response, response => response,
error => { error => {
// 401 에러 처리
if (error.response?.data.statusCode === 401) { if (error.response?.data.statusCode === 401) {
sessionStorage.removeItem('accessToken'); sessionStorage.removeItem('accessToken');
sessionStorage.removeItem('tokenExpiresAt');
if (!window.location.pathname.includes('/login')) {
alert('로그인이 필요합니다. 로그인 페이지로 이동합니다.');
window.location.href = '/login'; window.location.href = '/login';
} }
}
return Promise.reject(error); return Promise.reject(error);
} }
); );
......
...@@ -15,6 +15,7 @@ const LoginPage = () => { ...@@ -15,6 +15,7 @@ const LoginPage = () => {
const data = await axiosLogin({ email, password }); const data = await axiosLogin({ email, password });
if (data && data.token) { if (data && data.token) {
sessionStorage.setItem('accessToken', data.token); sessionStorage.setItem('accessToken', data.token);
sessionStorage.setItem('tokenExpiresAt', data.expiresAt.toString());
setMessage(`로그인 성공!`); setMessage(`로그인 성공!`);
window.location.href = '/'; window.location.href = '/';
} else { } else {
......
...@@ -163,6 +163,8 @@ const SignupModal = ({ onClose }) => { ...@@ -163,6 +163,8 @@ const SignupModal = ({ onClose }) => {
const result = await axiosSignup(formData); const result = await axiosSignup(formData);
if (result) { if (result) {
sessionStorage.setItem('accessToken', result.token); sessionStorage.setItem('accessToken', result.token);
// 만료 시간도 저장
sessionStorage.setItem('tokenExpiresAt', result.expiresAt.toString());
window.location.href = '/'; window.location.href = '/';
} }
} catch (error) { } catch (error) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment