Token与axios拦截器

news2025/4/23 1:44:09

目录

一、Token 详解

1. Token 的定义与作用

2. Token 的工作流程

3. Token 的优势

4. Token 的安全实践

5. JWT 结构示例

二、Axios 拦截器详解

1. 拦截器的作用

2. 请求拦截器

3. 响应拦截器

4. 拦截器常见场景

5. 移除拦截器

三、完整代码示例

四、总结

五、axios高级配置

1. 全局默认配置

2. 创建实例(隔离配置)

3. 取消请求

4. 并发请求

5. 文件上传

6. 文件下载

六、XSS(跨站脚本攻击)

1. 攻击原理

2. 攻击示例

3. 防御措施

七、CSRF(跨站请求伪造)

1. 攻击原理

2. 防御措施

八、Token 在防御中的应用

1. Token 类型

2. 安全实践

3. JWT 安全增强

九、总结


一、Token 详解

1. Token 的定义与作用

Token(令牌)是用于在客户端和服务器之间安全传递用户身份信息的一种凭证,通常用于身份验证和授权流程。

  • 核心作用

    • 身份验证(Authentication):验证用户身份(如登录状态)。

    • 授权(Authorization):授予用户访问特定资源的权限(如 API 端点)。

  • 常见类型

    • JWT(JSON Web Token):最流行的无状态令牌格式,包含头部、载荷和签名。

    • OAuth2 Token:用于第三方授权(如使用 Google 登录)。

    • Session Token:传统有状态会话标识(如 Session ID)。


2. Token 的工作流程
1. 用户登录 → 服务器验证凭据 → 生成 Token → 返回给客户端
2. 客户端存储 Token(如 localStorage、Cookie)
3. 客户端发起请求时携带 Token(通常通过 HTTP 头)
4. 服务器验证 Token → 授权访问资源

3. Token 的优势
  • 无状态性:服务器无需存储会话信息(适合分布式系统)。

  • 跨域支持:易于在多个服务间传递用户身份(如微服务架构)。

  • 安全性:可通过签名(JWT)或加密防止篡改。


4. Token 的安全实践
  • 存储方式

    • 推荐:使用 httpOnlySecureSameSite=Strict 的 Cookie(防 XSS)。

    • 次选localStorage 或 sessionStorage(需防范 XSS)。

  • 传输方式

    • 通过 Authorization 请求头传输(如 Bearer <token>)。

  • 过期时间

    • 设置短期有效的 Token(如 15 分钟),配合 Refresh Token 续期。


5. JWT 结构示例
Header:  {"alg": "HS256", "typ": "JWT"}
Payload: {"sub": "user123", "exp": 1620000000}
Signature: HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)

二、Axios 拦截器详解

1. 拦截器的作用

拦截器允许在请求发送前或响应返回后,统一添加逻辑(如添加 Token、处理错误)。

2. 请求拦截器
axios.interceptors.request.use(
  config => {
    // 请求发送前的处理(如添加 Token)
    const token = localStorage.getItem('token');
    if (token) {
      config.headers.Authorization = `Bearer ${token}`;
    }
    return config;
  },
  error => {
    // 请求错误处理
    return Promise.reject(error);
  }
);
3. 响应拦截器
axios.interceptors.response.use(
  response => {
    // 响应成功处理(状态码 2xx)
    return response.data; // 直接返回数据,简化后续处理
  },
  async error => {
    // 响应错误处理(状态码非 2xx 或网络错误)
    const originalRequest = error.config;
    
    // Token 过期且未重试过 → 尝试刷新 Token
    if (error.response?.status === 401 && !originalRequest._retry) {
      originalRequest._retry = true;
      try {
        const newToken = await refreshToken(); // 刷新 Token
        localStorage.setItem('token', newToken);
        originalRequest.headers.Authorization = `Bearer ${newToken}`;
        return axios(originalRequest); // 重试原请求
      } catch (refreshError) {
        logout(); // 刷新失败 → 跳转登录页
        return Promise.reject(refreshError);
      }
    }
    
    // 其他错误统一处理
    return Promise.reject(error);
  }
);

