浏览器的本地存储主要分为Cookie和WebStorage和IndexDB,而WebStorage又可以分为LocalStorage和sessionStorage
# Cookie
Cookie最开始的时候不是用来做本地存储的,而是为弥补HTTP在状态管理上的不足
HTTP协议是一个无状态协议,客户端向服务端发送请求,服务器返回响应,但是如何让服务端记住下次发送请求时客户端是谁?那么久产生了Cookie
Cookie本质上是浏览器内部存储的一个很小的文本文件,内部是以键值对的方式在存储.在同一个域名发送请求时,都会携带相同的cookie,服务器进行解析,就可以拿到客户端的状态了
那么Cookie的作用就是用来做浏览器的状态存储的,所以有一些缺陷
- 容量缺陷:Cookie的体积上限只有4KB,只能用来存储少量的信息
- 性能缺陷:Cookie紧跟域名,所以不管地址需要不需要都会携带Cookie,这样随着请求量增多时,就会造成巨大的性能浪费,因为有很多不必要的内容
- 安全缺陷:由于Cookie是以纯文本的形式在浏览器和服务器之间传递,很容易被截取,然后在Cookie的有效期内重新发送个服务器,另外,在
HttpOnly为 false 的情况下,Cookie 信息能直接通过 JS 脚本来读取。可以用cookie 字段带上HttpOnly,那么说明只能通过 HTTP 协议传输,不能通过 JS 访问,这也是预防 XSS 攻击的重要手段。
# localStorage
相同点:针对一个域名,就是在同一个域名下,会存储相同一段的localstorage
区别
- 容量:localstorage的容量5M,持久存储
- 只存在客户端,默认不参与与服务端通信,这样就很好地避免了 Cookie 带来的性能问题和安全问题。
- 接口封装。通过
localStorage暴露在全局,并通过它的setItem和getItem等方法进行操作,非常方便。
localStorage的使用
let obj = { name: "sanyuan", age: 18 };localStorage.setItem("name", "sanyuan");localStorage.setItem("info", JSON.stringify(obj));//接着进入相同的域名时就能拿到相应的值:let name = localStorage.getItem("name");let info = JSON.parse(localStorage.getItem("info"));//从这里可以看出,localStorage其实存储的都是字符串,如果是存储对象需要调用JSON的stringify方法,并且用JSON.parse来解析成对象。
# sessionStorage
sessionStorage以下方面和localStorage一致:
- 容量。容量上限也为 5M。
- 只存在客户端,默认不参与与服务端的通信。
- 接口封装。除了
sessionStorage名字有所变化,存储方式、操作方式均和localStorage一样。
但sessionStorage和localStorage有一个本质的区别,那就是前者只是会话级别的存储,并不是持久化存储。会话结束,也就是页面关闭,这部分sessionStorage就不复存在了。
