一文彻底搞懂cookie、localStorage和sessionStorage

391 阅读4分钟

Cookie

Cookie指某些网站为了辨别用户身份而储存在用户本地终端上的数据(通常经过加密)。 cookie是服务端生成,客户端进行维护和存储并且作为客户端与服务器交互的通道,保持客户端状态。通过cookie,可以让服务器知道请求是来源哪个客户端,就可以进行客户端状态的维护,比如登陆后刷新,请求头就会携带登陆时response header中的set-cookie,Web服务器接到请求时也能读出cookie的值,根据cookie值的内容就可以判断和恢复一些用户的信息状态。注意,每次发送请求都会自动携带对应域名的cookie

使用场景

  1. 记录登陆的账号和密码。
  2. 购物车功能。
  3. 记录用户浏览数据,进行商品(广告)推荐。

Cookie属性

image.png

属性作用
Namecookie的名字,Cookie一旦创建,名称便不可更改(加密)
ValueName所对应的cookie的值(加密)
Domain可以访问该Cookie的域名。例如document.cookie='domain=.baidu.com',则所有以“baidu.com”结尾的域名都可以访问该Cookie
Path该Cookie的使用路径。path=/,说明本域名下contextPath都可以访问该Cookie。path=/app/,则只有contextPath为“/app”的程序可以访问该Cookie
ExpiresCookie过期时间
HttpOnly不允许使用脚本更改、获取整个cookie,防止跨域脚本 (XSS) 攻击
Secure只有使用Https协议时才会携带此cookie
Same-site规定浏览器不能在跨域请求中携带Cookie,减少CSRE攻击

Cookie的原理

image.png

第一次访问网站的时候,浏览器发出请求,服务器响应请求后,会在响应头里面添加一个Set-Cookie选项,将cookie放入到响应请求中,在浏览器第二次发请求的时候,会通过Cookie请求头部将Cookie信息发送给服务器,服务端会辨别用户身份,另外,Cookie的过期时间、域、路径、有效期、适用站点都可以根据需要来指定。

Cookie的生成方式

  • 方式一:在 http的响应头中设置set-cookie
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2018 07:28:00 GMT Secure ;

默认情况下,domain被设置为Cookie页面当前访问地址中的主机部分,我们也可以手动设置 domain 的值,如document.cookie='domain=.a.com',那么他的子域名a.a.com或b.a.com都可以访问的此cookie

  • 生成方式二:利用js可以通过document.cookie可以读写cookie,以键值对的形式展示
document.cookie="userName=hello"

Cookie缺点

  • 容量问题:Cookie的大小限制在4KB左右,对于复杂的存储需求来说是不够用的。
  • 性能问题:Cookie 是紧跟域名的。同一个域名下的所有请求,都会携带 Cookie。请求一张图片或者一个 CSS 文件不需要 Cookie 里存储的信息,带来了巨大的开销。
  • 安全问题:在客户端可以通过一定的手段(脚本、devtools,本地存储的文件)获取到,存在XSS,CSRF等安全问题。

解决安全问题的策略

  • 设置HttpOnly属性,浏览器不允许脚本操作document.cookie, 所以为避免跨域脚本 (XSS) 攻击,Js的 Document.cookie API无法访问带有 HttpOnly 标记的Cookie,它们只应该发送给服务端。
  • 添加Secure属性,这样的Cookie只应通过被HTTPS协议加密过的请求发送给服务端。

Local Storage

特点

  • 持久化的本地保存,永不过期,除非手动删除
  • 大小为5M左右
  • 仅在客户端使用,不和服务端进行通信
  • 接口封装较好 基于上面的特点,LocalStorage可以作为浏览器本地缓存方案,用来提升网页首屏渲染速度(根据第一请求返回时,将一些不变信息直接存储在本地)。

API

window.localStorage.setItem()
window.loaclStorage.getItem()

使用场景

考虑到 LocalStorage 的特点之一是持久,有时我们更倾向于用它来存储一些内容稳定的资源。比如图片内容丰富的电商网站会用它来存储 Base64 格式的图片字符串,如网站logo

作用域

Local Storage遵守同源策略,只要在相同的协议、相同的主机名、相同的端口下,就能读取/修改到同一份localStorage数据。

Session Storage

特点

  • 会话级别的浏览器存储
  • 大小为5M左右
  • 仅在客户端使用,不和服务端进行通信
  • 接口封装较好

API

window.sessionStorage.setItem()
window.sessionStorage.getItem()

使用场景

sessionStorage 更适合用来存储生命周期和它同步的会话级别的信息。这些信息只适用于当前会话,当你开启新的会话时,它也需要相应的更新或释放。比如微博的 sessionStorage就主要是存储你本次会话的浏览足迹:

image.png

作用域

Session Storage遵守同源策略,但是比localStorage更严苛一点,除了协议、主机名、端口外,还要求在同一窗口(也就是浏览器的标签页)下。

image.png

LocalStorage和Session缺点:

  • 都只能存储为字符串
  • 只能存储少量简单的数据

总结:

Cookie是客户端机制,session是服务器端机制

参考连接

juejin.cn/post/684490…

juejin.cn/post/684490…