4. 拦截器常见场景
  • 自动添加 Token:统一为所有请求添加 Authorization 头。

  • Token 过期自动刷新:401 错误时刷新 Token 并重试请求。

  • 统一错误处理:网络错误、服务器错误等全局捕获。

  • 加载状态管理:显示/隐藏全局加载动画。


5. 移除拦截器
const requestInterceptor = axios.interceptors.request.use(...);
const responseInterceptor = axios.interceptors.response.use(...);

// 移除拦截器
axios.interceptors.request.eject(requestInterceptor);
axios.interceptors.response.eject(responseInterceptor);

三、完整代码示例

1. Token 管理 + Axios 拦截器

// 封装 Axios 实例
const api = axios.create({
  baseURL: 'https://api.example.com',
});

// 请求拦截器:添加 Token
api.interceptors.request.use(
  config => {
    const token = localStorage.getItem('token');
    if (token) {
      config.headers.Authorization = `Bearer ${token}`;
    }
    return config;
  },
  error => Promise.reject(error)
);

// 响应拦截器:处理 Token 过期
api.interceptors.response.use(
  response => response.data,
  async error => {
    const originalRequest = error.config;
    
    // Token 过期且未重试过
    if (error.response?.status === 401 && !originalRequest._retry) {
      originalRequest._retry = true;
      try {
        const newToken = await refreshToken();
        localStorage.setItem('token', newToken);
        originalRequest.headers.Authorization = `Bearer ${newToken}`;
        return api(originalRequest);
      } catch (refreshError) {
        logout();
        return Promise.reject(refreshError);
      }
    }
    
    // 其他错误处理
    return Promise.reject(error);
  }
);

// 刷新 Token 的函数
async function refreshToken() {
  const refreshToken = localStorage.getItem('refreshToken');
  const response = await axios.post('/auth/refresh', { refreshToken });
  return response.data.token;
}

// 退出登录
function logout() {
  localStorage.removeItem('token');
  localStorage.removeItem('refreshToken');
  window.location.href = '/login';
}

四、总结

  • Token:身份验证与授权的核心凭证,需安全存储和传输。

  • Axios 拦截器:实现全局请求/响应逻辑(如 Token 管理、错误处理),提升代码复用性和可维护性。

  • 最佳实践

    • 使用 httpOnly Cookie 存储 Token(防 XSS)。

    • 短期 Token + Refresh Token 提升安全性。

    • 拦截器中处理 Token 刷新避免并发问题。


五、axios高级配置

1. 全局默认配置
axios.defaults.baseURL = 'https://api.example.com';
axios.defaults.headers.common['Authorization'] = 'Bearer token123';
axios.defaults.timeout = 5000; // 超时时间(毫秒)
2. 创建实例(隔离配置)
const api = axios.create({
  baseURL: 'https://api.example.com',
  timeout: 3000
});

api.get('/data'); // 使用实例发送请求
3. 取消请求

使用 CancelToken(旧版):

const source = axios.CancelToken.source();

axios.get('/data', {
  cancelToken: source.token
}).catch(error => {
  if (axios.isCancel(error)) {
    console.log('请求被取消:', error.message);
  }
});

// 取消请求
source.cancel('用户手动取消');

使用 AbortController(新版,推荐):

const controller = new AbortController();

axios.get('/data', {
  signal: controller.signal
}).catch(error => {
  if (error.name === 'CanceledError') {
    console.log('请求已取消');
  }
});

// 取消请求
controller.abort();
4. 并发请求
const request1 = axios.get('/data1');
const request2 = axios.get('/data2');

axios.all([request1, request2])
  .then(axios.spread((res1, res2) => {
    console.log(res1.data, res2.data);
  }));
5. 文件上传
const formData = new FormData();
formData.append('file', fileInput.files[0]);

axios.post('/upload', formData, {
  headers: { 'Content-Type': 'multipart/form-data' }
});
6. 文件下载
axios.get('/download', {
  responseType: 'blob' // 指定响应类型为二进制流
}).then(response => {
  const url = window.URL.createObjectURL(new Blob([response.data]));
  const link = document.createElement('a');
  link.href = url;
  link.setAttribute('download', 'file.pdf');
  document.body.appendChild(link);
  link.click();
});

