| 特性 | Cookie | localStorage | sessionStorage | IndexedDB |
|---|---|---|---|---|
| 容量限制 | 极小 (4KB) | 大 (~5MB) | 大 (~5MB) | 极大 (>50MB) |
| 生命周期 | 可设置过期时间,不设则为会话级 | 永久有效 (除非手动清除) | 会话级 (Tab 关闭即销毁) | 永久有效 |
| 服务器通信 | 每次 HTTP 请求自动携带 | 不参与通信 | 不参与通信 | 不参与通信 |
| 访问权限 | 同源 | 同源 | 同源 | 同源 |
| 安全性 | 可设 HttpOnly 防 XSS | 易受 XSS | 易受 XSS | 同源策略保护 |
| API 易用性 | 难用 (需正则封装) | 简单 (setItem/getItem) | 简单 (setItem/getItem) | 复杂 (异步事务) |
最古老的机制,设计初衷是维持 HTTP 状态 (Session ID) 而非存储数据。
关键属性 (面试题):
HttpOnly: 禁止 JavaScript 访问 (document.cookie),防止 XSS 攻击窃取 Token。Secure: 仅在 HTTPS 传输。SameSite: 防止 CSRF 攻击 (Strict, Lax, None)。
Strict: 禁止第三方请求携带。Lax (默认): 允许安全的顶级导航 (如链接跳转) 携带。缺陷:
适合场景:长期保存的非敏感数据。
注意:
适合场景:单次会话的临时数据。
面试题:新开标签页 sessionStorage 会共享吗?
window.open 或 <a target="_blank"> 打开的新标签页,在某些浏览器 (如 Chrome) 会复制旧页面的 sessionStorage,但之后互不影响。浏览器内置的非关系型数据库 (NoSQL)。
特点:
ArrayBuffer, Blob (图片/文件)。场景:
这是一个经典的面试争论题。
方案 A (localStorage):
Authorization: Bearer ...)。localStorage.getItem 就偷走了)。需配合严谨的 XSS 防御。方案 B (HttpOnly Cookie):
原生不支持。封装时存入 { value, expire: Date.now() + 1000 }。读取时判断 Date.now() > expire,如果超时则 removeItem 并返回 null。