TIL 73일차

김동현·2023년 1월 19일

TIL

목록 보기
60/93

리프레시 토큰 재발급에 대해 기록!!

instanceAxios.interceptors.response.use(
  //status 200번대 일때 처리
  async (res) => {
  	// res 안에 있는 data, config를 꺼내옴
    const { config, data } = res;
    // originalRequest안에 config넣음
    const originalRequest = config;
    // 만약 4015상태가 뜨면
    if (data.customHttpStatus === 4015) {
      // 위에 상태값 하나 만들어주시고
      if (!isTokenRefreshing) {
      	//상태가 true바뀌고
        isTokenRefreshing = true;
        // headers에 통신한 값을 넣어줌
        const { headers } = await instanceAxios.post("member/reissuance");
        // acc / ref 객체로 저장 / headers에서 꺼내옴
        const { accesstoken: newAccessToken, refreshtoken: newRefreshToken } =
          headers;
		// 쿠키에 저장
        setCookie("accesstoken", newAccessToken, {
          path: "/",
        });
        // 쿠키에 저장
        setCookie("refreshtoken", newRefreshToken, {
          path: "/",
        });
        //상태값 false로 바꿔주고
        isTokenRefreshing = false;
		
        // 위에서 선언한 orginal헤더안에있는 ref토큰에 새로운 ref토큰을 넣어줌
        originalRequest.headers.RefreshToken = `${newRefreshToken}`;
		// 새로운 토큰으로 지연되었던 요청 진행
        onTokenRefreshed(newAccessToken);
      }
      // token이 재발급 되는 동안의 요청은 refreshSubscribers에 저장
      const retryOriginalRequest = new Promise((resolve) => {	
        addRefreshSubscriber((accessToken) => {
          originalRequest.headers.AccessToken = `${accessToken}`;
          resolve(instanceAxios(originalRequest));
        });
      });
      return retryOriginalRequest;
    }
    //그리고 리턴
    return res;
  },
  // 200번대를 제외한 에러들 처리
  async (error) => {
    return Promise.reject(error);
  }
  
  
  // 401번대 에러일때! 위와 방식 일치
   const {
     config,
     response: { status },
   } = error;
   const originalRequest = config;
   if (status === 401) {
     if (!isTokenRefreshing) {
       isTokenRefreshing = true;
       const { headers } = await instanceAxios.post("member/reissuance");
       const { accesstoken: newAccessToken, refreshtoken: newRefreshToken } =
         headers;

       setCookie("accesstoken", newAccessToken, {
         path: "/",
       });
       setCookie("refreshtoken", newRefreshToken, {
         path: "/",
       });
       isTokenRefreshing = false;

       originalRequest.headers.RefreshToken = `${newRefreshToken}`;

       onTokenRefreshed(newAccessToken);
     }
     const retryOriginalRequest = new Promise((resolve) => {
       addRefreshSubscriber((accessToken) => {
         originalRequest.headers.AccessToken = `${accessToken}`;
         resolve(instanceAxios(originalRequest));
       });
     });
     return retryOriginalRequest;
   }
   return Promise.reject(error);
);
profile
꺽이지 않는 마음

0개의 댓글