Axios interceptors 를 활용한 Refresh token 만료 시 처리 구현

Axios interceptors 를 활용한 Refresh token 만료 시 처리 구현

이슈

JWT refresh token 만료 시 로그인 페이지로 이동하지 않는 현상

문제점

refresh 토큰이 만료된 경우를 구분이 어렵다

access 토큰은 만료되었으나 refresh 토큰은 만료되지 않은 경우에 첫 요청은 실패하지만
react-query에서 3번 더 요청을 하기 때문에 두 번째 요청을 보내기 전에 next auth에서 refresh 토큰을 발급받아서 두 번째 요청은 성공했다

해결

Axios interceptors를 이용하여 3번째 재시도까지 토큰이 만료되었다는 응답을 받으면 refresh 토큰이 만료된 것으로 간주하고 로그인 페이지로 이동

구현 코드

import http, { setToken } from 'lib/axios';
import { route } from 'constants/route';
import { useEffect, useRef } from 'react';
import { getAxiosError } from 'utils/http';
import { ERROR_CODE } from 'constants/error';
import { isAxiosError } from 'axios';

const SessionLoader = ({ children }: { children: React.ReactNode }) => {
  // 각 요청에 대한 실패를 카운트하는 객체
  const responseInvalidTokenCounterRef = useRef<{ [key: string]: number }>({});

  useEffect(() => {
    http.interceptors.response.use(
      (response) => {
        // 응답 성공 시 카운트 초기화
        const requestUrl = response.config.url ?? 'common';
        responseInvalidTokenCounterRef.current[requestUrl] = 0;
        return response;
      },
      (error) => {
        if (isAxiosError(error)) {
          // 3번째 재시도까지 토큰이 유효하지 않을 때 로그인 페이지로 이동
          const requestUrl = error.config?.url ?? 'common';
          const errorData = getAxiosError(error);
          if (errorData?.result.errorCode === ERROR_CODE.INVALID_TOKEN) {
            responseInvalidTokenCounterRef.current[requestUrl] =
              responseInvalidTokenCounterRef.current[requestUrl] ?? 0;
            responseInvalidTokenCounterRef.current[requestUrl] += 1;
          }
          if (responseInvalidTokenCounterRef.current[requestUrl] > 2) {
            window.location.href = route.login;
          }
        }

        return Promise.reject(error);
      },
    );
  }, []);

  // 나머지 코드 생략...
  
  return <>{children}</>;
};
export default SessionLoader;

Read more

Lumen - AI Agent를 위한 지속 가능한 두뇌

Lumen - AI Agent를 위한 지속 가능한 두뇌

왜 만들었는가 AI 에이전트는 모든 대화를 기억상실증 상태에서 시작합니다. Claude Code, Cursor, Codex, Mastra 하네스, LangChain 파이프라인 — 이 도구들은 세상을 알지만 당신의 세상은 전혀 모릅니다. 당신이 읽은 200편의 논문, 당신이 출시하는 코드베이스, 지난 분기에 내린 아키텍처 결정, 새벽 2시에 그 버그를 잡아냈을 때 마침내 통했던 트래젝토리. 모든 세션이 같은 컨텍스트를

By Sardor Madaminov

200 OK, 텅 빈 body — Starlette Race Condition 장애 분석기

발생일: 2026-04-23 / 해결일: 2026-04-27 영향 범위: report-dev.machine365.ai 전체 API 들어가며 API가 200 OK를 반환하는데 body가 비어있다. 프론트엔드에는 아무것도 안 뜨고, Swagger UI(/docs)도 빈 화면. 그런데 로컬에서 돌리면 멀쩡하다. 배경은 이랬다. 미터링(Metering) 기능을 만들면서 API 호출 로그를 수집할 미들웨어를 작성했다. Spring Boot 백엔드에 먼저 적용하고, Python

By Jeonggil