JWT (JSON Web Token)를 활용한 인증 시스템을 구축하면서 겪었던 여러 문제들을 해결한 과정을 기록해보겠다. 특히, 토큰 만료 및 갱신 문제와 그 해결 방법에 대해 집중적으로 다루겠다.
로그인 시에 발급받은 토큰이 예상보다 빠르게 만료되는 문제가 발생했다. 테스트 시에 사용자들이 일정 시간이 지나지 않았음에도 불구하고 토큰이 만료되어 로그아웃되는 상황이 빈번하게 발생했다.

Axios 인터셉터를 사용하여 요청 전에 쿠키에서 최신 access token을 가져오는 코드를 작성.
import axios from 'axios';
import Cookies from 'js-cookie';
const apiClient = axios.create({
baseURL: '/api',
timeout: 10000,
headers: {
'Content-Type': 'application/json',
Accept: 'application/json',
},
});
// 요청 인터셉터 설정
apiClient.interceptors.request.use(config => {
if (token) {
config.headers.Authorization = `Bearer ${token}`;
}
return config;
}, error => {
return Promise.reject(error);
});
추가 원인:

구현:
Cookies.get('access_token') 호출을 인터셉터 내부로 이동하여, 요청 시마다 최신 토큰 값을 가져오도록 수정.// 수정된 인터셉터 설정
apiClient.interceptors.request.use(config => {
const token = Cookies.get('access_token');
if (token) {
config.headers.Authorization = `Bearer ${token}`;
}
return config;
}, error => {
return Promise.reject(error);
});
추가 문제:

최종 구현:
// 응답 인터셉터 설정
apiClient.interceptors.response.use(response => {
return response;
}, async (error) => {
if (error.response && error.response.status === 401) {
// access token 만료 처리
const refreshToken = Cookies.get('refresh_token');
if (refreshToken) {
try {
const response = await axios.post('/users/refresh-token', { token: refreshToken });
const newToken = response.data.access_token;
Cookies.set('access_token', newToken);
// 요청 재시도
error.config.headers.Authorization = `Bearer ${newToken}`;
return axios.request(error.config);
} catch (refreshError) {
// 리프레시 토큰이 유효하지 않으면 사용자 로그아웃 처리
Cookies.remove('access_token');
Cookies.remove('refresh_token');
window.location.href = '/';
return Promise.reject(refreshError);
}
} else {
// 리프레시 토큰이 없으면 사용자 로그아웃 처리
Cookies.remove('access_token');
Cookies.remove('refresh_token');
window.location.href = '/';
}
}
return Promise.reject(error);
});
결과 관찰:
JWT 토큰을 관리하는 과정에서 발생할 수 있는 여러 문제들 중 토큰 갱신 문제에 대해 살펴 보았다. Axios 인터셉터를 활용하여 요청 시마다 최신 토큰을 사용하도록 하고 응답 인터셉터에 재인증 요청 및 로그아웃 처리 로직을 추가함으로써 토큰 갱신 문제를 해결할 수 있었다.