cookie,loacalStorage,sessionStorage

132 阅读4分钟

一、基础定义与核心特性

存储类型生命周期存储容量数据类型是否自动发送到服务器API 操作
cookie可自定义(默认随浏览器关闭失效)4KB/域字符串是(每次请求都会携带)document.cookie
localStorage永久存储(需手动清除)5-10MB/域字符串localStorage.setItem()
sessionStorage浏览器会话结束后失效5-10MB/域字符串sessionStorage.getItem()

二、核心区别深度解析

1. 生命周期对比
  • cookie

    • 可通过 expiresmax-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(); // 清空所有数据
      

三、问题

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 中 HttpOnlySecure 字段的作用?
 - **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 的典型场景
  • 临时表单数据:多步骤表单的中间状态(如注册流程);
  • 标签页会话:当前标签页的临时数据(如直播弹幕列表);
  • 历史记录:记录当前会话的浏览历史(关闭标签页后清空)。

五、安全与性能优化

  1. 安全注意事项

    • cookie
      • 敏感数据需加密存储;
      • 启用 HttpOnlySecure 标志;
      • 避免使用 SameSite=Default(存在 CSRF 风险)。
    • localStorage
      • 不存储敏感信息(可被 JavaScript 读取);
      • 大型数据分片存储(避免超出容量限制)。
  2. 性能优化

    • 减少 cookie 大小:仅存储必要信息,避免冗余数据;
    • localStorage 缓存策略:设置版本号,按需更新缓存;
    • 避免频繁操作:批量更新 localStorage(如先修改对象再一次性存储)。