六、XSS(跨站脚本攻击)

1. 攻击原理
  • 定义:攻击者向网页注入恶意脚本(JavaScript、HTML、CSS),当其他用户访问该页面时,脚本在用户浏览器执行,窃取数据或劫持会话。

  • 类型

    • 存储型 XSS:恶意脚本永久存储在目标服务器(如论坛评论)。

    • 反射型 XSS:恶意脚本通过 URL 参数反射到页面(如钓鱼链接)。

    • DOM 型 XSS:前端 JavaScript 动态修改 DOM 时触发漏洞。

2. 攻击示例
// 用户输入未过滤,直接渲染到页面
用户评论内容:<script>stealCookie()</script>
3. 防御措施
  • 输入过滤与转义

    • 对用户输入的内容进行 HTML 转义(如 < → &lt;)。

    • 使用安全的库(如 DOMPurify)清理 HTML。

  • Content Security Policy(CSP)

    Content-Security-Policy: default-src 'self'; script-src 'self' trusted.com
    • 限制页面只能加载指定来源的脚本、样式等资源。

  • 设置 HttpOnly Cookie

    • 防止 JavaScript 通过 document.cookie 读取敏感 Cookie。

    // 服务器设置 Cookie
    Set-Cookie: sessionId=abc123; HttpOnly; Secure; SameSite=Strict

七、CSRF(跨站请求伪造)

1. 攻击原理
  • 定义:攻击者诱导用户访问恶意页面,该页面自动向目标网站发起请求(利用用户已登录的 Cookie)。

  • 示例

    <!-- 恶意页面中的图片标签 -->
    <img src="https://bank.com/transfer?to=attacker&amount=1000">
2. 防御措施
  • CSRF Token

    • 服务器生成随机 Token 嵌入表单或请求头,验证请求的合法性。

    <form action="/transfer" method="POST">
      <input type="hidden" name="csrf_token" value="随机值">
    </form>
  • SameSite Cookie

    • 限制 Cookie 仅在相同站点请求中发送。

    Set-Cookie: sessionId=abc123; SameSite=Strict; Secure
    • Strict:完全禁止第三方 Cookie。

    • Lax:允许安全导航(如链接跳转)携带 Cookie。

    • None:允许所有请求携带 Cookie(需配合 Secure)。

  • 验证请求来源

    • 检查 Origin 或 Referer 头部是否来自合法域名。


八、Token 在防御中的应用

1. Token 类型
  • CSRF Token:防御 CSRF 攻击,确保请求来自合法页面。

  • JWT(JSON Web Token):用于无状态身份验证,包含签名防篡改。

2. 安全实践
  • 存储方式

    • CSRF Token:存储在服务器 Session 或加密 Cookie 中。

    • JWT:通过 httpOnly + Secure Cookie 存储,或前端存储但结合短期有效期。

  • 传输方式

    • CSRF Token:嵌入表单隐藏字段或请求头(如 X-CSRF-Token)。

    • JWT:通过 Authorization: Bearer <token> 请求头传输。

3. JWT 安全增强
  • 签名验证:使用强加密算法(如 HS256、RS256)。

  • 有效期控制:设置短期有效的 exp 字段,配合 Refresh Token 续期。

  • 黑名单机制:注销时使特定 Token 失效。


九、总结

  • XSS 防御核心:防止恶意脚本注入,隔离用户输入与代码执行。

  • CSRF 防御核心:确保请求来源合法,阻断伪造请求。

  • Token 安全:结合存储安全(HttpOnly)、传输安全(HTTPS)和有效期管理。

综合防御策略:

攻击类型防御措施
XSS输入过滤 + CSP + HttpOnly Cookie + 避免 innerHTML 直接渲染用户输入。
CSRFCSRF Token + SameSite Cookie + 验证请求来源。
Token 安全使用 HTTPS + 安全存储(HttpOnly Cookie) + 短期有效 + 签名验证。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2340443.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Tailwind 武林奇谈:bg-blue-400 失效,如何重拾蓝衣神功?

