前端进阶之旅前端进阶之旅
  • 基础篇HTML/CSS/JS 打底
  • 进阶篇原理与工程化
  • 高频篇面试最常问的那批
  • 精选篇按模块收敛的总结
  • 手写篇常考代码手写实现
  • 面经篇真实面试问题复盘
  • AI 篇NEWAI 时代的前端考点
  • 历年面经NEW按年份追踪真实考点
  • 每日一题每天一道,攒手感
  • 专项自测100 题快速查漏
  • 小程序题库小程序专项刷题
  • 算法题库NEW在线编码即时判题
  • 知识卡片NEW碎片时间过考点
  • 面试题大全常见问题解析
  • AI 答疑NEW随时提问,即时解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • AI 定制路线NEW按你的简历现排
  • AI 知识地图NEW串起全站知识点
  • 原理篇React / Vue 源码拆解
  • HTTP从报文一路讲到 HTTPS
  • 浏览器渲染、事件循环、进程
  • 计算机基础Linux、网络、操作系统
  • 设计模式23 种模式怎么用
  • Node学习指南从环境搭建到服务端
  • NPM工作流script、依赖与发布
  • Docker容器化部署上手
  • Canvas图形与动画实战
  • 前端系统进阶学习大型项目工程化
  • 前端综合文章长期沉淀的实践文
  • 思维导图知识点全景图
  • 学习路线按图索骥不跑偏
  • AI 热点NEWAI 每日动态
  • 公众号动态公众号历史文章
  • 博客动态站长的技术博客
  • 开发者导航常用工具与文档站
  • 基础篇HTML/CSS/JS 打底
  • 进阶篇原理与工程化
  • 高频篇面试最常问的那批
  • 精选篇按模块收敛的总结
  • 手写篇常考代码手写实现
  • 面经篇真实面试问题复盘
  • AI 篇NEWAI 时代的前端考点
  • 历年面经NEW按年份追踪真实考点
  • 每日一题每天一道,攒手感
  • 专项自测100 题快速查漏
  • 小程序题库小程序专项刷题
  • 算法题库NEW在线编码即时判题
  • 知识卡片NEW碎片时间过考点
  • 面试题大全常见问题解析
  • AI 答疑NEW随时提问,即时解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • AI 定制路线NEW按你的简历现排
  • AI 知识地图NEW串起全站知识点
  • 原理篇React / Vue 源码拆解
  • HTTP从报文一路讲到 HTTPS
  • 浏览器渲染、事件循环、进程
  • 计算机基础Linux、网络、操作系统
  • 设计模式23 种模式怎么用
  • Node学习指南从环境搭建到服务端
  • NPM工作流script、依赖与发布
  • Docker容器化部署上手
  • Canvas图形与动画实战
  • 前端系统进阶学习大型项目工程化
  • 前端综合文章长期沉淀的实践文
  • 思维导图知识点全景图
  • 学习路线按图索骥不跑偏
  • AI 热点NEWAI 每日动态
  • 公众号动态公众号历史文章
  • 博客动态站长的技术博客
  • 开发者导航常用工具与文档站
首页程序员面试题库JWT localStorage Cookie XSS CSRF 存储
身份身份与权限身份认证与授权

前端把 JWT 存在 localStorage 还是 HttpOnly Cookie,各自面临的 XSS 与 CSRF 风险如何权衡?

前端存储 JWT 的选择本质是攻击面取舍:localStorage 易被 XSS 窃取,HttpOnly Cookie 防 XSS 却面临 CSRF。本答案对比两种方案的威胁模型、缓解措施与适用场景。

前端进阶之旅 · 一题精讲更新于 2026.09.05
身份与权限#身份认证与授权#安全#HTTP
先看核心答案
理解线索

JWT 存储的攻防博弈

  1. XSS 读取localStorage 可被任何脚本读取
  2. CSRF 触发Cookie 自动携带需 SameSite
  3. 缓解组合Cookie+CSRF Token 或内存令牌

没有绝对安全,需按业务风险与攻击面权衡。

核心回答

先记住这个答案

将 JWT 存 localStorage 时,任何 XSS 注入的脚本都能直接读取并外传,风险极高;而 HttpOnly Cookie 能阻止脚本访问,但会随请求自动携带,需用 SameSite 和 CSRF Token 防护。推荐将 Refresh Token 放 HttpOnly Cookie,Access Token 放内存;若必须持久化,优先 HttpOnly Cookie 并配置严格的同站策略。

  • HttpOnly Cookie 防 XSS 但需防 CSRF
  • localStorage 易被 XSS 直接窃取
  • 刷新令牌应放 Cookie 并加轮换

