参考文章:浏览器系列之 Cookie 和 SameSite 属性git
HTTP 是一个无状态的协议(这里的 HTTP 是指 HTTP 1.x),它的每一个请求都是彻底独立的,每一个请求包含了处理这个请求所需的完整的数据,发送请求不涉及到状态变动。简单的理解就是同一个客户端连续两次发送请求到服务器,服务器也识别不出这是同一个客户端发送的请求。
为了解决 HTTP 无状态致使的问题,出现了 Cookie。 Cookie 的存在也不仅是为了解决通信协议无状态的问题。github
含义:类型为「小型文本文件」,指某些网站为了辨别用户身份而储存在用户本地终端上的数据(不超过 4KB)。
组成:它由一个名称(Name)、一个值(Value)和其它几个用于控制 Cookie 有效期、安全性、使用范围等可选属性组成。
查看:跨域
Cookie 主要用于如下三个方面:浏览器
简单来讲就是:安全
用 JavaScript 操做 Cookie 的时候注意对 Value 进行编码处理。服务器
Expires 用于设置 Cookie 的过时时间。设定的过时时间只与客户端相关,而不是服务端。cookie
Set-Cookie: name=value; Expires=Wed, 21 Oct 2021 07:28:00 GMT;
Max-Age 用于设置在 Cookie 失效以前须要通过的秒数。Max-Age 能够为正数、负数、甚至是 0。工具
Set-Cookie: id=1224455; Max-Age=604800;
Expires 和 Max-Age 都存在时,Max-Age 优先级更高。
Domain 指定了 Cookie 能够送达的主机名。默认值为当前文档访问地址的有效顶级域名 + 二级域名。网站
Set-Cookie: test=219ffwef9w0f; Domain=taobao.com;
若是设置Domain 是 taobao.com,那么 a.taobao.com 或 b.taobao.com 均可以使用 Cookie。编码
不能跨域设置 Cookie,好比在 .taobao.com 页面里把 Domain 设置成 Baidu.com 是无效的
Path 指定了一个 URL 路径,这个路径必须出如今要请求的资源的路径中才能够发送 Cookie。好比设置 Path=/docs
,/docs/Web/
下的资源会带 Cookie ,/test
则不会携带 Cookie。
Set-Cookie: test=219ffwef9w0f; Domain=taobao.com; Path=/;
Domain 和 Path 标识共同定义了 Cookie 的做用域:即 Cookie 应该发送给哪些 URL。
设置 Secure 表示只有 https 协议才会发送cookie。使用 HTTPS 安全协议,能够保护 Cookie 在浏览器和 Web 服务器间的传输过程当中不被窃取和篡改。
Set-Cookie: test=219ffwef9w0f; Domain=taobao.com; Path=/; Secure
设置 HTTPOnly 表示仅当 http 和 https 协议下才发送 cookie,本地方式获取 cookie 无效。能够防止客户端脚本经过 document.cookie 等方式访问 Cookie,有助于避免 XSS 攻击。
Set-Cookie: test=219ffwef9w0f; Domain=taobao.com; Path=/; HTTPOnly
http-only: 没法被网页脚本读取,不限制传输通路的安全性
secure: 能够被网页脚本读取,只容许经过安全通路发送给服务器
SameSite 可让 Cookie 在跨站请求时不会被发送,从而能够阻止跨站请求伪造攻击(CSRF)。
Set-Cookie: name=dzxz; Expires=Wed, 30 Aug 2020 00:00:00 GMT;SameSite=none; Secure
属性值
SameSite 能够有下面三种值:
Chrome80 以前默认是 None,Chrome80 后默认是 Lax。
同站和跨站
同站(same-site)/跨站(cross-site)」和第一方(first-party)/第三方(third-party)是等价的。可是与浏览器同源策略(SOP)中的「同源(same-origin)/跨域(cross-origin)」是彻底不一样的概念。
例子:
www.taobao.com 和 www.baidu.com 是跨站。
www.a.taobao.com 和 www.b.taobao.com 是同站。
a.github.io 和 b.github.io 是跨站。【github.io 是一个完整的 eTLD,其上注册的子域名都是跨站。】
eTLD
表示有效顶级域名,注册于 Mozilla 维护的公共后缀列表中,例如,.com、.co.uk、.github.io 等。eTLD+1 则表示,有效顶级域名 + 二级域名,例如 taobao.com 等。顶级域名 TLD 和有效顶级域名 eTLD 的区别严格来讲: .cn 是顶级域名, .com.cn .org.cn 是 .cn 自主创造出来的顶级域名。因为这样状况很是普遍,因此严格意义的顶级域名不少场景下无法直接使用,因而就创造了一个【有效顶级域名】的概念。把自主创造出来的顶级域名注册成有效顶级域名,好比说 .github.io,.org.cn