前言 江湖有云,Tailwind CSS,乃前端武林中的轻功秘籍。习得此技,排版如行云流水,配色似御风随形,收放自如,随心所欲。 某日,小侠你奋笔敲码,正欲施展“蓝衣神功”(bg-blue-400),让按钮怒气冲冠、蓝光满面,怎料一招使出,画面竟一片白茫茫大地真干净,毫无半点杀气…

开始放飞之先搞个VSCode

文章目录 开始放飞之先搞个VSCode重要提醒安装VSCode下载MinGW-w64回到VSCode中去VSCode原生调试键盘问题遗留问题参考文献 开始放飞之先搞个VSCode 突然发现自己的新台式机上面连个像样的编程环境都没有&#xff0c;全是游戏了&#xff01;&#xff01;&#xff01;&#xff…

基于SA模拟退火算法的车间调度优化matlab仿真,输出甘特图和优化收敛曲线

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于SA模拟退火算法的车间调度优化matlab仿真,输出甘特图和优化收敛曲线。输出指标包括最小平均流动时间&#xff0c;最大完工时间&#xff0c;最小间隙时间。 2…

【仿Mudou库one thread per loop式并发服务器实现】SERVER服务器模块实现

SERVER服务器模块实现 1. Buffer模块2. Socket模块3. Channel模块4. Poller模块5. EventLoop模块5.1 TimerQueue模块5.2 TimeWheel整合到EventLoop5.1 EventLoop与线程结合5.2 EventLoop线程池 6. Connection模块7. Acceptor模块8. TcpServer模块 1. Buffer模块 Buffer模块&…

uniapp h5接入地图选点组件

uniapp h5接入地图选点组件 1、申请腾讯地图key2、代码接入2.1入口页面 &#xff08;pages/map/map&#xff09;templatescript 2.2选点页面&#xff08;pages/map/mapselect/mapselect&#xff09;templatescript 该内容只针对uniapp 打包h5接入地图选点组件做详细说明&#x…

【随缘更新,免积分下载】Selenium chromedriver驱动下载(最新版135.0.7049.42)

目录 一、chromedriver概述 二、chromedriver使用方式 三、chromedriver新版本下载&#x1f525;&#x1f525;&#x1f525; 四、Selenium与Chrome参数设置&#x1f525;&#x1f525; 五、Selenium直接操控已打开的Chrome浏览器&#x1f525;&#x1f525;&#x1f525;…

jenkins批量复制Job项目的shell脚本实现

背景 现在需要将“测试” 目录中的所有job全部复制到 一个新目录中 test2。可以结合jenkins提供的apilinux shell 进行实现。 测试目录的实际文件夹名称是 test。 脚本运行效果如下&#xff1a; [qdevsom5f-dev-hhyl shekk]$ ./copy_jenkins_job.sh 创建文件夹 test2 获取源…

iOS Google登录

iOS Google登录 SDK下载地址在 Firebase 有下载&#xff0c;要下载整个SDK文件&#xff0c;然后拿其中的Google 登录SDK来使用 Firebase 官方文档 github 下载链接

嵌入式工程师( C / C++ )笔试面试题汇总

注&#xff1a;本文为 “嵌入式工程师笔试面试题” 相关文章合辑。 未整理去重。 如有内容异常&#xff0c;请看原文。 嵌入式必会 C 语言笔试题汇总 Z 沉浮 嵌入式之旅 2021 年 01 月 19 日 00:00 用预处理指令 #define 声明一个常数&#xff0c;用以表明 1 年中有多少秒&a…

重构便携钢琴专业边界丨特伦斯便携钢琴V30Pro定义新一代便携电钢琴

在便携电钢琴领域&#xff0c;特伦斯推出的V30Pro折叠钢琴以"技术革新场景适配"的双重升级引发关注。这款产品不仅延续了品牌标志性的折叠结构&#xff0c;更通过声学系统重构与智能交互优化&#xff0c;重新定义了便携乐器的专业边界。 ▶ 核心特点&#xff1a;技术…

DiffuRec: A Diffusion Model for Sequential Recommendation

