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

풀스택으로 구현하는 전력 사용량 비교 대시보드: BFF 패턴부터 자동 Fallback UI까지

풀스택으로 구현하는 전력 사용량 비교 대시보드: BFF 패턴부터 자동 Fallback UI까지

전력 사용량 비교 서비스를 구현하며 배운 BFF 패턴, 비동기 병렬 처리, 그리고 사용자 경험 설계 이야기 들어가며 전력 사용량 비교 분석 기능을 개발하면서 흥미로운 고민에 직면했습니다. 클라이언트에게 4가지 서로 다른 데이터를 제공해야 하는데, 각각을 독립적인 API로 개발할지, 아니면 하나의 API로 통합해서 제공할지 결정해야 했습니다. API 설계 방향 결론부터 말하자면, 단일

By Jeonggil.C
Claude Code와 Obsidian MCP 연동 가이드

Claude Code와 Obsidian MCP 연동 가이드

소개 Claude Code는 Anthropic의 공식 CLI 도구로, MCP(Model Context Protocol)를 통해 다양한 외부 도구와 연동할 수 있습니다. 이 가이드에서는 Claude Code와 Obsidian을 연동하여 AI 에이전트가 여러분의 노트를 읽고 편집할 수 있도록 설정하는 방법을 소개합니다. MCP(Model Context Protocol)란? MCP는 AI 모델이 외부 데이터 소스 및 도구와 상호작용할

By Kyeongrok.kim
기술뉴스, 2025-09-25

기술뉴스, 2025-09-25

끝없이 수정하다 AI 성과 무너뜨린다··· ‘둠프롬프팅’의 함정최근 LLM과 AI 에이전트 결과물을 무한 반복 수정하는 ‘둠프롬프팅’ 현상이 관찰되고 있다. 이는 성과 저하와 막대한 비용을 초래할 수 있다.CIOGrant Gross초보를 위한 Claude Code 안내서Claude Code의 등장으로 코딩의 패러다임이 완전히 바뀌었습니다. AI 시대의 개발이란? 개발자의 역할은 무엇일까요?Subicura's BlogsubicuraShould we revisit Extreme

By Hyonsok