Cookie 与 Header

一个绕不开的问题

Token 设计好了,接下来是「客户端把它放哪」。Web 场景最常见的两个选项:

  • Cookie:浏览器自动带上,配合 HttpOnly、Secure、SameSite。
  • Authorization Header:前端把 Token 存到内存 / LocalStorage,请求时手动带上。

选错的风险很具体:XSS 会偷走脚本能读到的 Token,CSRF 会让浏览器自动带上不该带的 Cookie。

两条路的威胁模型

Cookie(HttpOnly)

  • 用 HttpOnly 标记后,脚本读不到 Cookie——这是关键优势,XSS 攻击者拿不到。
  • 浏览器会自动带上 Cookie——这又是风险来源:如果目标接口没有防护,攻击者可以诱导用户浏览器发请求,形成 CSRF。
  • 缓解 CSRF:SameSite 属性 + 校验来源(Origin/Referer)+ 自定义请求头。

Authorization Header(LocalStorage / 内存)

  • Token 由前端显式读取并放到 Header 里——脚本能读到,XSS 一旦得手,Token 直接泄露。
  • 但请求不是浏览器自动携带的,天然规避了 CSRF 的自动携带问题。
  • 适合 API 调用和移动端(移动端没有 Cookie 概念,通常直接带 Header)。

一张表说清楚

维度HttpOnly CookieAuthorization Header
防 XSS 窃取强(脚本读不到)弱(依赖脚本隔离)
CSRF 风险有(需 SameSite + 校验)基本无
适用端浏览器API、移动端、纯前后端分离
额外注意SameSite、Domain、Secure别用 localStorage 存长期 Refresh Token

我的选择

  • 浏览器端:优先 HttpOnly Cookie。让脚本读不到 Token,把 XSS 风险挡在门外;CSRF 用 SameSite=Lax/Strict + 校验来源处理。
  • 移动端 / 纯 API:用 Authorization Header,重点防 XSS 和本地存储泄露——不要把 Refresh Token 长期放在 localStorage,尽可能放内存或安全存储。

没有绝对安全

关键不是「选哪个」,而是理解你的威胁模型:

  • 如果你的系统 XSS 漏洞多,Cookie + HttpOnly 更稳。
  • 如果你的系统全是 API / 移动端,Header 更自然。
  • 无论哪种,都配合短有效期、可撤销的 Token 体系兜底。

到这里,Token 怎么设计、怎么存,已经完整了。下一章进入会话管理:登录态怎么续期、怎么撤销、多设备怎么处理。

发现内容有问题?

告诉我们哪里需要改进。