DiffuRec: A Diffusion Model for Sequential Recommendation Background 序列推荐&#xff08;Sequential Recommendation, SR&#xff09;领域&#xff0c;主流方法是将用户与物品表示为fixed embedding。然而&#xff0c;这种静态向量表达方式难以全面刻画用户多样化的兴趣…

多模态大语言模型arxiv论文略读(三十三)

Jailbreaking Attack against Multimodal Large Language Model ➡️ 论文标题&#xff1a;Jailbreaking Attack against Multimodal Large Language Model ➡️ 论文作者&#xff1a;Zhenxing Niu, Haodong Ren, Xinbo Gao, Gang Hua, Rong Jin ➡️ 研究机构: Xidian Univer…

IntelliJ IDEA download JDK

IntelliJ IDEA download JDK 自动下载各个版本JDK&#xff0c;步骤 File - Project Structure &#xff08;快捷键 Ctrl Shift Alt S&#xff09; 如果下载失败&#xff0c;换个下载站点吧。一般选择Oracle版本&#xff0c;因为java被Oracle收购了 好了。 花里胡哨&#…

计算机网络——常见的网络攻击手段

什么是XSS攻击&#xff0c;如何避免? XSS 攻击&#xff0c;全称跨站脚本攻击&#xff08;Cross-Site Scripting&#xff09;&#xff0c;这会与层叠样式表(Cascading Style Sheets, CSS)的缩写混淆&#xff0c;因此有人将跨站脚本攻击缩写为XSS。它指的是恶意攻击者往Web页面…

面向对象设计中的类的分类:实体类、控制类和边界类

目录 前言1. 实体类&#xff08;Entity Class&#xff09;1.1 定义和作用1.2 实体类的特点1.3 实体类的示例 2. 控制类&#xff08;Control Class&#xff09;2.1 定义和作用2.2 控制类的特点2.3 控制类的示例 3. 边界类&#xff08;Boundary Class&#xff09;3.1 定义和作用3…

鸿蒙ArkUI实战之TextArea组件、RichEditor组件、RichText组件、Search组件的使用

本文接上篇继续更新ArkUI中组件的使用&#xff0c;本文介绍的组件有TextArea组件、RichEditor组件、RichText组件、Search组件&#xff0c;这几个组件的使用对应特定场景&#xff0c;使用时更加需要注意根据需求去使用 TextArea组件 官方文档&#xff1a; TextArea-文本与输…

初创企业机器学习训练:云服务器配置对效率、成本与可扩展性的影响

在当今的初创企业中&#xff0c;机器学习模型训练已成为驱动创新和智能产品的核心环节。然而&#xff0c;深度学习模型的训练通常需要大量的计算资源&#xff0c;如何高效利用云服务器的基础配置成为初创团队关注的重点。云服务器的基础配置通常包括 vCPU&#xff08;虚拟CPU&a…

【“星瑞” O6 评测】—NPU 部署 face parser 模型

前言 瑞莎星睿 O6 (Radxa Orion O6) 拥有高达 28.8TOPs NPU (Neural Processing Unit) 算力&#xff0c;支持 INT4 / INT8 / INT16 / FP16 / BF16 和 TF32 类型的加速。这里通过通过官方的工具链进行FaceParsingBiSeNet的部署 1. FaceParsingBiSeNet onnx 推理 首先从百度网盘…

56、如何快速让⼀个盒⼦⽔平垂直居中

在网页开发中&#xff0c;有多种方式能让一个盒子实现水平垂直居中。下面为你介绍几种常见且快速的方法。 1. 使用 Flexbox 布局 Flexbox 是一种非常便捷的布局模型&#xff0c;能够轻松实现元素的水平和垂直居中。 html <!DOCTYPE html> <html lang"en"&…

BDO分厂积极开展“五个一”安全活动

BDO分厂为规范化学习“五个一”活动主题&#xff0c;按照“上下联动、分头准备 、差异管理、资源共享”的原则&#xff0c;全面激活班组安全活动管理新模式&#xff0c;正在积极开展班组安全活动&#xff0c;以单元班组形式对每个班组每周组织一次“五个一”安全活动。 丁二醇单…