Cookie学习
前言:我们通常说的无状态的HTTP协议其实是HTTP1.x,所谓的无状态,就是网页一旦关闭,浏览器和服务器的连接就会断开,下次打开网页又会重新连接,对于事务处理没有记忆能力。于是乎,为了解决HTTP无状态导致的问题,出现了cookie,说到底其实cookie是为了解决客户端和服务端会话状态的问题。
cookie:网页浏览器保存用户信息的文件,一般不超过4KB的小型文本文件,由一个名称(Name),一个值(Value)和其他几个用于控制Cookie有效期,安全性,使用范围的可选属性组成。
一。Cookie的查看
我们可以在浏览器的开发者工具中查看到当前页面的Cookie:
虽然我们在浏览器中可以看到Cookie,但并不意味着Cookie就只是存放在浏览器上的,它还可以存在本地文件里,存放在本地的好处就是即使关闭了浏览器,Cookie仍然可以生效。
二。Cookie的设置
接下来我们来看一下Cookie是怎么进行设置的:
1.客户端发送HTTP请求到服务器
2.当服务器收到HTTP请求时,在响应头里面添加一个Set-Cookie字段(可以在请求返回的Response Headers中看到)
3.浏览器收到响应后保存下Cookie
4.之后对该服务器每一次请求中都通过Cookie字段将Cookie信息发送给服务器
三。Cookie的属性
从上图中可以看到Cookie的一些属性:
-
Name/Value
用JavaScript操作Cookie的时候注意对Value进行编码处理
-
Expires
用于设置Cookie的过期时间,比如:
Set-Cookie:id=a3fWa;Expires=Wed,21 Oct 2018 09:45:00 GMT;
当Expires缺省时,表示是会话性Cookie,像上图Expires的值为Session,表示的就是会话性Cookie。而相对的持久性Cookie会保存在硬盘中,直到过期或者清除Cookie。
-
Max-Age
用于设置在Cookie失效之前需要经过的秒数。例如
Set-Cookie: id=a3fWa; Max-Age=604800
Max-Age可以为正数、负数、甚至是0。
如果max-Age为正数时,浏览器会将其持久化,即写到对应的Cookie文件中。为负数时,则表示该Cookie只是一个会话性Cookie。为0时,则会立即删除这个Cookie。
假如Expires喝Max-Age都存在,Max-Age优先级更高。
-
Domain
指定了Cookie可以送达的主机名。假如没有指定,那么默认值为当前文档访问地址中的主机部分。
不能跨域设置Cookie,比如阿里域名下的页面不能设置Domain为百度:
Set-Cookie: qwerty=219ffwef9w0f; Domain=baidu.com; Path=/; Expires=Wed, 30 Aug 2020 00:00:00 GMT
-
Path
指定了一个URL路径,这个路径必须出现在要请求的资源的路径中才可以发送Cookie首部。比如设置Path=/docs,/docs/Web/下的资源会带Cookie首部,/test则不会携带Cookie首部。
Domain和Path标识共同定义了Cookie的作用域:即Cookie应该发送给哪些URL。
-
Secure属性
标记为Secure的Cookie只应通过被HTTPS协议加密过的请求发送给服务端。使用HTTPS安全协议,可以保护Cookie在浏览器和Web服务器间的传输过程中不被窃取和篡改。
-
HTTPOnly
可以防止客户端脚本通过document.cookie等方式访问Cookie,有助于避免XSS攻击。
-
SameSite(之前是默认None,Chrome80默认Lax
可以让Cookie在跨站请求时不会被发送,从而可以阻止跨站请求伪造攻击(CSRF)。
属性:
- Strict :仅允许一方请求携带Cookie,即浏览器将只发送相同站点请求的Cookie,即当前网页URL与请求目标URL完全一致。
- Lax:允许部分第三方请求携带Cookie。
- None:无论是否跨域站都会发送Cookie。
跨域和跨站不是一个概念,同站(same-site)/跨站(cross-site)和第一方(first-party)/第三方(third-party)是等价的。但是与浏览器同源策略(SOP)中的同源(same-origin)/跨域(cross-origin)是不同的。
同源策略是指:两个URL的协议,端口和主机名一致。而同站只要两个URL的eTLD+1(有效顶级域名+二级域名,例如baidu.com)相同即可,不需要考虑协议和端口。
-
HTTP接口不支持SameSite=None
如果想加SameSite=None属性,那么该Cookie就必须同时加上Secure属性,表示只有在HTTPS协议下该Cookie才会被发送。
-
需要UA检测,部分浏览器不能加SameSite=None