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;