计网基础-浏览器本地存储

loading 2022年04月18日 80次浏览

1.Cookie

1.1背景

Cookie的设计初衷是为了弥补HTTP在状态管理上的不足:HTTP是一个无状态协议,客户端向服务器发请求,服务器返回响应,但是下次发送请求时服务器无法记录客户端是谁。

1.2 概念

本质上是浏览器内存储的一个很小的文本文件,内部以键值对的方式来存储。客户端向同一个域名下发送请求,都会携带相同的Cookie,服务器收到Cookie并进行解析,便能拿到客户端的状态。

当网页要发http请求时,浏览器会先检查是否有相应的cookie,有则自动添加在request header中的cookie字段中。这些是浏览器自动帮我们做的,而且每一次http请求浏览器都会自动帮我们做。

1.3 作用与缺陷

作用:

  • 会话状态管理(用户登陆状态、购物车、游戏分数等)
  • 个性化设置(用户自定义设置、主题等)
  • 浏览器行为跟踪(跟踪分析用户行为等)

若干缺陷:

  • 容量缺陷:Cookie体积上限4KB,只能存储少量信息
  • 性能缺陷:Cookie紧跟域名,不论域名下某地址是否需要该Cookie,请求都会携带完整的Cookie。随着请求数增多,造成性能浪费。
  • 安全缺陷:由于Cookie以纯文本的形式在浏览器和服务器中传递,很容易被非法用户截获,然后进行一系列的篡改,在Cookie的有效期内重新发送给服务器。当HttpOnly为false情况下,Cookie甚至可以直接通过JS脚本获取。

1.4 属性

  • value: cookie值,如果用于保存用户登录态,应该将该值加密
  • http-only: 不能通过js访问Cookie。设置为true可以减少XSS攻击
  • secure: 表明该Cookie只能在https请求中携带,设置为true可以使得cookie不会被抓包工具窃取。
  • same-site: 规定浏览器不能在跨域请求中携带 Cookie,设置为strict(严格模式,在任何情况下都不能被第三方使用)或者lax(宽松模式,如果这个请求是个 GET 请求,并且这个请求改变了当前页面或者打开了新的页面,那么这个cookie可以作为第三方cookie)可以减少CSRF攻击。
  • expires: 通常,cookie的有效期是永久或者是一个较长的数值;如果把该属性设置为-1,那么cookie就只保存在客户端内存中,当浏览器关闭cookie即失效,也可以有效防御cookie信息被窃取。

还可以通过加密cookie;用户第一次登录时,保存ip+cookie加密后的token,每次请求,都去将当前cookie和ip组合起来加密后的token与保存的token作对比,只有完全对应才能验证成功等方法来加强cookie安全性。

2.localStroage

2.1 与Cookie异同

同:
针对一个域名,同一个域名下,会存储相同的一段localStroage

异:

  • 容量:针对每个域名容量上限为5M,相对于一个域名持久存储,远大于Cookie的4K。
  • 位置:只存在于客户端,不参与和服务端的通信,避免了Cookie的性能缺陷和安全缺陷
  • 接口:通过localStorage暴露在全局,并可以通过它的 setItem 和 getItem等方法进行操作

2.2 操作

        let obj = {
            objName: 'lebron',
            objAge: '37'
        }
        localStorage.setItem('name','curry');
        localStorage.setItem('info',JSON.stringify(obj))
        let playerName = localStorage.getItem('name')
        let playerInfo = JSON.parse(localStorage.getItem('info'))
        console.log(playerName,playerInfo)

image.png

可以看出,localStroage存储的都是字符串,如果是存储对象需要用到JSON的stringify()将对象转换为字符串,要将字符串转换为对象则通过JSON.parse()方法。

2.3 应用场景

由于localStroage的较大容量和持久特性,可以利用其存储一些内容稳定的资源,如:官网的logo,存储Base64格式的图片资源等

3. sessionStroage

3.1 和localStroage异同

同:

  • 容量上限相同,为5M
  • 只存在客户端,不参与服务端通信
  • 接口封装。除了名字要改一下,存储方式、操作方式均和localStroage相同

异:
sessionStroage只是会话级别的存储,并非持久化存储,关闭页面后,这部分sessionStroage就不存在了

3.2 应用场景

  • 对表单信息进行维护,将表单信息存储在里面,可以保证即使页面刷新也会保留之前的表单信息
  • 存储本次浏览记录。当关闭页面后不需要这些记录时,就很适合使用。

4.总结

生命周期:

  • Cookie:可设置失效时间,未设置的话,默认是关闭浏览器后失效
  • localStroage:除非被手动清除,否则永久保存
  • sessionStroage:仅在当前网页会话下有效,关闭页面后会被清除

存储容量:

  • Cookie:一个域名一般能存20个,每个容量为4KB
  • ls\ss:5MB

http请求:

  • Cookie:每次都携带在HTTP头中
  • ls/ss:仅在客户端(浏览器)中保存,不参与和服务器的通信

易用性:

  • Cookie:原生接口不友好,需要程序员自己封装
  • ls/ss:原生接口也可接受

总之,Cookie浪费带宽,而且不能跨域,除了识别用户登录以外,能不用就不用。其它情况下,能用stroage就用stroage。localStroage可以跨页面传参;sessionStroage用来保存一些临时数据,防止用户刷新页面后丢失参数。