localStorage、sessionStorage、Cookie 的区别与共同点
localStorage、sessionStorage、Cookie 都是前端浏览器提供的本地存储方案,用于在客户端保存少量数据,但在存储容量、生命周期、作用域等方面存在显著差异,同时也具备核心共性。
一、核心共同点
- 存储位置一致:均存储在客户端浏览器中,无需占用服务器资源,属于本地缓存方案;
- 存储格式限制:仅支持字符串格式存储(复杂对象需通过
JSON.stringify()序列化,读取时用JSON.parse()反序列化); - 同源策略限制:遵循浏览器同源策略(协议、域名、端口三者一致),不同源的页面无法互相访问彼此存储的数据;
- 核心用途相似:均可用于保存非敏感的本地数据(如用户偏好设置、页面状态缓存、临时表单数据等),减少不必要的接口请求。
二、核心区别(关键差异对比)
| 对比维度 | localStorage | sessionStorage | Cookie |
|---|---|---|---|
| 存储容量 | 约 5MB(不同浏览器略有差异) | 约 5MB(不同浏览器略有差异) | 较小,约 4KB(单条 Cookie 限制,总数量也有限) |
| 生命周期 | 永久存储(持久化),除非手动通过代码 / 浏览器设置删除,否则一直保存在本地 | 会话级存储,仅在当前浏览器标签页打开期间有效(标签页关闭 / 浏览器退出后自动删除,刷新标签页保留) | 可配置:1. 会话 Cookie(默认,浏览器关闭后删除);2. 持久 Cookie(设置 expires/max-age,到期后删除) |
| 作用域(页面共享) | 同源下的所有标签页 / 窗口共享(如打开同一网站的多个标签页,可互相访问 localStorage 数据) | 仅当前标签页独享(其他标签页即使是同源网站,也无法访问当前标签页的 sessionStorage 数据) | 同源下的所有标签页 / 窗口共享,且可通过 domain 配置共享子域名数据(如 a.xxx.com 和 b.xxx.com 共享) |
| 与服务器交互 | 不随 HTTP 请求自动携带,仅在客户端本地读取和修改,不消耗网络带宽 | 不随 HTTP 请求自动携带,仅在客户端本地读取和修改,不消耗网络带宽 | 会随每次同源 HTTP 请求自动携带(包括 GET/POST 等),发送到服务器端,消耗少量网络带宽 |
| 操作便捷性 | API 简洁易用(setItem()/getItem()/removeItem()/clear()) | API 与 localStorage 完全一致,操作便捷 | API 较繁琐,需手动封装方法操作(如 document.cookie 直接操作是字符串拼接格式) |
| 数据过期策略 | 无内置过期时间,需手动实现过期逻辑(如存储时记录过期时间,读取时判断是否失效) | 无内置过期时间,标签页关闭即失效,无需手动处理过期 | 内置过期配置(expires 设具体日期,max-age 设秒数),到期自动删除 |
| 适用场景 | 长期保存非敏感数据(用户主题设置、历史浏览记录、登录状态持久化(非核心信息)) | 临时保存会话数据(页面表单临时缓存、标签页内的状态保持、临时登录凭证) | 少量数据传递(客户端→服务器)、会话保持(如后端基于 Cookie 实现登录态)、短期缓存(如记住登录状态 1 天) |
三、详细解读(关键特性补充)
1. localStorage:永久本地存储
-
核心特性:数据持久化,即使关闭浏览器、重启电脑,数据依然存在,只有手动删除才会消失;
-
注意事项:存储的数据不加密,敏感信息(如密码、身份证号)不可存储;需手动处理过期逻辑,例如:
javascript
运行
// 存储时记录过期时间(1小时后过期) localStorage.setItem('user', JSON.stringify({ name: '张三', expireTime: Date.now() + 3600 * 1000 })); // 读取时判断是否过期 const userStr = localStorage.getItem('user'); if (userStr) { const user = JSON.parse(userStr); if (Date.now() > user.expireTime) { localStorage.removeItem('user'); // 过期则删除 console.log('数据已过期'); } else { console.log('用户信息:', user); } }
2. sessionStorage:会话级临时存储
- 核心特性:数据与当前标签页绑定,标签页关闭即销毁,不同标签页互不干扰;
- 典型场景:多标签页登录隔离(如同一网站,一个标签页登录账号 A,另一个标签页登录账号 B,互不影响)、表单提交前的临时缓存(防止页面刷新丢失输入内容)。
3. Cookie:客户端与服务器交互的桥梁
- 核心特性:自动随请求携带,是前后端数据交互的重要载体(如后端通过 Set-Cookie 响应头设置 Cookie,前端后续请求自动携带该 Cookie,实现登录态保持);
- 注意事项:因每次请求都携带,不宜存储过多数据(避免增加网络开销);可通过
HttpOnly属性设置 Cookie(仅服务器可读写,前端 JS 无法操作),防止 XSS 攻击窃取 Cookie。
四、选型建议
- 需长期保存、跨标签页共享数据:选
localStorage(如用户偏好设置); - 需临时保存、仅当前标签页使用数据:选
sessionStorage(如表单临时数据); - 需前后端数据交互(如传递登录凭证)、少量数据短期缓存:选
Cookie(如记住登录状态); - 存储数据超过 4KB:优先选
localStorage/sessionStorage(Cookie 容量不足); - 敏感数据:三者均不适合,建议通过后端存储,前端仅存储加密后的令牌(如 JWT)。
五、总结
-
共同点:客户端存储、字符串格式、同源限制、用于缓存非敏感数据;
-
核心差异:
- 生命周期:localStorage(永久)> Cookie(可配置)> sessionStorage(会话级);
- 存储容量:localStorage = sessionStorage(5MB)> Cookie(4KB);
- 服务器交互:仅 Cookie 自动携带,其余两者仅客户端可用;
- 页面共享:localStorage/Cookie 跨标签页共享,sessionStorage 标签页独享;
-
选型核心:根据「数据生命周期」「是否跨标签共享」「是否需要与服务器交互」三大维度判断。