현재 진행하는 프로젝트에서 회원가입 또는 로그인을 하면 access-token과 refresh-token을 같이 발급해준다. access-token은 로그인후의 요청들에 필요한 header값으로 넣어줘야하고 access-token의 기간이 만료되었을때 돌아오는 error status에 따른 refresh-token을 보내서 다시 access-token을 발급 받아야 한다.
// axios.ts
import axios from 'axios';
const baseURL = process.env.REACT_APP_URL || "http://localhost:8080";
const axiosWithToken = axios.create({
baseURL,
headers: {
'X-AUTH-TOKEN': sessionStorage.getItem('access-token'),
},
});
// axios.ts
axiosAPI.interceptors.response.use(
(response) => {
return response;
},
(error) => {
const {
config,
response: { status },
} = error;
const originalRequest = config;
if (status === 401) {
const refreshToken = sessionStorage.getItem('refresh-token');
axios({
method: 'post',
url: `${baseURL}/api/auth/refresh`,
data: { refreshToken },
}).then((response) => {
const accessTokens = response.data.data.accessToken;
const accessToken = `${accessTokens.header}.${accessTokens.payload}.${accessTokens.signature}`;
sessionStorage.setItem('access-token', accessToken);
originalRequest.headers = { 'X-AUTH-TOKEN': accessToken };
return axios(originalRequest);
});
}
return Promise.reject(error);
},
);
(마지막 return을 적지 않아서 다른요청에의한 에러들이 예상과 다르게 작동하는 버그가 생겨 하루종일 삽질을 했다...)