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;