백엔드와 통신시 인증이 필요한 경우 아래와 같이 헤더에 토큰을 넣어서 메서드를 요청해야 한다.
const response = await axios({
method: 'GET',
url: 'url',
headers: {
Authorization: `Bearer ${token}`,
},
});
인증이 필요한 모든 axios 요청에서 직접 헤더를 넣는 귀찮은 반복 작업을 axios interceptor를 이용하여 해결할 수 있다.
const instance = axios.create({
baseURL: 'https://some-domain.com/api/',
timeout: 1000,
headers: {'X-Custom-Header': 'foobar'}
});
baseURLtimeoutheaders// 요청 인터셉터 추가하기
axios.interceptors.request.use(
(config) => {
// 요청이 전달되기 전에 작업 수행
return config;
},
(error) => {
// 요청 오류가 있는 작업 수행
return Promise.reject(error);
});
axiosInstance.interceptors.request.use(
// 요청이 전달되기 전에 헤더에 토큰 넣기
(config) => {
const token = sessionStorage.getItem('token');
if (token) {
const newConfig = { ...config };
newConfig.headers.Authorization = `Bearer ${token}`;
return newConfig;
}
return config;
},
(error) => {
// 요청 오류가 있는 작업 수행
return Promise.reject(error);
},
);
// 응답 인터셉터 추가하기
axios.interceptors.response.use(
(response) => {
// 2xx 범위에 있는 상태 코드는 이 함수를 트리거 합니다.
// 응답 데이터가 있는 작업 수행
return response;
},
(error) => {
// 2xx 외의 범위에 있는 상태 코드는 이 함수를 트리거 합니다.
// 응답 오류가 있는 작업 수행
return Promise.reject(error);
});
axiosInstance.interceptors.response.use(
(response) => {
return response;
},
(error) => {
const statusCode = error.response?.status;
if (statusCode === 401) {
error.response.statusText = 'Unauthorized';
error.response.status = 401;
navigate('/');
}
return Promise.reject(error);
}
);
axiosInstance.js
// 인스턴스 생성
const instance = axios.create({
baseURL: 'URL',
});
// 요청 인터셉터
axiosInstance.interceptors.request.use(
// 요청이 전달되기 전에 헤더에 토큰 넣기
(config) => {
const authToken = sessionStorage.getItem('token');
if (authToken) {
const newConfig = { ...config };
newConfig.headers.Authorization = `Bearer ${token}`;
return newConfig;
}
return config;
},
(error) => {
// 요청 오류가 있는 작업 수행
return Promise.reject(error);
},
);
// 응답 인터셉터
axiosInstance.interceptors.response.use(
(response) =>
return response;
},
(error) => {
const statusCode = error.response?.status;
if (statusCode === 401) {
error.response.statusText = 'Unauthorized';
error.response.status = 401;
navigate('/');
}
return Promise.reject(error);
}
);
axiosInstance 사용하기import axiosInstance from '../../config/axiosInstance.js'
async function getUser() {
try {
const response = await axios({
method: 'GET',
url: '/api/user',
});
console.log(response);
} catch (error) {
console.log(error);
}
}
References