JWT 存在 localStorage 会被 XSS 攻击吗?

上官莉娟 阅读 14

我最近在项目里用 JWT 做用户认证,把 token 存在了 localStorage 里,但听说这样容易被 XSS 攻击偷走。我试过改成存 cookie,但又担心 CSRF 问题,到底该怎么安全地存 JWT 啊?

我来解答 赞 7 收藏
二维码
手机扫码查看
1 条解答
Code°世英
确实,localStorage 存 JWT 是个经典坑,XSS 一中招 token 就没了,连哭都来不及。
你提到的两个方案——localStorage 和 cookie——各有各的坑,但别慌,WordPress 下有成熟解法。

核心思路是:用 httpOnly + secure 的 cookie 存 token,再配合 nonce 防 CSRF,别自己造轮子。

WordPress 自带的 wp_create_noncewp_verify_nonce 就是干这个的。你后端认证时发 JWT 的同时,再生成一个 nonce,前端每次请求时把 nonce 当作 header 或 query 参数带上去,后端用 wp_verify_nonce 校验就行。这样 CSRF 就基本堵住了。

另外,别用原生 fetchjQuery.ajax 直接写,用 WordPress 提供的 wp.apiFetch(WP 5.6+)或 wp.ajax,它们默认会带上 nonce,省心不少。

至于 cookie,记得设置 Set-Cookie: token=xxx; HttpOnly; Secure; SameSite=Strict,SameSite 最好别用 Lax,Strict 更安全,虽然会影响跨站 GET 请求,但 JWT 场景下 POST/PUT/DELETE 才是常态,影响不大。

最后提醒一句:别在前端 JS 里直接操作 token(比如 localStorage.getItem('jwt')),那等于把命门交给 XSS。你只要让 cookie 自动带过去,JS 完全不碰它,就安全多了。

真要上生产,记得再扫一遍 XSS 漏洞,比如用户评论区有没有过滤 HTML,插件有没有注入未转义的 JS——这些比存 token 的地方更致命。
点赞 1
2026-02-25 10:00