
React Native 앱에서 로그인 상태를 유지하기 위해 JWT(JSON Web Token)를 사용하는 것은 일반적인 방법입니다.
하지만 보안을 위해 액세스 토큰의 유효기간이 짧게 설정되어 있어, 사용자 경험을 해치지 않으면서도, 보안성을 유지하는 것이 중요합니다.
오늘은 Axios interceptor를 사용하여 토큰 자동 갱신을 구현하는 방법을 알아보겠습니다.
JWT 인증은 두 가지 토큰을 사용합니다:
1. Access Token: 실제 API 요청에 사용되는 짧은 수명의 토큰
2. Refresh Token: Access Token을 갱신하기 위한 긴 수명의 토큰
import axios from "axios";
import AsyncStorage from "@react-native-async-storage/async-storage";
import { CommonActions } from '@react-navigation/native';
const axiosInstance = axios.create({
baseURL: "http://your-api-server.com",
timeout: 5000,
headers: {
"Content-Type": "application/json",
},
});
// Request Interceptor
axiosInstance.interceptors.request.use(
async (config) => {
const token = await AsyncStorage.getItem("accessToken");
if (token) {
config.headers.Authorization = `Bearer ${token}`;
}
return config;
},
(error) => Promise.reject(error)
);
// Response Interceptor
axiosInstance.interceptors.response.use(
(response) => response,
async (error) => {
const originalRequest = error.config;
// 401 에러이고 재시도하지 않은 요청일 경우
if (error.response?.status === 401 && !originalRequest._retry) {
originalRequest._retry = true;
try {
// 새 토큰 요청
const refreshToken = await AsyncStorage.getItem("refreshToken");
const response = await axios.post("/auth/refresh", { refreshToken });
// 새 토큰 저장
const { accessToken, refreshToken: newRefreshToken } = response.data;
await AsyncStorage.multiSet([
["accessToken", accessToken],
["refreshToken", newRefreshToken],
]);
// 원래 요청 재시도
originalRequest.headers.Authorization = `Bearer ${accessToken}`;
return axiosInstance(originalRequest);
} catch (refreshError) {
// refresh token도 만료된 경우 로그아웃
await AsyncStorage.multiRemove([
"accessToken",
"refreshToken",
"isLoggedIn",
]);
// 로그인 화면으로 이동
navigationRef.current?.dispatch(
CommonActions.reset({
index: 0,
routes: [{ name: "Login" }],
})
);
Alert.alert("세션 만료", "로그인이 만료되었습니다. 다시 로그인해주세요.");
return Promise.reject(refreshError);
}
}
return Promise.reject(error);
}
);
export default axiosInstance;
자동 갱신
세션 만료 처리
안전한 로그아웃
보안
에러 처리
사용자 경험
JWT 토큰 자동 갱신을 구현함으로써 보안성을 유지하면서도 좋은 사용자 경험을 제공할 수 있습니다. Axios interceptor를 활용하면 이러한 복잡한 인증 로직을 깔끔하게 모듈화할 수 있으며, 앱의 다른 부분에 영향을 주지 않고 인증 로직을 관리할 수 있습니다.