Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 3 additions & 7 deletions umc-master/src/apis/axios-instance.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import RoutePaths from '@router/routePaths';
import { useTokenStore } from '@store/tokenStore';
import axios, { AxiosInstance } from 'axios';

const { accessToken } = useTokenStore.getState();

const axiosInstance: AxiosInstance = axios.create({
headers: {
accept: 'application/json',
Authorization: `Bearer ${import.meta.env.VITE_ACCESS_TOKEN}`,
Authorization: `Bearer ${accessToken}`,
},
baseURL: import.meta.env.VITE_BASE_URL,
});
Expand Down Expand Up @@ -69,11 +70,6 @@ axiosInstance.interceptors.response.use(
console.error('ํ† ํฐ ๊ฐฑ์‹  ์‹คํŒจ:', refreshError);
useTokenStore.getState().clearTokens();

// ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ
if (window.location.pathname !== RoutePaths.LOGIN) {
window.location.href = RoutePaths.LOGIN;
}

return Promise.reject(refreshError);
}
}
Expand Down
30 changes: 30 additions & 0 deletions umc-master/src/components/Auth/AuthWrapper.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import { useEffect } from 'react';
import { useNavigate, useLocation } from 'react-router-dom';
import { useTokenStore } from '@store/tokenStore';
import RoutePaths from '@router/routePaths';

interface AuthWrapperProps {
children: React.ReactNode;
}

const AuthWrapper = ({ children }: AuthWrapperProps) => {
const navigate = useNavigate();
const location = useLocation();
const { accessToken } = useTokenStore.getState();

useEffect(() => {
// ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๊ฐ€ ์•„๋‹ˆ๊ณ  ํ† ํฐ์ด ์—†๋Š” ๊ฒฝ์šฐ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ
if (!accessToken && location.pathname !== RoutePaths.LANDING) {
navigate(RoutePaths.LOGIN, { replace: true });
}
}, [accessToken, location.pathname, navigate]);

// ํ† ํฐ์ด ์—†๊ณ  ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ ์•„๋ฌด๊ฒƒ๋„ ๋ Œ๋”๋งํ•˜์ง€ ์•Š์Œ
if (!accessToken && location.pathname !== RoutePaths.LOGIN) {
return null;
}

return <>{children}</>;
};

export default AuthWrapper;
54 changes: 34 additions & 20 deletions umc-master/src/router/routes.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,39 @@ import ChatPage from '@pages/chat/ChatPage';
import ErrorPage from '@pages/error/ErrorPage';
import MyChallengePage from '@pages/mychallenge/MyChallenge';
import ChallengeDetailPage from '@pages/challenge/ChallengeDetailPage';
import AuthWrapper from '@components/Auth/AuthWrapper';

// ์ธ์ฆ์ด ํ•„์š”ํ•œ ๋ผ์šฐํŠธ๋“ค์„ ๋ฐฐ์—ด๋กœ ์ •์˜
const protectedRoutes = [
{ path: RoutePaths.MYPAGE, element: <MyPage /> },
{ path: RoutePaths.MAIN, element: <MainPage /> },
{ path: RoutePaths.SAVE_TIP, element: <SaveTipPage /> },
{ path: RoutePaths.SEARCH, element: <SearchPage /> },
{ path: RoutePaths.SAVE_TIP_DETAIL, element: <SaveTipDetailPage /> },
{ path: RoutePaths.CREATE_POST, element: <CreatePostPage /> },
{ path: RoutePaths.COMMUNITY, element: <CommunityPage /> },
{ path: RoutePaths.MAGAZINE, element: <MagazinePage /> },
{ path: RoutePaths.MAGAZINE_DETAIL, element: <MagazineDetailPage /> },
{ path: RoutePaths.CHALLENGE, element: <ChallengePage /> },
{ path: RoutePaths.MYCHALLENGE, element: <MyChallengePage /> },
{ path: RoutePaths.CHALLENGE_DETAIL, element: <ChallengeDetailPage /> },
{ path: RoutePaths.CHAT, element: <ChatPage /> },
];

// ์ธ์ฆ์ด ํ•„์š”์—†๋Š” public ๋ผ์šฐํŠธ๋“ค
const publicRoutes = [
{ index: true, element: <LandingPage /> },
{ path: RoutePaths.LOGIN, element: <LoginPage /> },
{ path: RoutePaths.SIGNUP, element: <SignupPage /> },
{ path: RoutePaths.FINDPRIVACY, element: <FindPrivacy /> },
{ path: RoutePaths.KAKAO_CALLBACK, element: <KakaoCallback /> },
];

// protected ๋ผ์šฐํŠธ๋“ค์„ AuthWrapper๋กœ ๊ฐ์‹ธ๊ธฐ
const wrappedProtectedRoutes = protectedRoutes.map((route) => ({
...route,
element: <AuthWrapper>{route.element}</AuthWrapper>,
}));

const router = createBrowserRouter([
{
Expand All @@ -28,26 +61,7 @@ const router = createBrowserRouter([
children: [
{
errorElement: <ErrorPage />,
children: [
{ index: true, element: <LandingPage /> },
{ path: RoutePaths.LOGIN, element: <LoginPage /> },
{ path: RoutePaths.SIGNUP, element: <SignupPage /> },
{ path: RoutePaths.FINDPRIVACY, element: <FindPrivacy /> },
{ path: RoutePaths.MYPAGE, element: <MyPage /> },
{ path: RoutePaths.MAIN, element: <MainPage /> },
{ path: RoutePaths.SEARCH, element: <SearchPage /> },
{ path: RoutePaths.SAVE_TIP, element: <SaveTipPage /> },
{ path: RoutePaths.SAVE_TIP_DETAIL, element: <SaveTipDetailPage /> },
{ path: RoutePaths.CREATE_POST, element: <CreatePostPage /> },
{ path: RoutePaths.COMMUNITY, element: <CommunityPage /> },
{ path: RoutePaths.MAGAZINE, element: <MagazinePage /> },
{ path: RoutePaths.MAGAZINE_DETAIL, element: <MagazineDetailPage /> },
{ path: RoutePaths.KAKAO_CALLBACK, element: <KakaoCallback /> },
{ path: RoutePaths.CHALLENGE, element: <ChallengePage /> },
{ path: RoutePaths.MYCHALLENGE, element: <MyChallengePage /> },
{ path: RoutePaths.CHALLENGE_DETAIL, element: <ChallengeDetailPage /> },
{ path: RoutePaths.CHAT, element: <ChatPage /> },
],
children: [...publicRoutes, ...wrappedProtectedRoutes],
},
],
},
Expand Down
2 changes: 1 addition & 1 deletion umc-master/src/store/tokenStore.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ interface TokenStore {

export const useTokenStore = create<TokenStore>((set) => ({
accessToken: null,
refreshToken: `${import.meta.env.VITE_REFRESH_TOKEN}` /* ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ ์™„์„ฑ ํ›„ ์ˆ˜์ • ์˜ˆ์ •์ž„ */,
refreshToken: null /* ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ ์™„์„ฑ ํ›„ ์ˆ˜์ • ์˜ˆ์ •์ž„ */,
setTokens: (tokens) => {
// console.log('Setting Tokens:', tokens);
set(() => ({
Expand Down