access_token 쿠키 확인하여 로그인 상태 유지 처리

ProtectedRoute 로 로그인 필요 페이지 접근 관리
import 문을 src/ 포함된 절대경로로 개선
This commit is contained in:
2026-01-02 11:21:56 +09:00
parent 985ba75d34
commit 767435cad4
19 changed files with 125 additions and 156 deletions

View File

@@ -1,6 +1,6 @@
import React, { createContext, useReducer, useEffect } from 'react';
import { getCurrentUser, isTokenValid } from 'src/axios/authService';
import { isTokenValid, getAccessTokenFromCookie, getUserFromToken } from 'src/axios/authService';
// 사용자 타입 정의
export interface Member {
@@ -33,13 +33,16 @@ const initialState: AuthState = {
error: null
};
// Context 생성
export const AuthContext = createContext<{
// Context 타입 정의
export interface AuthContextType {
state: AuthState;
dispatch: React.Dispatch<AuthAction>;
login: (token: string, member: Member) => void;
logout: () => void;
}>({
}
// Context 생성
export const AuthContext = createContext<AuthContextType>({
state: initialState,
dispatch: () => null,
login: () => null,
@@ -118,7 +121,8 @@ export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children
// 초기 인증 상태 확인
useEffect(() => {
const loadUser = async () => {
const token = localStorage.getItem('accessToken');
// localStorage 또는 Cookie에서 토큰 확인
let token = localStorage.getItem('accessToken') || getAccessTokenFromCookie();
if (!token || !isTokenValid(token)) {
dispatch({ type: 'LOGOUT' });
@@ -126,8 +130,21 @@ export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children
}
try {
const member = await getCurrentUser();
dispatch({ type: 'MEMBER_LOADED', payload: member });
// 토큰이 쿠키에만 있고 localStorage에 없으면 저장해줌 (일관성 유지)
if (!localStorage.getItem('accessToken')) {
localStorage.setItem('accessToken', token);
}
const decodedToken = getUserFromToken(token);
if (decodedToken) {
const member: Member = {
memberId: decodedToken.memberId,
memberName: decodedToken.memberName
};
dispatch({ type: 'MEMBER_LOADED', payload: member });
} else {
dispatch({ type: 'AUTH_ERROR', payload: 'Invalid token' });
}
} catch (error) {
dispatch({ type: 'AUTH_ERROR', payload: 'Authentication failed' });
}