axios intercepter은 애플리션에서 처리하기 전에 Axios 라이브러리에서 수행한 HTTP요청 or 응답을 가로채고 수정하는데 사용할 수 있는 기능이다.
요청 시 Access Token 보내주기
instance.interceptors.request.use((config: InternalAxiosRequestConfig) => {
config.headers.Accept = 'application/json';
return AsyncStorage.getItem(StorageKeys.인증_토큰)
.then((model) => {
if (model) {
const tokenModel = JSON.parse(model);
config.headers.Authorization = `Bearer ${tokenModel.accessToken}`;
}
return config;
})
.catch(() => {
return config;
});
});
에러를 처리하는 로직이다.
401이면 accesstoken이 만료되었을 때인데 토큰을 갱신해줘야 한다.
토큰이 만료되었다고 판단하고 local storage 에 있는 refresh token을 전송하여 새로운 access token을 받아온다.
받아온 access token은 기존 local storage에 있는 access token과 교체하여 갱신시켜 준다.
token이 갱신되면 이전 요청을 다시 보내는 과정이 필요하다.
instance.interceptors.response.use((response) => response,
async (error) => {
console.log("error", error)
if (error.response) {
const { status, data, config } = error.response
if (status === 403 || data.code === 403) {
if (data.hasPenalty) {
console.log('403', data, config);
}
}
//AccessToken이 만료됐을 때 처리
if (status === 401) {
const originalConfig = error.config;
try {
const token = await Storage.getItems(StorageKeys.인증_토큰);
if (token) {
const tokenModel = JSON.parse(token);
//토큰 갱신
const data = await axios<UserModel.IJwtTokenModel, any>({
url: `/api/auth/update-token`,
method: 'GET',
headers: {
Authorization: tokenModel.refreshToken,
},
});
if (data) {
const tokenModel = {
accessToken: data.accessToken,
refreshToken: data.refreshToken,
} as UserModel.IJwtTokenModel;
await Storage.setItems(StorageKeys.유저_정보, data);
await Storage.setItems(StorageKeys.인증_토큰, tokenModel);
return await instance.request(originalConfig);
}
} else {
await Storage.removeItems(StorageKeys.유저_정보);
await Storage.removeItems(StorageKeys.인증_토큰);
}
} catch (error) {
await Storage.removeItems(StorageKeys.유저_정보);
await Storage.removeItems(StorageKeys.인증_토큰);
}
// 오류 발생 시 오류 내용 출력 후 요청 거절
// return Promise.reject(error);
}
if (status === 500) {
console.log('500', data, config);
}
}
return error.response;
});