cookie/session
cookie
cookie是一种客户端会话跟踪技术,用于将网页的数据存储到浏览器中。当关闭浏览器或到过期时间时,cookie将失效。
cookie存在大小限制,一般个数限制为20~50,大小限制在4KB左右。
cookie在每次请求时将携带在HTTP头中,如果cookie保存过多数据可能存在性能问题。
Caution:
- 浏览器可能禁用cookie
- 不要利用cookie保存隐私数据
- 设置
HttpOnly属性可避免XSS攻击
session
session为会话数据,保存在Web服务器上,主要负责访问者与网站之间的交互。
HTML5新增存储方案
HTML5中新增存储方案,包括sessionStorage、localStorage、WebSQL、IndexedDB。下列所有存储方案均遵循同源策略限制。
localStorage
localStorage生命周期是永久,可实现数据持久化存储。除非用户手动清除,否则localStorage存储的数据一直保存在浏览器中。
localStorage的大小一般为5MB,不参与与服务端的通信。
Caution: localStorage在浏览器隐私模式下不可读取;存储内容多会消耗内存空间,导致页面卡顿。
sessionStorage
sessionStorage仅在当前会话下有效,关闭页面或者浏览器后被清理并失效。
sessionStorage的大小一般为5MB。
Caution: sessionStorage无法跨Tab共享: 打开新页面时,将导致session失效;通过Duplicate 复制Tab时,sessionStorage失效。故在持久化存储时,优先考虑localStorage。
WebSQL
WebSQL数据库API不是HTML5规范的一部分,但它是一个独立的规范,引入一组使用SQL操作客户端数据库的API。
WebSQL与关系数据库的概念相似,支持openDatabase/transaction/executeSQL 等操作,在Chrome浏览器中支持,一般情况下较少使用,作为临时存储或缓存使用。
Caution: 仅Chrome、Safari、Opera支持,IE、Firefox等浏览器不支持。
IndexedDB
IndexedDB是浏览器提供的本地数据库存储,允许存储大容量数据,提供查找接口、建立索引等功能;但IndexedDB不支持SQL,接近NoSQL数据库。
IndexedDB具有键值存储、异步、支持事务、同源限制(不支持跨域访问)、大容量(>=250MB)、支持二进制等特性。
前端框架存储方案介绍
React
-
Redux-persist
Redux-persist 通过将redux存储的数据缓存到localStorage中实现数据持久化存储。
-
react-redux
React-redux将数据存储在内存中,当页面刷新时,存储的数据将被重置。
其它存储方案
Cache Storage
Cache Storage存储Response对象,即存储HTTP响应。Cache Storage是多个Cache的集合,每个Cache可以存储多个Response对象。
Cache Storage在浏览器上的引用名是caches而不是驼峰写法的cacheStorage ,它定义在ServiceWorker规范中。
Application Cache
HTML5引入了应用程序缓存技术,意味着web应用可以进行缓存。在没有网络的情况下,通过创建cache manifest文件,可以轻松创建离线应用。目前主流浏览器均支持Application cache。
Application cache有三个优势:离线浏览、提升页面的载入速度、降低服务器压力。
Application cache主要存储静态资源。使用时服务端需要维护一个manifest清单,浏览器需要进行简单设置。
应用场景分析
存储用户登陆状态
在大多数Web应用中,当用户登陆后,后端生成无意义的字符串token ,同时将token返回给前端。前端在后续所有请求中,将token附加到Header中传输到后端,后端进行token校验。前端在存储Token时,主流的如下几种方案:
sessionStorage: 会话期间内存储,但无法跨浏览器Tab共享数据。
localStrogage: 永久存储。当token过期时,需要重新设置,涉及同步处理;当网站被XSS注入攻击后,对方可能截取localStorage中的数据;localStorage是同步操作,频繁读取可能存在性能问题。
cookie: 使用cookie存储用户登陆状态是目前Web开发主流中的主流。