我们经常需要对业务中的一些数据进行存储,通常可以分为 短暂性存储 和 持久性储存。
- 短暂性的时候,我们只需要将数据存在内存中,只在运行时可用
- 持久性存储,可以分为 浏览器端 与 服务器端
- 浏览器:
cookie
: 通常用于存储用户身份,登录状态等http
中自动携带, 体积上限为4K
, 可自行设置过期时间
localStorage / sessionStorage
: 长久储存/窗口关闭删除, 体积限制为4~5M
indexDB
- 服务器:
- 分布式缓存
redis
- 数据库
- 分布式缓存
- 浏览器:
cookie和localSrorage、session、indexDB 的区别
特性 | cookie | localStorage | sessionStorage | indexDB |
---|---|---|---|---|
数据生命周期 | 一般由服务器生成,可以设置过期时间 | 除非被清理,否则一直存在 | 页面关闭就清理 | 除非被清理,否则一直存在 |
数据存储大小 | 4K | 5M | 5M | 无限 |
与服务端通信 | 每次都会携带在 header 中,对于请求性能影响 | 不参与 | 不参与 | 不参与 |
从上表可以看到,
cookie
已经不建议用于存储。如果没有大量数据存储需求的话,可以使用localStorage
和sessionStorage
。对于不怎么改变的数据尽量使用localStorage
存储,否则可以用sessionStorage
存储。
对于 cookie
,我们还需要注意安全性
属性 | 作用 |
---|---|
value | 如果用于保存用户登录态,应该将该值加密,不能使用明文的用户标识 |
http-only | 不能通过 JS 访问 Cookie ,减少 XSS 攻击 |
secure | 只能在协议为 HTTPS 的请求中携带 |
same-site | 规定浏览器不能在跨域请求中携带 Cookie ,减少 CSRF 攻击 |
Name
,即该Cookie
的名称。Cookie
一旦创建,名称便不可更改。Value
,即该Cookie
的值。如果值为Unicode
字符,需要为字符编码。如果值为二进制数据,则需要使用BASE64
编码。Max Age
,即该Cookie
失效的时间,单位秒,也常和Expires
一起使用,通过它可以计算出其有效时间。Max Age
如果为正数,则该Cookie
在Max Age
秒之后失效。如果为负数,则关闭浏览器时Cookie
即失效,浏览器也不会以任何形式保存该Cookie
。Path
,即该Cookie
的使用路径。如果设置为/path/
,则只有路径为/path/
的页面可以访问该Cookie
。如果设置为/
,则本域名下的所有页面都可以访问该Cookie
。Domain
,即可以访问该Cookie
的域名。例如如果设置为.zhihu.com
,则所有以zhihu.com
,结尾的域名都可以访问该Cookie
。Size
字段,即此Cookie
的大小。Http
字段,即Cookie
的httponly
属性。若此属性为true
,则只有在HTTP Headers
中会带有此 Cookie 的信息,而不能通过document.cookie
来访问此 Cookie。Secure
,即该Cookie
是否仅被使用安全协议传输。安全协议。安全协议有HTTPS、SSL
等,在网络上传输数据之前先将数据加密。默认为false
。