요즘 근황을 얘기해보자면, 아침엔 CS 스터디를 진행하고 , 저녁 이후엔 FIXET 프로젝트를 진행했었는데 , 디자이너를 구해서 디자인 작업을 할동안 시간적 여유가 좀 생겼다. 이력서를 계속해서 수정하고 갈고 닦으면서 든 생각이 나의 메인 프로젝트는 환승시민인데, 메인 프로젝트임에도 불구하고 코딩을 시작한 지 얼마 되지 않았을때 밤새가면서 블로그에 의존하면서 코드를 짜놓았다보니 코드의 질이나 여러가지 부분에서 수정할것이 많아 보였다. 그래서 백엔드 리더분께 연락을 드려봤더니 그 분도 리팩토링을 하고 싶어하셨고, 그래서 결국 리팩토링을 진행하게 되었다. 디자이너도 구하고 있다. 오늘은 백엔드 분과 JWT 토큰을 도입해서 access Token 을 갈아끼우는 interceptor 를 구현해봤다.
먼저 설명하기에 앞서 왜 access Token 을 갈아 끼워야 하는가?
인터셉터란 then 또는 catch 로 처리되기 전에 요청과 응답을 가로채는 방법이다.
refresh function
const refreshTokenFn = async () => {
const token = getCookie("token");
try {
const { data } = await instance.post("/newtoken", { token: token });
const acctoken = data?.acctoken;
console.log(acctoken);
if (!acctoken) {
removeCookie("token");
}
setCookie("token", acctoken);
return data;
} catch (error) {
console.log(error);
removeCookie("token");
}
};
const maxAge = 10000;
export const memoizedRefreshToken = mem(refreshTokenFn, {
maxAge,
});
// 인터셉터
instance.interceptors.request.use(
async (config) => {
const token = getCookie("token");
console.log(token);
if (token) {
config.headers = {
...config.headers,
Authorization: `Bearer ${token}`,
};
}
return config;
},
(error) => Promise.reject(error)
);
instance.interceptors.response.use(
(response) => response,
async (error) => {
const config = error.config;
if (error.response.status === 401 && !config?.sent) {
config.sent = true;
const result = await memoizedRefreshToken();
console.log(result);
if (result?.acctoken) {
config.headers = {
...config.headers,
Authorization: `Bearer ${result?.acctoken}`,
};
}
return instance(config);
}
return Promise.reject(error);
}
);