
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({
headers: {'Content-Type': 'application/json; charset=UTF-8'}
})
apiClient.interceptors.request.use(
config => {
config.headers.Authorization = store.state.authorization // 요청 시 AccessToken 추가
return config;
},
error => {
return Promise.reject(error);
}
)
async function refreshAccessToken() {
try {
const refreshToken = store.state.authorization; // 스토어에서 리프레시 토큰 가져오기
// 리프레시 토큰을 포함하여 재발급 요청
const res = await axios.post('/refresh/tknReissue.json', {}, {
withCredentials: true // 쿠키를 요청에 포함시키기 위한 옵션
});
if (res.headers.authorization) {
// 새로 발급받은 AccessToken 저장
store.commit('setAuthorization', res.headers.authorization);
// 필요한 경우 리프레시 토큰도 업데이트
// store.commit('setRefresh', res.headers.refresh);
}
return res; // 응답 반환
} catch (error) {
console.error('Error refreshing access token:', error);
alert('토큰 재발급에 실패했습니다. 다시 로그인 해주세요.');
store.commit("setStoreReset");
window.location = '/login.page'; // 로그인 페이지로 리다이렉트
}
}
apiClient.interceptors.response.use(
response => {
return response;
},
async error => {
const originalReq = error.config;
// 403 오류 처리: 접근 권한 없음
if (error.response.status === 403 && error.response.data.message === '접근 권한이 없습니다.') {
window.history.back();
return Promise.reject(error);
}
// 401 오류 처리: 토큰 만료
if (error.response.status === 401 && !originalReq._retry) {
originalReq._retry = true; // 재요청 시도 플래그 설정
try {
// 액세스 토큰 재발급 요청
await refreshAccessToken(); // 리프레시 함수 호출
// 원래 요청 재시도
return apiClient(originalReq);
} catch (refreshError) {
return Promise.reject(refreshError);
}
}
return Promise.reject(error);
}
)
export default apiClient;