双axios双token无感刷新技术:构建安全高效的API调用体系
2025.10.14 02:35浏览量:1简介:本文提出了一种基于双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_tokenconst 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}`;// 通知所有订阅者更新tokensubscribers.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)。
通过持续迭代,该技术方案将为构建更安全、高效的前后端交互体系提供有力支撑。

发表评论
登录后可评论,请前往 登录 或 注册