Cookies
、SessionStorage
和 LocalStorage
都是浏览器提供的客户端存储机制,用于在用户的本地存储数据。它们的主要区别体现在数据生命周期、作用域、存储容量、与服务器的交互方式以及用途上。下面是它们的详细对比:
特性 | Cookies | LocalStorage | SessionStorage |
---|---|---|---|
生命周期 | 可设置过期时间:若不设置过期时间(Expires 或 Max-Age ),则是会话级(浏览器关闭即清除);设置了则到期才清除。可以手动删除。 | 永久存储:数据永久存储在浏览器中,除非用户手动清除(删除浏览器数据),或通过 JavaScript 删除。 | 会话级存储:数据仅在当前浏览器标签页/窗口打开期间有效。关闭标签页/窗口即清除。刷新页面不会清除。 |
作用域 | 同源 + 路径限制:可设置 Domain 和 Path 来控制哪些域名和路径下的页面可以访问该 Cookie。默认是当前域名及其子域名下的当前路径。 | 同源策略:同一协议、域名、端口下的页面均可访问。 | 同源策略 + 标签页/窗口隔离:同一协议、域名、端口下的页面,且必须在同一个标签页/窗口中才能访问。不同标签页/窗口(即使是同一页面)的 SessionStorage 互不影响。 |
存储容量 | 很小:通常每个域名下限制为 ~4KB。 | 较大:通常为 5MB ~ 10MB(不同浏览器可能有差异)。 | 较大:通常为 5MB ~ 10MB(不同浏览器可能有差异)。 |
与服务器交互 | 自动携带:每次 HTTP 请求(HTML、图片、JS、CSS、API 等)都会自动附带在请求头(Cookie 头)中发送到对应的服务器。这会影响带宽(尤其是小文件请求)。 | 纯客户端:数据不会自动发送给服务器。仅在客户端 JavaScript 中读写。 | 纯客户端:数据不会自动发送给服务器。仅在客户端 JavaScript 中读写。 |
数据类型 | 字符串键值对:只能存储字符串。复杂对象需序列化(如 JSON.stringify )。 | 字符串键值对:只能存储字符串。复杂对象需序列化。 | 字符串键值对:只能存储字符串。复杂对象需序列化。 |
API 易用性 | 操作相对复杂,需通过 document.cookie 字符串操作(原生API不友好,常用库封装)。 | 简单易用:提供 setItem(key, value) , getItem(key) , removeItem(key) , clear() 等直观方法。 | 简单易用:与 LocalStorage API 完全相同(setItem , getItem , removeItem , clear )。 |
事件监听 | ❌ 不支持原生事件监听。 | ⭕ 支持 storage 事件:监听同源下其他标签页的 LocalStorage 变化。 | ⭕ 支持 storage 事件:监听同源下同一标签页内不同 iframe 的 SessionStorage 变化(不同标签页间不共享)。 |
主要用途 | 1. 会话状态管理(如登录 Token、Session ID) 2. 个性化设置(如主题偏好、语言设置) 3. 用户行为跟踪(广告、分析) (因其自动发送到服务器) | 1. 长期本地数据(如离线数据缓存、用户偏好设置、购物车数据(非结算关键)) 2. 需要持久化且不敏感的数据 | 1. 临时会话数据(如单页应用的页面状态、表单填写中途暂存、当前工作区数据) 2. 只在一个标签页内需要的数据 |
关键区别总结:
-
生命周期 & 作用域:
- Cookies:可设置过期时间,作用域受域名/路径限制。
- LocalStorage:永久存储,同源页面共享。
- SessionStorage:标签页级存储,标签页关闭清除,同源页面仅在同一个标签页/窗口内共享。
-
服务器交互:
- Cookies:每次请求自动发送到服务器(有安全/带宽考量)。
- LocalStorage/SessionStorage:数据只存在客户端,不自动发送(性能更优)。
-
存储容量:
- Cookies:非常小(~4KB)。
- LocalStorage/SessionStorage:大得多(~5-10MB)。
-
API & 易用性:
- Cookies:原生 API 操作繁琐。
- LocalStorage/SessionStorage:提供简单易用的键值对 API。
如何选择?
- 需要服务器知道的信息(如身份认证令牌)? → Cookies (通常设置
HttpOnly
,Secure
增强安全)。 - 需要在用户下次访问时保留的较大本地数据(如用户主题、本地缓存)? → LocalStorage。
- 仅在当前标签页会话期间需要的临时数据(如未提交的表单数据、页面跳转状态)? → SessionStorage。
- 需要跨标签页同步数据? → LocalStorage (配合
storage
事件) 或 BroadcastChannelAPI / 状态管理库。 - 存储少量且每次请求需发送的信息? → Cookies (但需注意性能和大小限制)。
安全提示:
- 避免在
Cookies
、LocalStorage
或SessionStorage
中存储敏感信息(如密码、信用卡号)。即使设置了HttpOnly
Cookies 也不是绝对安全。 - 对存储在
LocalStorage
/SessionStorage
中的数据,如果来源不可信,使用前需进行校验和清理,以防 XSS 攻击读取或篡改。