From 58942959fbb5b1d0950ab63eaf7431178bc72756 Mon Sep 17 00:00:00 2001 From: Hyeonjun0527 Date: Fri, 13 Feb 2026 16:28:27 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EB=A1=9C=EA=B7=B8=EC=95=84=EC=9B=83=20a?= =?UTF-8?q?lert=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/client/axios.ts | 27 +++++++++++++++++++++++++-- src/api/client/axiosV2.ts | 27 +++++++++++++++++++++++++-- 2 files changed, 50 insertions(+), 4 deletions(-) diff --git a/src/api/client/axios.ts b/src/api/client/axios.ts index d20b8ad5..d40beff0 100644 --- a/src/api/client/axios.ts +++ b/src/api/client/axios.ts @@ -59,8 +59,7 @@ const refreshAccessToken = async (): Promise => { } return null; - } catch (error) { - alert('토큰 갱신에 실패했습니다. 다시 로그인해주세요'); + } catch { window.location.href = '/login'; return null; @@ -88,6 +87,20 @@ const processFailedQueue = (error: unknown, token: string | null = null) => { failedQueue = []; }; +const hasAuthToken = (requestConfig?: InternalAxiosRequestConfig) => { + const accessToken = getCookie('accessToken'); + if (accessToken) { + return true; + } + + const authorizationHeader = requestConfig?.headers?.Authorization; + if (Array.isArray(authorizationHeader)) { + return authorizationHeader.length > 0; + } + + return Boolean(authorizationHeader); +}; + axiosInstance.interceptors.response.use( (config) => config, async (error) => { @@ -102,6 +115,11 @@ axiosInstance.interceptors.response.use( // 유효하지 않은 accessToken인 경우, 재발급 if (errorResponseBody.errorCode === 'AUTH001') { + // 로그아웃 직후/비회원 요청처럼 인증 정보가 없는 경우에는 재발급 시도를 하지 않음 + if (!hasAuthToken(originalRequest)) { + return Promise.reject(new ApiError(errorResponseBody)); + } + if (isRefreshing) { // 이미 토큰 갱신 중이면 대기열에 추가 return new Promise((resolve, reject) => { @@ -171,6 +189,11 @@ axiosInstanceForMultipart.interceptors.response.use( // 유효하지 않은 accessToken인 경우, 재발급 if (errorResponseBody.errorCode === 'AUTH001') { + // 로그아웃 직후/비회원 요청처럼 인증 정보가 없는 경우에는 재발급 시도를 하지 않음 + if (!hasAuthToken(originalRequest)) { + return Promise.reject(new ApiError(errorResponseBody)); + } + if (isRefreshing) { // 이미 토큰 갱신 중이면 대기열에 추가 return new Promise((resolve, reject) => { diff --git a/src/api/client/axiosV2.ts b/src/api/client/axiosV2.ts index 9b227e08..585c7329 100644 --- a/src/api/client/axiosV2.ts +++ b/src/api/client/axiosV2.ts @@ -59,8 +59,7 @@ const refreshAccessToken = async (): Promise => { } return null; - } catch (error) { - alert('토큰 갱신에 실패했습니다. 다시 로그인해주세요'); + } catch { window.location.href = '/login'; return null; @@ -88,6 +87,20 @@ const processFailedQueue = (error: unknown, token: string | null = null) => { failedQueue = []; }; +const hasAuthToken = (requestConfig?: InternalAxiosRequestConfig) => { + const accessToken = getCookie('accessToken'); + if (accessToken) { + return true; + } + + const authorizationHeader = requestConfig?.headers?.Authorization; + if (Array.isArray(authorizationHeader)) { + return authorizationHeader.length > 0; + } + + return Boolean(authorizationHeader); +}; + axiosInstanceV2.interceptors.response.use( (config) => config, async (error) => { @@ -102,6 +115,11 @@ axiosInstanceV2.interceptors.response.use( // 유효하지 않은 accessToken인 경우, 재발급 if (errorResponseBody.errorCode === 'AUTH001') { + // 로그아웃 직후/비회원 요청처럼 인증 정보가 없는 경우에는 재발급 시도를 하지 않음 + if (!hasAuthToken(originalRequest)) { + return Promise.reject(new ApiError(errorResponseBody)); + } + if (isRefreshing) { // 이미 토큰 갱신 중이면 대기열에 추가 return new Promise((resolve, reject) => { @@ -171,6 +189,11 @@ axiosInstanceForMultipartV2.interceptors.response.use( // 유효하지 않은 accessToken인 경우, 재발급 if (errorResponseBody.errorCode === 'AUTH001') { + // 로그아웃 직후/비회원 요청처럼 인증 정보가 없는 경우에는 재발급 시도를 하지 않음 + if (!hasAuthToken(originalRequest)) { + return Promise.reject(new ApiError(errorResponseBody)); + } + if (isRefreshing) { // 이미 토큰 갱신 중이면 대기열에 추가 return new Promise((resolve, reject) => {