1. Cookie 简介
HTTP 是一个无状态的协议,每次 http 请求都是独立、无关的,默认不需要保留状态信息。
但有时候需要保存一些状态,怎么办呢?
HTTP 为此引入了 Cookie。Cookie 本质上就是浏览器里面存储的一个很小的文本文件,内部以键值对的方式来存储(在chrome开发者面板的Application这一栏可以看到)。向同一个域名下发送请求,都会携带 相同的 Cookie,服务器拿到 Cookie 进行解析,便能拿到客户端的状态。而服务端可以通过响应头中的 Set-Cookie 字段来对客户端写入 Cookie 。举例如下:
// 请求头
Cookie: a=xxx
// 响应头
Set-Cookie: a=xxx
set-Cookie: b=xxx
2. Cookie 属性
1)生存周期
Cookie 的有效期可以通过Expires和Max-Age两个属性来设置。
Expires即 过期时间
Max-Age用的是一段时间间隔,单位是秒,从浏览器收到报文开始计算。
若 Cookie 过期,则这个 Cookie 会被删除,并不会发送给服务端。
2)作用域
关于作用域也有两个属性: Domain和path, 给 Cookie 绑定了域名和路径,在发送请求之前,发现域名或者路径和这两个属性不匹配,那么就不会带上 Cookie。值得注意的是,对于路径来说, / 表示域名下的任意路径都允许使用 Cookie。
3)安全相关
如果带上 Secure ,说明只能通过 HTTPS传输cookie
如果 cookie 字段带上HttpOnly,那么说明只能通过 HTTP 协议传输,不能通过 JS 访问,这也是预防 XSS 攻击的重要手段。
相应的,对于 CSRF 攻击的预防,也有 SameSite属性
SameSite可以设置为三个值, Strict 、Lax和 None 。
a. 在 Strict 模式下,浏览器完全禁止第三方请求携带Cookie。比如请求 sanyuan.com 网站只能在sanyuan.com 域名当中请求才能携带 Cookie,在其他网站请求都不能。
b. 在 Lax 模式,就宽松一点了,但是只能在 get 方法提交表单 况或者 a 标签发送 get 请求 的情况下可以携带 Cookie,其他情况均不能。
c. 在 None 模式下,也就是默认模式,请求会自动携带上 Cookie。
3. Cookie 的缺点
1)容量缺陷。Cookie 的体积上限只有 4KB ,只能用来存储少量的信息。
2)性能缺陷。Cookie 紧跟域名,不管域名下面的某一个地址需不需要这个 Cookie ,请求都会携带上完整的 Cookie,这样随着请求数的增多,其实会造成巨大的性能浪费的,因为请求携带了很多不必要的内容。但可以通过 Domain 和 Path 指定作用域来解决。
3)安全缺陷。由于 Cookie 以纯文本的形式在浏览器和服务器中传递,很容易被非法用户截获,然后进行一系列的篡改,在 Cookie 的有效期内重新发送给服务器,这是相当危险的。另外,在 HttpOnly 为false 的情况下,Cookie 信息能直接通过 JS 脚本来读取。