import axios from 'axios'; import store from "../../views/pages/AppStore"; const apiClient = axios.create({ baseURL: '/', 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); } ) apiClient.interceptors.response.use( response => { return response; }, async error => { if (error.response.status == 403 && error.response.data.message == '접근 권한이 없습니다.') { window.history.back(); } const originalReq = error.config; // 토큰의 만료기간이 끝난경우 if (error.response.status == 401 && error.response.data.message == 'Token expired' && !originalReq._retry) { originalReq._retry = true; // 재요청 시도(한번만 실행) try { const res = await axios.post('/refresh/tokenReissue.json', {}); store.commit('setAuthorization', res.headers.authorization); // 새로 발급 받은 AccessToken 저장 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); // const mbr = JSON.parse(decodeURIComponent(escape(window.atob(base64String)))); // jwt claim 추출 store.commit("setMbrNm", mbr.mbrNm); store.commit('setRoles', mbr.roles); /** jwt토큰 디코딩 **/ return apiClient(originalReq); // 원래 요청 재시도 /pathname + search } 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;