Cookie、sessionStorage、localStorage 这三个东西,日常开发里几乎天天见:登录态、埋点、用户偏好、临时缓存……

它们的区别不只是“大小不一样”,更关键的是:生命周期、是否随请求携带、以及安全边界。选错了要么拖慢请求,要么埋下安全坑。

1. 容量限制与数据格式

存储方式容量限制数据格式
Cookie4KB只能存储字符串
sessionStorage约 5MB只能存储字符串(可转换为 JSON)
localStorage约 5MB只能存储字符串(可转换为 JSON)

补一句:虽然 sessionStorage/localStorage 只能存字符串,但可以用 JSON.stringify() 存对象,取出时 JSON.parse() 还原。

1
2
3
4
const user = { name: "张三", age: 25 };
localStorage.setItem("user", JSON.stringify(user));
const storedUser = JSON.parse(localStorage.getItem("user"));
console.log(storedUser.name); // 张三

2. 生命周期

存储方式生命周期
Cookie可设置过期时间(会话级或持久化)
sessionStorage仅在当前标签页(session)有效,关闭页面即清除
localStorage永久存储,除非手动删除或用户清理缓存

很多人会误以为 sessionStorage 是“关闭浏览器就清”,更准确的说法是:它跟着 tab 走,关掉那个标签页就清,其他标签页互不影响。


3. 数据传输与请求影响

存储方式是否随 HTTP 请求发送
Cookie是(默认随每个请求发送)
sessionStorage否(存储仅限于前端)
localStorage否(存储仅限于前端)

性能影响: 由于 Cookie 会在每次请求时被自动携带,过多的 Cookie 可能会影响页面加载速度。因此,在存储不需要与服务器交互的数据时,推荐使用 sessionStoragelocalStorage


4. 安全性对比

存储方式XSS 攻击风险CSRF 攻击风险
Cookie高(可用 HttpOnly 降风险)高(请求自动携带)
sessionStorage高(JS 可访问)低(不会随请求发送)
localStorage高(JS 可访问)低(不会随请求发送)

安全性建议:

  1. Cookie: 使用 HttpOnly 防止 JavaScript 访问,使用 Secure 仅允许 HTTPS 传输。
  2. localStorage & sessionStorage: 防范 XSS 攻击,避免直接存储敏感信息,如 JWT Token 建议存放在 HttpOnly Cookie

5. 适用场景

场景推荐使用的存储方式
用户登录状态(长时间保持)Cookie(带 HttpOnly)
短期数据存储(如表单未提交内容)sessionStorage
持久化用户偏好设置localStorage
避免请求时携带额外数据sessionStorage/localStorage

6. 实战里怎么选?

最常见的争议点是“Token 放哪”。我的原则很简单:

  1. 能用 HttpOnly Cookie 就优先用(JS 读不到,XSS 风险小很多)
  2. 必须前端可读的东西(比如一些非敏感缓存),再考虑 sessionStorage/localStorage
  3. 别把敏感信息当成“方便调试”随手塞 localStorage,后面安全测试一定会找上门

7. 总结

关键点CookiesessionStoragelocalStorage
存储大小4KB约 5MB约 5MB
生命周期可持久化仅限当前会话永久存储
是否随请求发送
XSS 安全风险高(可用 HttpOnly 保护)
CSRF 安全风险高(自动携带)
适用场景服务器通信、认证短期存储持久化存储

8. 一个我踩过的坑

有一次做后台系统,为了省事把 JWT Token 放在了 localStorage。后来安全同学做 XSS 演练时,直接把 Token 拿走并复用,整套会话就被劫持了。

最后的修复方案其实不复杂:把认证信息挪到 HttpOnly Cookie,再把 XSS 防护当成常规质量去做(CSP、输入输出转义、依赖治理)。那次之后我对“存储位置”这件事就特别谨慎了。