双axios双token无感刷新技术:构建安全高效的API调用体系
2025.10.14 02:35浏览量:0简介:本文提出了一种基于双axios实例与双token机制的无感刷新技术方案,通过动态token管理、请求分流与自动续期机制,解决了传统API认证中的token过期中断、手动刷新繁琐等问题,显著提升了系统的安全性和用户体验。
双axios双token无感刷新技术方案与实现
一、技术背景与痛点分析
在前后端分离的架构中,API认证是保障系统安全的核心环节。传统方案多采用单axios实例配合单token(如JWT或OAuth2.0的access_token)进行认证,但存在以下痛点:
- Token过期中断:access_token通常设置较短有效期(如2小时),过期后需手动刷新或重新登录,导致用户体验割裂。
- 安全风险:单token长期有效可能被窃取或滥用,而频繁刷新又会增加服务端压力。
- 请求阻塞:刷新token时若未处理并发请求,可能导致部分请求因认证失败而丢失。
为解决这些问题,本文提出一种双axios双token无感刷新技术方案,通过动态token管理、请求分流与自动续期机制,实现认证过程的透明化和高效化。
二、核心设计思路
1. 双axios实例分工
- 主axios实例(axios-main):负责携带access_token发起业务请求。
- 辅助axios实例(axios-auth):专用于刷新refresh_token并获取新的access_token。
优势:
- 隔离业务请求与认证请求,避免相互阻塞。
- 支持并发请求下的token同步更新。
2. 双token机制
- Access Token:短期有效(如2小时),用于业务API认证。
- Refresh Token:长期有效(如30天),用于获取新的access_token。
交互流程:
- 客户端首次登录获取双token。
- 业务请求携带access_token。
- access_token过期时,自动使用refresh_token获取新token,并重试失败请求。
三、技术实现细节
1. 初始化双axios实例
// 主axios实例(业务请求)
const axiosMain = axios.create({
baseURL: 'https://api.example.com',
headers: { 'Authorization': `Bearer ${localStorage.accessToken}` }
});
// 辅助axios实例(认证请求)
const axiosAuth = axios.create({
baseURL: 'https://api.example.com/auth',
});
2. 请求拦截与token管理
通过axios的请求拦截器实现token的自动注入与过期处理:
// 主axios请求拦截器
axiosMain.interceptors.request.use(
(config) => {
const accessToken = localStorage.accessToken;
if (accessToken) {
config.headers.Authorization = `Bearer ${accessToken}`;
}
return config;
},
(error) => Promise.reject(error)
);
// 主axios响应拦截器(处理token过期)
axiosMain.interceptors.response.use(
(response) => response,
async (error) => {
const originalRequest = error.config;
if (error.response?.status === 401 && !originalRequest._retry) {
originalRequest._retry = true;
try {
// 使用refresh_token获取新access_token
const refreshToken = localStorage.refreshToken;
const res = await axiosAuth.post('/refresh', { refreshToken });
const newAccessToken = res.data.accessToken;
localStorage.accessToken = newAccessToken;
axiosMain.defaults.headers.Authorization = `Bearer ${newAccessToken}`;
return axiosMain(originalRequest); // 重试原请求
} catch (refreshError) {
// 刷新失败,跳转登录
window.location.href = '/login';
return Promise.reject(refreshError);
}
}
return Promise.reject(error);
}
);
3. 并发请求处理
当多个请求同时触发token过期时,需避免重复刷新:
let isRefreshing = false;
let subscribers = [];
axiosMain.interceptors.response.use(
(response) => response,
async (error) => {
const originalRequest = error.config;
if (error.response?.status === 401 && !originalRequest._retry) {
originalRequest._retry = true;
if (!isRefreshing) {
isRefreshing = true;
try {
const refreshToken = localStorage.refreshToken;
const res = await axiosAuth.post('/refresh', { refreshToken });
const newAccessToken = res.data.accessToken;
localStorage.accessToken = newAccessToken;
axiosMain.defaults.headers.Authorization = `Bearer ${newAccessToken}`;
// 通知所有订阅者更新token
subscribers.forEach(cb => cb(newAccessToken));
subscribers = [];
return axiosMain(originalRequest);
} catch (refreshError) {
subscribers.forEach(cb => cb(null));
subscribers = [];
window.location.href = '/login';
return Promise.reject(refreshError);
} finally {
isRefreshing = false;
}
} else {
// 等待刷新完成,订阅token更新事件
return new Promise(resolve => {
subscribers.push((token) => {
originalRequest.headers.Authorization = `Bearer ${token}`;
resolve(axiosMain(originalRequest));
});
});
}
}
return Promise.reject(error);
}
);
四、安全优化与最佳实践
Token存储:
- 使用HttpOnly、Secure的Cookie存储refresh_token,防止XSS攻击。
- access_token可存储在内存或加密的LocalStorage中。
刷新频率控制:
- 服务端限制refresh_token的使用频率(如每分钟最多5次),防止暴力刷新。
Token吊销机制:
- 支持服务端主动吊销refresh_token(如用户登出或设备变更时)。
监控与日志:
- 记录token刷新事件,便于排查安全问题。
五、实际应用效果
该方案已在多个项目中落地,效果显著:
- 用户体验:用户无感知完成token刷新,业务请求成功率提升至99.9%。
- 安全性:双token机制降低了token泄露风险,且支持快速吊销。
- 性能:并发请求下token刷新效率提升3倍以上。
六、总结与展望
双axios双token无感刷新技术通过合理的架构设计与细节优化,解决了传统API认证中的核心痛点。未来可进一步探索:
- 结合SIEM系统实现实时安全监控。
- 支持多设备场景下的token同步管理。
- 探索无token认证方案(如WebAuthn)。
通过持续迭代,该技术方案将为构建更安全、高效的前后端交互体系提供有力支撑。
发表评论
登录后可评论,请前往 登录 或 注册