在 Web 场景里,最常见的几种**JWT(JSON Web Token)**存储方式主要有:
Cookie(HttpOnly + Secure)普通 Cookie(可被 JS 读取)localStoragesessionStorage内存变量(in-memory)下面从安全性、跨域便利性、实现复杂度等方面做一个详细对比,帮助你根据业务场景做出选择。
1. Cookie(HttpOnly + Secure)1.1 基本原理服务器端在用户登录或获取 Token 后,通过Set-Cookie响应头把 Token 设置到浏览器 Cookie 中,并加上HttpOnly、Secure、SameSite等安全属性。浏览器在后续请求时自动携带 Cookie,无需手动在前端写逻辑附带 Token。HttpOnly 可以防止前端脚本直接读取 Cookie,从而降低 XSS 造成令牌泄露的风险。1.2 优点安全性高: HttpOnly 减少 XSS 攻击时泄露 Token 的风险;Secure 确保只能在 HTTPS 下传输 Token,防止明文窃听;可结合SameSite、CSRF Token 等策略提升对 CSRF 攻击的防御能力。使用方便: 浏览器请求会自动携带 Cookie,后端可直接从请求的 Cookie 中获取 Token 并校验。更贴近传统 Session 的使用习惯: 对于传统后端渲染或同域名场景,迁移成本低。1.3 缺点跨域场景配置相对复杂: 如果需要前后端在不同域名(或端口)下交互,就要在服务器端正确配置 CORS(跨域资源共享)、Access-Control-Allow-Credentials等,且 Cookie 的SameSite可能需要设为None并配合Secure。需要额外防范 CSRF: 当浏览器自动带 Cookie 时,攻击者若能诱导用户访问恶意链接,也会携带 Cookie,因此需要在后端或前端做 CSRF 防御(常见方式:CSRF Token / Double Submit Cookie / SameSite 策略)。1.4 适用场景同域或同顶级域名下的前后端应用(SPA、SSR、微前端等)。需要较高安全性、不希望前端脚本访问到 Token。可以配合 CSRF 方案且对跨域配置有一定理解。2. 普通 Cookie(可被 JS 读取)2.1 基本原理与上面类似,将 Token 存在浏览器 Cookie 中,但不加HttpOnly属性,所以前端脚本(JS)可以读取和写入 Token。2.2 优点实现简单: 不用在请求头里手动加 Token,浏览器会自动带上;同时若前端要展示或处理与 Token 关联的信息,也能直接读取 Cookie。2.3 缺点安全风险高: 任何前端脚本(包括被 XSS 注入的恶意脚本)都能读取到 Token,一旦泄露 Token,攻击者可冒充用户发起请求。同样存在 CSRF 风险: 与 HttpOnly Cookie 一样,也需要做防范 CSRF 的工作。2.4 适用场景原则上不推荐在生产环境使用,因为 XSS 一旦发生,Token 会立即泄露。可能仅在非常简单的 Demo 或内部工具里用到,但要非常注意 XSS 防护。3. localStorage3.1 基本原理前端在用户登录成功后,从后端获取 JWT,将其保存在浏览器的window.localStorage中。发送请求时,前端显式地从localStorage中拿 Token,加到Authorization: Bearer
安全性(防XSS)
防CSRF
跨域/多域配置
易用性/集成难度
生命周期管理
Cookie(HttpOnly)
较高(HttpOnly)
需要配合 CSRF 方案
需要 CORS + SameSite 配置
易用(自动发送),但配置跨域略复杂
由服务端/Cookie 属性控制
普通 Cookie
较低(可读写)
同上,需CSRF防范
同上
简单,但易泄露
同上
localStorage
较低
通常不自动发起CSRF,但仍需整体防范
较灵活
实现需要前端手动传 Token
前端自行控制,需刷新策略
sessionStorage
同 localStorage
同 localStorage
同 localStorage
同 localStorage
关闭Tab即失效
内存变量(in-memory)
低(可读写)
无Cookie自动发送
最灵活
需自行实现刷新逻辑
刷新或关闭页面即失效
注:
防XSS 并不是指“绝对防”,而是指“难度高低”。HttpOnly Cookie 在前端脚本层面更难被直接读取,但如果 XSS 能执行任意脚本,也可能在发送请求时自动携带 Cookie 的情况下做进一步操作。防CSRF 主要关注的是浏览器是否自动带上凭证。Cookie(不管是否 HttpOnly)都会自动带上,需要后端或前端实现额外防护。localStorage / sessionStorage / 内存变量 主要在发起请求时手动注入 Token,因此在默认情况下对 CSRF 攻击更有“天然屏障”(因为攻击者无法自动借助用户浏览器带上 Authorization 头),但若应用还有其他 Cookie-based 功能也需要防范 CSRF。7. 如何选择?同域名 / 安全要求较高 / 有后端渲染或 SPA 场景 首选:HttpOnly Cookie+ CSRF 防护好处:自动带 Cookie,后端对请求身份校验统一,且 Token 不会被 JS 直接读取。前后端分离 + 跨域复杂 + 需要细粒度控制 + 需要移动端/第三方对接 可以使用localStorage或内存变量来管理 Token,并手动在请求中附加Authorization: Bearer