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

쉬어가며

쉬어가며

개발 일만 하다 보면 때로는 잠시 멈춰서 주변을 둘러보는 것도 중요하다. 오늘은 오래전에 다녔던 병원에서의 일을 가볍게 풀어볼까 한다. 고객이 병원에 방문하고, 그것이 수익으로 이어지기까지. 그 안에는 생각보다 훨씬 많은 전략과 기술, 그리고 사람들의 노력이 숨어있다. 1. 들어가며 오래전 다녔던 한 병원에서의 일이다. 당시 나는 "의료 IT"라는 낯선 도메인에

By Jeonggil
Building AI Sales Pipeline That Actually Researches: Multi-Agent Orchestration with tool-use

Building AI Sales Pipeline That Actually Researches: Multi-Agent Orchestration with tool-use

계속 우리를 괴롭혔던 문제 세일즈 파이프라인이 작동하고 있었습니다. 여섯 개의 Claude 에이전트가 각자 역할을 수행했습니다: 회사를 조사하고, 솔루션을 매핑하고, 제안서를 작성하고, 딜 규모를 추정하고, 이메일을 작성합니다. CLI 명령어 하나면 몇 분 안에 개인화된 세일즈 제안서가 완성되었습니다. 하지만 거기에는 거짓말이 내재되어 있었습니다. "리서처" 에이전트는 실제로 아무것도 조사하지 않았습니다. "Koelle GmbH, Germany"

By Sardor Madaminov