存储位置决定攻击路径

localStorage 的数据受同源策略保护,但页面内任何已运行的脚本都能通过 localStorage.getItem('token') 读取。若站点存在存储型 XSS,攻击者可直接窃取 JWT 并离线重放,无需欺骗用户点击或依赖 Cookie 发送。这种风险在 SPA 中尤其严重,因为前端代码大量使用用户输入渲染 HTML。

HttpOnly Cookie 则禁止 document.cookie 和脚本 API 访问,XSS 无法直接偷取令牌。但 Cookie 会由浏览器自动附加到同源请求,若没有适当防护,攻击者可构造恶意页面发起跨站 POST(如表单)触发 CSRF。SameSite 属性可限制跨站发送,Lax 模式下跨站 POST 请求不发送 Cookie,Strict 更安全但影响外部链接跳转。

电商 React SPA 的令牌放置决策

假设一个 React SPA 调用 REST API,用户登录后获得 Access Token 和 Refresh Token。若将两者都存 localStorage,攻击者通过产品搜索框的 XSS payload 即可窃取令牌并调用下单接口。处理:将 Access Token 保存在内存变量中,刷新页面后重新获取;Refresh Token 放入 HttpOnly + Secure + SameSite=Lax 的 Cookie,并设置短过期与轮换。

这样即使发生 XSS,攻击者拿不到 Refresh Token;需要 CSRF 保护时,API 要求自定义 X-CSRF-Token 头,因为同源页面才能读取 Cookie 中的 CSRF 值。每次刷新令牌时同时旋转 Refresh Token,并在服务端记录已使用状态,检测到重放就撤销整个会话。

反例与失效条件

若站点已启用严格 CSP 且无任何 XSS 入口,localStorage 的风险降低,但依赖“无 XSS”是脆弱的,第三方脚本或供应链攻击可绕过。同样,Cookie 方案若未设置 SameSite 或 CSRF Token,则面对跨站请求伪造会失守;且子域 cookie 作用域过宽也会扩大攻击面。

内存令牌的代价是刷新会丢失登录态,需用 Refresh Token 静默续期,但 Refresh Token 本身存储在 Cookie 中也存在 CSRF 风险,必须结合 SameSite 和校验自定义头。Cookie 大小限制(4KB)会制约 JWT 长度,需权衡声明数量;同时服务端时钟偏差需在过期校验时考虑。

回答前,多想一步

容易答错的地方

只要用 HttpOnly Cookie 就绝对安全
错误。Cookie 防 XSS 但未防 CSRF,若未配置 SameSite 和 Token 校验,跨站请求仍能冒用。此外若 JWT 存在 Cookie 且无 Secure 属性,HTTP 明文传输可被截获。安全需要多属性组合。
localStorage 只担心存储型 XSS
反射型 XSS 同样能在响应中插入脚本,只需欺骗用户点击链接。任何脚本执行点都能读取 localStorage,且由于令牌持久存在,窃取后有效时间更长。
试着用自己的话回答

面试官还会怎么问?

为什么不用 localStorage 存 Access Token 而用内存?

因为 Access Token 生命周期短,每次刷新页面后可通过 Refresh Token 重新获取。内存变量使 XSS 只能窃取当前会话的令牌,无法获得持久凭证。代价是刷新页面需重新静默登录,但可接受。

CSRF Token 与 SameSite 属性可以同时用吗?

可以,推荐同时使用。SameSite 处理浏览器的同站策略,CSRF Token 则针对所有跨站请求提供应用层校验。两者互补,即使 SameSite 被绕过(如旧浏览器),CSRF Token 仍能拦截。

Refresh Token 在 Cookie 中如何避免 CSRF 被利用?

Refresh Token 的端点必须验证 CSRF Token,且令牌本身应设置短过期与轮换。即使攻击者触发 CSRF 刷新,也只能得到新令牌,但攻击者无法读取新 cookie 中的值,因此无法实际使用,配合重放检测可失效。

从一道题,走向一组知识

把知识连起来

身份认证与授权

HS256 的 JWT 密钥应该如何生成、存储和轮换,硬编码在代码里有什么风险?

同属「身份认证与授权」专题,接着看 JWT 密钥管理 轮换 硬编码风险 在具体场景中的处理方式。

身份认证与授权

JWT 验证中 alg=none 与 RS256/HS256 算法混淆攻击是如何发生的,如何防御?

同属「身份认证与授权」专题,接着看 JWT alg none 算法混淆攻击 防御 在具体场景中的处理方式。

参考资料

  • ¶

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 存储位置决定攻击路径
  3. 电商 React SPA 的令牌放置决策
  4. 反例与失效条件
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