浏览器数据存储方式
2020年12月10日
前端存储数据的方式有:Cookies、SessionStorage、LocalStorage、IndexedDB
这些存储方式都受同源策略的约束,跨域是不能访问的
Cookies
Cookies并不是为了在浏览器中保存数据,而是为了保存HTTP状态,因为HTTP协议是没有状态的。例如保存用户登录的状态。
服务器可以设置和读取Cookies中的信息,服务器可以通过HTTP协议规定的set-cookie在浏览器里保存cookies,之后每次HTTP请求,浏览器都会为请求自动带上Cookies信息。
也可以通过JS代码手动读取和设置Cookies信息: document.cookie
Cookies包含哪些属性
- Name:键值对名字
- Value:键值对的值
- Domain:Cookies是同源策略,这是当前Cookies生效的域名
- Path:表示Cookies影响的路径,匹配到这个路径才会发送这个Cookies
- Expires/Max-Age:
- Expires告诉浏览器Cookies什么时候过期,是一个绝对时间;
- Max-Age告诉浏览器多久后过期,一个相对时间;
- 不设置的话,默认用户关闭浏览器就被清除,关闭tab不清楚
- Size:表示当前保存值的大小
- HttpOnly:当这个值为True的时候,表示浏览器不能通过
document.cookie
更改Cookies的值,可以避免xss攻击更改Cookies的值。 - Secure:当这个值为True时,Cookies在HTTP中无效,在HTTPS中才有效
- SameSite:规定浏览器不能再跨域请求中携带Cookies,减少CSRF攻击
知识点拓展
- XSS攻击(Cross Site Scripting):跨站脚本攻击。恶意代码利用站点漏洞,通过巧妙地方式注入到网页中,使用户加载并执行攻击者的恶意代码。一般攻击者成功后,可以获得更高权限,会话和cookie等信息。利用的是用户对指定网站的信任。
- CSRF攻击(Cross-Site Request forgery):跨站请求伪造。挟持用户在当前已登录的web应用程序中执行非本意的操作的攻击方法。操作成功后,可以进行例如发邮件,操作转账,购买商品等。利用的是网站对用户浏览器的信任。
Cookies缺陷
- 大小限制在4kb左右
- 过多Cookies会浪费带宽性能。同一个域名下所有请求都会带上Cookies。
Cookies的局限,在H5中新增了本地存储方案:WebStorage。分为两类:SessionStorage 和 LocalStorage。
LocalStorage
存储形式key-value键值对
特点
- 数据一直存储,没有过期时间,除非主动清除
- 可以在Tab之间共享数据
- 大小5M左右
- 易于操作,js可直接调用接口操作
- 遵循同源策略
局限
- 高版本浏览器才支持,不过目前主流浏览器都支持
- 值限定为string类型,需要对JSON对象做一些转换
SessionStorage
相对LocalStorage,SessionStorage保存的数据只用于浏览器的一次会话,当前会话结束(浏览器窗口关闭),数据就会被清空。
特点
- 会话级别的浏览器存储,数据不能再Tab之间共享
- 大小为5M左右
- 遵循同源策略
LocalStorage、SessionStorage都是键值对的形式进行存储,只能存储字符串,要存储对象,需要进行序列化和解析。大小都是5M,用于存储非敏感数据完全够用。但是如果遇到大规模而且结构复杂的数据时,没办法满足需求,这时候可以用到IndexedDB。
IndexedDB
一种低级API,用于客户端存储大量结构化数据(包括文件和blobs)。该API使用索引实现高性能数据搜索,是一个运行在浏览器上的非关系型数据库,它的大小没有存储上限。
特点
- 键值对存储
- 操作是异步的,不会造成浏览器卡死
- 支持事务
- 遵循同源
- 大小一般不少于250M,没有上限
- 支持二进制存储
总结
只有Cookies参与服务端通信,对请求性能有影响。其他的都只用在客户端,不和服务端通信。
接口用法参考MDN文档