双Token的致命漏洞,你的系统安全吗?

简介: 你的双Token实现真的安全吗?很多人不知道,经典的双Token方案中其实藏着致命的漏洞。

@[TOC](内容总览)

我与双Token的第一次邂逅,是在手搓自己的个人博客时遇到的。

我仍然很清晰地记得,我是如何实现的:

```

我记得挺清楚,大致就是 短token与刷新token都放在了 请求头中,

如下:

```

## 旧的双Token实现方法

### Token类型

- **Access Token**: 短期有效token,用于API访问验证

- **Refresh Token**: 长期有效token,用于刷新Access Token


### 传输方式

```http

x-access-token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

x-refresh-token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

```


### 核心流程

1. **登录**: 返回双token到响应体

2. **API调用**: 前端在请求头携带Access Token

3. **Token刷新**: Access Token过期时,使用Refresh Token获取新的双token

4. **多点登录控制**: 新登录时将旧Refresh Token加入黑名单

### 没有意识到的风险

```

我仍然记得,当时兴致匆匆的,以为自己是个天才。

限于当时的学识,我从来没有考虑过:xss攻击。

现在回想起来真是让当时的自己感到脸红。

```

#### 什么是XSS

`XSS(跨站脚本攻击)` 是一种常见的网络安全漏洞,攻击者通过在网页中注入恶意脚本,在用户浏览器中执行这些脚本来窃取信息或进行其他恶意操作。并且他主要有两种。

1. 存储型 XSS

```

- 恶意脚本被永久存储在服务器上(如数据库)

- 当其他用户访问受影响页面时自动执行

- 危害:盗取用户会话、cookie、个人信息

```

2. 反射型 XSS

```

- 恶意脚本通过 URL 参数等方式传递

- 服务器直接返回包含恶意脚本的页面

- 需要诱使用户点击恶意链接

```

`简单来说,你可以将其看作一个,他会偷走你数据的小偷。`


## 转机

后来在参加过几个项目后,我就开始为双Token的缺陷寻找解决方案。

最开始,我想到的方法是:

```

Access + Refresh 均放 Cookie

当cookie中的HttpOnly设置为true时,脚本就偷不走我想保护的数据了。

因为此时两者(Access、Refresh)均不受 XSS(因为HttpOnly=true)

```

### CSRF的风险

```

当我以为,我已经找到了万全之策时,

殊不知,我只是从一个坑跳进了另一个坑。

```

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/f9293efa0dad4b6582bb52a4802ddcb7.png#pic_center =50%x50%)


#### 什么是CSRF

你可以想象一下,接下来这个场景:

```

- 你登录了网上银行(保持登录状态)

- 然后你访问了一个恶意网站

- 这个恶意网站悄悄向银行发送转账请求

- 因为浏览器会自动带上你的登录cookie,银行认为这是你的合法操作

- 结果:你的钱被转走了

```

#### 常见的攻击步骤:

1. **用户登录**:用户登录正规网站,获得认证cookie

2. **保持会话**:用户没有登出,会话仍然有效

3. **访问恶意网站**:用户点击了攻击者发的链接或访问恶意网站

4. **伪造请求**:恶意网站自动向正规网站发送请求(携带用户的cookie)

5. **执行操作**:正规网站认为是用户的自愿操作

#### CSRF 与 XSS 的区别:


| 特性 | CSRF | XSS |

|------|------|-----|

| **攻击目标** | 利用用户的登录状态 | 窃取用户数据/会话 |

| **攻击方式** | 伪造请求 | 注入恶意脚本 |

| **依赖条件** | 用户已登录目标网站 | 网站存在输入漏洞 |

| **防护重点** | 请求来源验证 | 输入输出过滤 |


`大概意思是说:CSRF是个骗子,而XSS是个小偷`

## 新的解决方案

`世上没有十全十美`,而我现在采用的方式是:**Refresh 用 HttpOnly Cookie** +** Access 用 Header**


### 现方案:Refresh 用 HttpOnly Cookie + Access 用 Header

- 客户端约定:

 - 请求头携带:`x-access-token: <ACCESS_TOKEN>`

 - 刷新时:浏览器自动携带 `x-refresh-token` Cookie(HttpOnly)

- 后端行为:

 - 登录设置 `x-refresh-token`(HttpOnly, Path=/, Domain=当前域,`secure` 随 HTTPS)

 - 刷新接口只需读取 Cookie,不接收 `x-refresh-token` 头

 - 多点登录/黑名单:Redis 记录旧 Refresh,登录时旧值入黑名单并写入新值

