快速理清localstorage、sessionstorage、cookie的区别

37 阅读5分钟

localStorage、sessionStorage、Cookie 的区别与共同点

localStorage、sessionStorage、Cookie 都是前端浏览器提供的本地存储方案,用于在客户端保存少量数据,但在存储容量、生命周期、作用域等方面存在显著差异,同时也具备核心共性。

一、核心共同点

  1. 存储位置一致:均存储在客户端浏览器中,无需占用服务器资源,属于本地缓存方案;
  2. 存储格式限制:仅支持字符串格式存储(复杂对象需通过 JSON.stringify() 序列化,读取时用 JSON.parse() 反序列化);
  3. 同源策略限制:遵循浏览器同源策略(协议、域名、端口三者一致),不同源的页面无法互相访问彼此存储的数据;
  4. 核心用途相似:均可用于保存非敏感的本地数据(如用户偏好设置、页面状态缓存、临时表单数据等),减少不必要的接口请求。

二、核心区别(关键差异对比)

对比维度localStoragesessionStorageCookie
存储容量约 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。

四、选型建议

  1. 长期保存、跨标签页共享数据:选 localStorage(如用户偏好设置);
  2. 临时保存、仅当前标签页使用数据:选 sessionStorage(如表单临时数据);
  3. 前后端数据交互(如传递登录凭证)、少量数据短期缓存:选 Cookie(如记住登录状态);
  4. 存储数据超过 4KB:优先选 localStorage/sessionStorage(Cookie 容量不足);
  5. 敏感数据:三者均不适合,建议通过后端存储,前端仅存储加密后的令牌(如 JWT)。

五、总结

  1. 共同点:客户端存储、字符串格式、同源限制、用于缓存非敏感数据;

  2. 核心差异

    • 生命周期:localStorage(永久)> Cookie(可配置)> sessionStorage(会话级);
    • 存储容量:localStorage = sessionStorage(5MB)> Cookie(4KB);
    • 服务器交互:仅 Cookie 自动携带,其余两者仅客户端可用;
    • 页面共享:localStorage/Cookie 跨标签页共享,sessionStorage 标签页独享;
  3. 选型核心:根据「数据生命周期」「是否跨标签共享」「是否需要与服务器交互」三大维度判断。