
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 => {
const token = store.state.authorization; // Access Token 가져오기
if (token) {
config.headers.Authorization = token; // 단순히 토큰만 추가
}
return config;
},
error => {
return Promise.reject(error);
}
);
// 응답 인터셉터
apiClient.interceptors.response.use(
response => {
return response;
},
async error => {
const originalReq = error.config;
// 403 에러 처리
if (error.response.status === 403) {
alert('접근 권한이 없습니다.');
window.history.back();
return Promise.reject(error);
}
// 401 에러 처리 (토큰 만료)
if (error.response.status === 401 && error.response.data.message === '로그인 시간이 만료되었습니다.' && !originalReq._retry) {
// 토큰 재발급 요청
try {
const res = await axios.post("/refresh/tknReissue.json", {}, {
headers: {
"Content-Type": "application/json; charset=UTF-8",
},
});
// 응답 상태가 200일 경우에만 처리
if (res.status === 200) {
console.log("토큰 재발급 성공! 굿~");
// 새로 발급 받은 AccessToken 저장
store.commit('setAuthorization', res.headers.authorization);
originalReq.headers.Authorization = store.state.authorization; // 새로 발급 받은 AccessToken을 기존 요청에 추가
// JWT 토큰 디코딩
const base64String = store.state.authorization.split('.')[1];
const base64 = base64String.replace(/-/g, '+').replace(/_/g, '/');
const jsonPayload = decodeURIComponent(atob(base64).split('').map(c => {
return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
}).join(''));
const mbr = JSON.parse(jsonPayload);
store.commit("setUserNm", mbr.userNm); // 사용자 이름 저장
store.commit('setRoles', mbr.roles); // 사용자 역할 저장
return apiClient(originalReq); // 원래 요청 재시도
} else {
// 200이 아닌 경우
throw new Error("토큰 재발급 요청 실패");
}
} catch (refreshError) {
const redirect = window.location.pathname + window.location.search;
sessionStorage.setItem("redirect", redirect);
alert('세션이 종료되었습니다.\n로그인을 새로 해주세요.');
store.commit("setStoreReset");
window.location = '/login.page'; // 로그인 페이지로 리다이렉트
return Promise.reject(refreshError);
}
}
return Promise.reject(error);
}
);
export default apiClient;