- 优点:

 - XSS 面显著降低:Refresh Token 不再可读

 - CSRF 可控:结合 SameSite、Origin 校验、Token 验签

 - 前端更简:无需存/传 Refresh Token

- 注意点:

 - 跨域需开启凭证:前端 `withCredentials: true`;后端 CORS 需 `Access-Control-Allow-Credentials: true` 且明确 `Allow-Origin`


通过以上的折中的方案,可以既能享受到双token带来的便利,又能尽量降低损失。

如果你还有更好的建议,欢迎留言,评论( •̀ ω •́ )✧


## 拓展:    

### 跨域是什么  

浏览器把“同源”定义为三要素都相同:**协议 + 域名(IP) + 端口**。  

只要有一个不同,就叫跨域,会触发 CORS 限制。  

例子:  

- `http://192.168.1.10:3000` → `http://192.168.1.10:8002`:端口不同,跨域  

- `http://localhost:3000` → `http://127.0.0.1:3000`:域名不同,跨域  

- `http://` → `https://`:协议不同,跨域  

### Cookie 常用字段说明(作用)

- **name / value**:Cookie 的名字和值  

- **domain**:限定哪个域名可以收到这个 Cookie  

- **path**:限定哪个路径可以收到这个 Cookie(如 `/` 代表全站)  

- **expires / maxAge**:过期时间(maxAge 是秒;expires 是具体时间点)  

- **secure**:只允许在 HTTPS 连接下发送  

- **httpOnly**:JS 无法读取(document.cookie 看不到),防 XSS  

- **sameSite**:控制跨站请求是否携带 Cookie  

 - **Lax**:默认,跨站的普通请求不带,安全和可用平衡  

 - **Strict**:最严格,跨站一律不带  

 - **None**:跨站也带,但必须配合 `secure=true`(HTTPS)  

```go

// 判断 host 是否是 IP 地址;IP 访问下不要设置 domain

if net.ParseIP(host) != nil {

 c.SetCookie(name, value, maxAge, "/", "", c.Request.TLS != nil, false)

 return

}

// 域名访问:设置 domain 为主机名

// 设置 SameSite 为 Lax(默认),如需 Strict 需显式调用 c.SetSameSite(http.SameSiteStrictMode)

// 这里保持默认 Lax 以平衡安全性与体验

c.SetCookie(name, value, maxAge, "/", host, c.Request.TLS != nil, false)

 ```

