// 이 파일이 하는 일: 백엔드 API를 호출하는 axios 인스턴스를 하나만 만들어 공유한다. // 모든 페이지가 이 client를 import해서 쓰므로 baseURL·인증 설정이 한 곳에 모인다. import axios from 'axios'; const client = axios.create({ // vite dev 서버의 proxy 설정(vite.config.js)이 '/api'를 백엔드로 넘겨준다. baseURL: '/api', // 학습 포인트: 세션 쿠키 인증은 브라우저가 쿠키를 자동으로 실어 보내야 동작한다. // withCredentials: true가 없으면 로그인해도 다음 요청부터 401이 난다. // 원리: 로그인 성공 시 서버가 Set-Cookie 헤더로 세션 ID를 심어 주고, // 이후 요청마다 브라우저가 그 쿠키를 도로 보내면 서버가 "아, 아까 그 사람"을 알아본다. // withCredentials는 "이 요청에 쿠키를 포함해도 된다"는 axios 쪽 허락 스위치다. withCredentials: true, }); // 학습 포인트: 응답 인터셉터 — 모든 API 응답이 여기를 한 번 거친다. // 세션이 만료되어 401이 오면 페이지마다 처리 코드를 두는 대신 // 여기서 한 번에 로그인 화면으로 보낸다. client.interceptors.response.use( (response) => response, (error) => { const status = error.response?.status; const url = error.config?.url || ''; // 예외: 로그인 시도 자체의 401(비밀번호 틀림)과 // 로그인 여부 확인용 /auth/me의 401은 리다이렉트하면 안 된다. // (로그인 페이지에서 무한 새로고침이 되어버린다.) const isAuthCheck = url.includes('/auth/login') || url.includes('/auth/me'); if (status === 401 && !isAuthCheck && window.location.pathname !== '/login') { window.location.href = '/login'; } return Promise.reject(error); } ); export default client;