
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
import axios from 'axios';
import store from "../../views/pages/AppStore";
const apiClient = axios.create({
baseURL: '/api',
withCredentials: true,
headers: {
'Content-Type': 'application/json; charset=UTF-8',
},
});
// 요청 인터셉터: 저장된 액세스 토큰을 헤더에 추가
apiClient.interceptors.request.use(
config => {
// store.state.authorization에 액세스 토큰이 저장되어 있다고 가정
if (store.state.authorization) {
config.headers.Authorization = store.state.authorization;
}
return config;
},
error => Promise.reject(error)
);
// 응답 인터셉터: 401 에러(토큰 만료) 발생 시 리프레시 토큰을 이용해 새 액세스 토큰 재발급
apiClient.interceptors.response.use(
response => response,
async error => {
const originalReq = error.config;
if (error.response.status === 403) {
return Promise.reject(error);
}
if (error.response.status === 401 &&
error.response.data.message === 'Token expired' &&
!originalReq._retry) {
originalReq._retry = true;
try {
// ✅ 쿠키 기반 리프레시 요청: 따로 refreshToken을 보낼 필요 없음
const refreshResponse = await axios.post(
'/api/auth/refresh/tokenReissue.json',
{},
{ withCredentials: true } // 쿠키 전송 허용
);
const newAccessToken = refreshResponse.data.accessToken;
store.commit('setAuthorization', newAccessToken);
// JWT 디코딩하여 사용자 정보 저장
const base64String = newAccessToken.split('.')[1];
const base64 = base64String.replace(/-/g, '+').replace(/_/g, '/');
const jsonPayload = decodeURIComponent(
atob(base64).split('').map(c =>
'%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)
).join('')
);
const mem = JSON.parse(jsonPayload);
store.commit("setMemId", mem.memberId);
store.commit('setMemNm', mem.memberName);
store.commit('setMemLoginId', mem.memberLoginId);
// 원래 요청 헤더에 새 토큰 설정 후 재시도
originalReq.headers.Authorization = newAccessToken;
return apiClient(originalReq);
} catch (refreshError) {
sessionStorage.setItem("redirect", window.location.pathname + window.location.search);
store.commit("setStoreReset");
window.location.href = "/login.page";
return Promise.reject(refreshError);
}
}
return Promise.reject(error);
}
);
export default apiClient;