目录
相关文章
|
7天前
|
前端开发 JavaScript 开发者
前端开发:不写样式代码才是最好的写样式方式
本文揭示前端开发中“重样式、轻业务”的困局,指出CSS调试耗时低效、易出错且价值难被认可。提出通过架构层建设统一的样式体系——涵盖组件库、样式库、mixin、变量、PostCSS与Stylelint,让业务开发者少写甚至不写CSS,专注核心逻辑,实现高效、一致、可维护的前端研发。
325 124
|
5天前
|
人工智能 Linux API
告别周五熬夜写周报!OpenClaw全自动周报生成实战教程(阿里云/本地部署+百炼API配置)
每到周五,无数职场人都会陷入同样的内耗:想不起一周做了什么、琐碎工作不知如何包装、流水账没人想看、写报告占用大量休息时间。2026年,借助OpenClaw(Clawdbot)AI智能体,你只需要每天花5分钟简单记录碎片工作,就能让AI自动整理、结构化包装、价值升华,生成让领导一眼认可的专业周报。本文将完整讲解AI自动生成周报的完整流程,并提供**2026年3月最新阿里云ECS、Windows11、MacOS、Linux全平台部署OpenClaw**详细步骤、**阿里云百炼Coding Plan免费大模型API配置**、可直接复制的代码命令与高频问题解答,让AI成为你的专职周报助理,彻底解放周末
339 89
|
4天前
|
Linux API 数据安全/隐私保护
OpenClaw零门槛部署手册:阿里云+本地多系统搭建+免费大模型配置流程+常见问题解析
OpenClaw(昵称“龙虾”)作为2026年热门的开源AI框架,区别于传统聊天型AI,其核心价值在于能够自动执行任务、操作设备、处理文件、浏览网页,成为真正意义上的“数字员工”。该工具完全开源,支持多平台部署,既可以通过阿里云实现云端7×24小时稳定运行,也能部署在本地MacOS、Linux、Windows11设备上保障数据隐私。本文将详细拆解2026年OpenClaw的部署流程,包括阿里云轻量应用服务器一键部署、ECS手动部署,以及本地三大系统的安装步骤,同时提供阿里云百炼免费API与Coding Plan免费大模型的配置方法,并整理部署与使用中的常见问题,帮助新手零门槛上手。
230 6
|
5天前
|
人工智能 弹性计算 监控
OpenClaw到底是啥?能做什么?怎样部署?一文讲透!
2026年初爆火的开源AI智能体OpenClaw,被网友爱称“小龙虾”。它不止能对话,更能本地执行文件管理、邮件发送、代码运行等真实任务,实现AI从“动口”到“动手”的跨越。阿里云支持一键部署,零门槛拥有专属AI助理!
280 13
|
4天前
|
人工智能 安全 数据挖掘
《【脑洞】想做一个基于Qwen的“启灵麒麟”智能体,寻找志同道合的开发者/策划》
“启灵”麒麟是中国AI国家级文化IP战略:以“启灵”为名,赋予AI中文灵魂;以“麒麟”为相,承载仁智祥瑞的文化图腾。通过智能玩偶、科普动画、开放世界游戏构建虚实融合的“启灵宇宙”,推动阿里从技术提供商跃升为AI文化定义者。
|
2天前
|
人工智能 Linux iOS开发
OpenClaw+QMT‑MCP量化交易实战:AI交易员全流程部署、模型配置与自动交易实现(附阿里云/Windows/macOS/Linux部署OpenClaw教程)
在量化交易领域,自动化执行与策略智能化已成为主流方向。OpenClaw(Clawdbot)作为开源AI Agent框架,可充当交易系统的“大脑”,负责理解指令、分析行情、拆解逻辑、规划执行;QMT‑MCP则遵循MCP(Model Context Protocol)协议,将本地QMT交易客户端封装为标准接口,成为AI交易员的“执行双手”,完成下单、撤单、查询持仓、查询资产等真实交易操作。
310 7
|
4天前
|
人工智能 Linux API
9.9元上手OpenClaw超级助理:阿里云一键部署+本地搭建+百炼API配置+避坑指南
2026年,AI已经从“辅助聊天”进化为“真正替人干活”的执行智能体,而OpenClaw(曾用名Clawdbot、Moltbot,俗称龙虾AI)正是这场变革中的标杆产品。它不再是只能给出文字建议的对话工具,而是能直接操控设备、处理文件、收发邮件、编写代码、管理日程、抓取数据的全天候数字员工。为了让普通用户也能零门槛用上这款强大工具,阿里云在2026年3月推出OpenClaw专属一键部署方案,新用户首月仅需9.9元,即可拥有2核2G、40GB ESSD、200Mbps带宽的预装环境,10分钟内完成全流程搭建。
136 7
|
7天前
|
人工智能 安全 API
从入门到精通!OpenClaw阿里云/本地搭建+百炼API配置+必装Skill清单+避坑实战手册
2026年,OpenClaw(Clawdbot)已经成为AI智能体领域最具实用性的开源框架,凭借本地优先、可扩展、支持自主执行的特性,成为大量普通用户与技术爱好者打造专属AI助手的首选方案。但在实际使用过程中,绝大多数用户在完成基础部署后,都会面临AI不够智能、回答不准确、任务执行失败、安全性不足等问题。根本原因在于**没有构建一套完整、安全、可自我迭代的技能(Skill)体系**。
299 12
|
7天前
|
人工智能 安全 API
OpenClaw阿里云/本地部署保姆级教程及百炼Coding Plan配置+必装5大技能指南:让AI Agent真正落地干活
在2026年AI智能体竞争白热化的当下,多数用户仍将AI局限于“问答工具”的范畴,却忽略了其核心价值——接入真实世界工具与数据源,自主完成全流程任务。OpenClaw(原Clawdbot)的革命性意义,在于通过ClawHub技能生态,让AI具备可执行的“手”和“脚”,而真正拉开使用差距的,是能否选对、用好核心技能。
270 11
|
7天前
|
人工智能 安全 JavaScript
OpenClaw 2026 Mac安装教程:官网命令安装及Homebrew + Python + Ollama一键配置
OpenClaw 2026 Mac安装教程:支持官网一键脚本(5分钟完成)及Homebrew+Ollama手动配置,兼容Intel/M芯片、macOS 12+。含环境验证、模型对接与网关启动全流程。新手更推荐阿里云轻量服务器一键部署(38元/年),安全省心。
431 8