리프레시 토큰 재발급에 대해 기록!!
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);
);