一、基础定义与核心特性
| 存储类型 | 生命周期 | 存储容量 | 数据类型 | 是否自动发送到服务器 | API 操作 |
|---|---|---|---|---|---|
| cookie | 可自定义(默认随浏览器关闭失效) | 4KB/域 | 字符串 | 是(每次请求都会携带) | document.cookie |
| localStorage | 永久存储(需手动清除) | 5-10MB/域 | 字符串 | 否 | localStorage.setItem() |
| sessionStorage | 浏览器会话结束后失效 | 5-10MB/域 | 字符串 | 否 | sessionStorage.getItem() |
二、核心区别深度解析
1. 生命周期对比
-
cookie:
- 可通过
expires或max-age设置过期时间(如expires=Thu, 01 Jan 2024 00:00:00 GMT)。 - 若不设置,关闭浏览器后失效(会话级 cookie)。
- 可通过
-
localStorage:
- 数据永久保留,除非用户手动清除(如浏览器缓存清理)或代码删除。
- 常用于长期存储用户偏好(如主题设置)。
-
sessionStorage:
- 仅在当前浏览器会话有效(关闭标签页/窗口后数据丢失)。
- 适用于临时会话数据(如多表单分步填写的中间状态)。
2. 存储与传输机制
-
cookie:
- 数据随 HTTP 请求自动发送到服务器(如身份验证的 token)。
- 缺点:4KB 容量限制,频繁传输浪费带宽。
-
localStorage/sessionStorage:
- 数据存储在浏览器本地,不参与 HTTP 通信。
- 优势:容量大(5-10MB),适合存储非敏感的前端数据(如购物车)。
3. 数据操作与类型
-
共同限制:
- 仅支持字符串存储,对象需通过
JSON.stringify()转换:// 存储对象示例 const user = { name: 'Alice', age: 30 }; localStorage.setItem('user', JSON.stringify(user)); // 读取对象 const parsedUser = JSON.parse(localStorage.getItem('user'));
- 仅支持字符串存储,对象需通过
-
API 差异:
- cookie 的 API 复杂(需手动处理字符串拼接):
// 设置 cookie document.cookie = 'token=abc123; expires=...; path=/'; // 读取 cookie const cookies = document.cookie.split('; ').reduce((obj, cookie) => { const [key, value] = cookie.split('='); obj[key] = value; return obj; }, {}); - localStorage/sessionStorage 的 API 简洁:
localStorage.setItem('key', 'value'); const value = localStorage.getItem('key'); localStorage.removeItem('key'); localStorage.clear(); // 清空所有数据
- cookie 的 API 复杂(需手动处理字符串拼接):
三、问题
1. 问:cookie 和 localStorage 的主要区别?
- **生命周期**:cookie 可设置过期时间,localStorage 永久存储;
- **传输方式**:cookie 随请求自动发送,localStorage 仅本地访问;
- **容量限制**:cookie 4KB,localStorage 5-10MB;
- **应用场景**:cookie 用于身份验证,localStorage 用于前端数据缓存。
2. 问:sessionStorage 在跨标签页时能共享数据吗?
- **不能**。sessionStorage 仅在当前浏览器会话的同一标签页/窗口中有效。
- 若需跨标签页共享数据,可使用 localStorage 并结合 `storage` 事件监听:
```javascript
// 监听 localStorage 变化
window.addEventListener('storage', (event) => {
if (event.key === 'sharedData') {
// 更新当前页面数据
}
});
```
3. 问:cookie 中 HttpOnly 和 Secure 字段的作用?
- **HttpOnly**:禁止 JavaScript 访问 cookie(防止 XSS 攻击);
- **Secure**:仅在 HTTPS 协议下发送 cookie(防止中间人攻击);
- 安全设置示例:
```javascript
document.cookie = 'token=abc123; HttpOnly; Secure; SameSite=Strict';
```
4. 问:如何实现 localStorage 的跨域共享?
- 原生 localStorage 不支持跨域共享(受同源策略限制)。
- 解决方案:
1. 通过后端 API 中转数据;
2. 使用跨域资源共享(CORS)配合后端存储;
3. 第三方方案(如 localStorage-shared-worker,但兼容性差)。
四、应用场景与最佳实践
1. cookie 的典型场景
- 身份验证:存储 JWT token(配合 HttpOnly 增强安全性);
- 用户偏好:存储语言设置、主题模式(需后端配合);
- 购物车:小型购物车(大型购物车推荐 localStorage)。
2. localStorage 的典型场景
- 前端缓存:缓存 API 数据(如商品列表),减少请求频率;
- 用户设置:保存主题、布局等长期偏好;
- 离线应用:配合 Service Worker 实现 PWA 离线功能。
3. sessionStorage 的典型场景
- 临时表单数据:多步骤表单的中间状态(如注册流程);
- 标签页会话:当前标签页的临时数据(如直播弹幕列表);
- 历史记录:记录当前会话的浏览历史(关闭标签页后清空)。
五、安全与性能优化
-
安全注意事项
- cookie:
- 敏感数据需加密存储;
- 启用
HttpOnly和Secure标志; - 避免使用
SameSite=Default(存在 CSRF 风险)。
- localStorage:
- 不存储敏感信息(可被 JavaScript 读取);
- 大型数据分片存储(避免超出容量限制)。
- cookie:
-
性能优化
- 减少 cookie 大小:仅存储必要信息,避免冗余数据;
- localStorage 缓存策略:设置版本号,按需更新缓存;
- 避免频繁操作:批量更新 localStorage(如先修改对象再一次性存储)。