cookie和webStorage存储比较

233 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

浏览器的缓存机制提供了可以将用户数据存储在客户端的方式,可以利用 cookie 和 session 等跟服务端进行数据交互。

cookie 和 session

cookie 和 session 都是浏览器用来跟踪浏览器用户身份的会话方式。

两者之间的机制

  • cookie 机制:若不在浏览器中设置过期时间,cookie 就存在内存中,生命周期随浏览器关闭而结束;如果设置了过期时间,cookie 则存在硬盘中,关闭浏览器仍然存在,直到过期消失;
  • session 机制:当服务器收到请求需要创建 session 对象时,首先会检查客户端请求中是否包含 sessionid。如果有 sessionid,服务器将根据该 id 返回对应 session 对象。如果客户端请求中没有 sessionid,服务器会创建新的 session 对象,并把 sessionid 在本次响应中返回给客户端。通常使用 cookie 方式存储 sessionid 到客户端,在交互中浏览器按照规则将 sessionid 发送给服务器。

两者之间的区别

  • cookie 保存在浏览器端,session 保存在服务器端
  • cookie 只能以文本方式保存字符串类型,session 能支持任何类型的对象
  • 单个 cookie 存储数据不能超过 4kb,session 大小无限制
  • session 的安全性要高于 cookie,sessionID 存储在 cookie 中,要攻破 session 需先攻破 cookie

两者应用场景

  1. cookie:用于保存用户的浏览行为信息,变量值保存在客户端,不区分客户
  • 判断用户是否登陆过网站,以便下次登录时能够实现自动登录(或者记住密码);
  • 保存上次登录时间等信息;
  • 保存上次查看的页面;
  • 浏览计数
  1. session:用于保存每个用户的专用信息,变量值保存在服务器端,通过 sessionID 区分客户(登录后)
  • 保存用户登录信息;
  • 防止用户非法登录;
  • 网上商城的购物车;

两者缺点

  1. cookie:
  • 大小受限,单条 4k 以内;
  • 用户可以禁用 cookie,使得功能受限;
  • 安全性低;
  • 每次访问都要传送 cookie 到服务器端,浪费带宽;
  1. session:
  • session 保存的东西越多,就越占用服务器内存,对于用户在线人数较多的网站,服务器的内存压力会比较大。
  • 依赖于 cookie(sessionID 保存在 cookie),如果禁用 cookie,则要使用 URL 重写,不安全
  • 创建 session 变量有很大的随意性,可随时调用,不需要开发者做精确地处理,所以,过度使用 session 变量将会导致代码不可读而且不好维护。

localStorage 和 sessionStorage

由于 cookie 存储的一些缺点(存储数据小、浪费带宽、操作要求高),为了克服 cookie 的一些限制,所以 H5 提出了改良后的 webStorage 存储机制(即 localStorage、sessionStorage)

两者机制

  1. sessionStorage:数据存储在本地的临时会话存储机制
  2. localStorage:数据存储在本地的长期存储机制

两者特性

  • localStorage 生命周期是永久的,关闭页面或浏览器之后 localStorage 中的数据不会消失。除非主动删除,否则数据永久存在;sessionStorage 生命周期仅在当前会话有效。
  • localStorage 和 sessionStorage 的存储数据大小一般都为 5MB;
  • localStorage 和 sessionStorage 都存储在客户端,不与服务器端通信;
  • localStorage 和 sessionStorage 都只能存储字符串类型,复杂对象的存储需要用到 JSON 的方法(stringify 和 parse)

两者的应用场景

  • sessionStorage:用于敏感账号的一次性登录;
  • localStorage:用于长期登录(判断用户是否已经登录)

webStorage 优点

  • 存储空间更大:cookie 为 4kb,webStorage 为 5MB;
  • 节省网络流量:webStorage 存储数据不会像 cookie 传送到服务器。
  • 快速显示:本地获取数据会比服务器获取数据速度快得多;
  • 安全性高:不用像 cookie 担心被截获的问题,但仍存在伪造的可能;
  • 对数据操作方便:webStorage 提供了封装好的数据操作方法

webStorage 操作方法

  • setItem (key, value) —— 保存数据,以键值对的方式储存信息。
  • getItem (key) —— 获取数据,将键值传入,即可获取到对应的 value 值。
  • removeItem (key) —— 删除单个数据,根据键值移除对应的信息。
  • clear () —— 删除所有的数据
  • key (index) —— 获取某个索引的 key

webStorage 数据共享

数据共享问题 不同浏览器无法共享 localStorage 和 sessionStorage 存储的数据。

相同浏览器的不同页面可以共享相同的 localStorage(要相同域名和端口);

不同页面和标签页无法共享 sessionStorage 信息,注意这里的页面和标签页指的是顶级窗口,如果一个标签页包含多个 iframe,那他们属于同源页面,可以共享 sessionStorage 信息