认识
一、认识
Cookie
最开始被设计出来其实并不是来做本地存储的,而是为了弥补HTTP
在状态管理上的不足。HTTP
协议是一个无状态协议,客户端向服务器发请求,服务器返回响应,故事就这样结束了,但是下次发请求如何让服务端知道客户端是谁呢?这种背景下,就产生了 Cookie
.
Cookie
本质上就是浏览器里面存储的一个很小的文本文件,内部以键值对的方式来存储(在chrome
开发者面板的Application
这一栏可以看到)。向同一个域名下发送请求,都会携带相同的 Cookie
,服务器拿到 Cookie
进行解析,便能拿到客户端的状态。
二、特点
2.1 容量
容量缺陷, Cookie
的体积上限只有4KB
,只能用来存储少量的信息。
2.2 性能
Cookie
紧跟域名,不管域名下面的某一个地址需不需要这个 Cookie
,请求都会携带上完整的 Cookie
,这样随着请求数的增多,其实会造成巨大的性能浪费的,因为请求携带了很多不必要的内容。
2.3 安全
由于 Cookie
以纯文本的形式在浏览器和服务器中传递,很容易被非法用户截获,然后进行一系列的篡改,在 Cookie
的有效期内重新发送给服务器,这是相当危险的。另外,在HttpOnly
为 false
的情况下,Cookie
信息能直接通过 JS
脚本来读取。
三、安全属性
3.1 secure
secure
: 标记为Secure
的Cookie
只能通过被HTTPS
协议加密过的请求发送给服务端,可以借此来预防中间人攻击
3.2 httpOnly
httpOnly
设置后,只能通过 HTTP
响应报文的 Set-Cookie
来新增或更新 cookie
,客户端无法通过脚本的方式来读写 cookie
。对于敏感信息比如用户凭证,请一定要加上 HttpOnly
。如果攻击者成功地实施了 XSS
攻击,会因为无法读取 cookie
而拿不到敏感信息。JavaScript
的Document.cookie
无法访问带有HttpOnly
属性的Cookie
Set-Cookie: token=abcd; HttpOnly
3.3 samesite
samesite
: 性允许服务器要求某个Cookie
在跨站请求时不会被发送,从而可以阻止跨站请求伪造攻击。也就是说 samesite
用来标明这个 Cookie
是个同站 Cookie
,同站Cookie
只能作为第一方Cookie
,不能作为第三方Cookie
。
Cookie
与域关联。如果此域与您所在页面的域相同,则该Cookie
称为第一方Cookie
(first-party cookie
)。如果域不同,则它是第三方Cookie
(thirty-patry cookie
)。第三方Cookie
是由第三方网站引导发出的,可以用于CSRF
攻击以及用户行为追踪。
可选值:
-
samesite=none
: 会携带cookie
。但前提是Secure
设置为true
,即只能在HTTPS
协议下使用(之前的标准没有这个要求)。 -
samesite=strict
: 只在访问相同站点时发送Cookie
, 完全禁止第三方获取cookie
, 跨站点时,任何情况下都不会发送cookie
。这种称为严格模式,表明这个Cookie
在任何情况下都不可能作为第三方Cookie
,绝无例外。但是跳转子域名或者是新标签重新打开刚登陆的网站,之前的Cookie
都不会存在。尤其是有登录的网站,那么我们新打开一个标签进入,或者跳转到子域名的网站,都需要重新登录。对于用户来讲,可能体验不会很好。 -
samesite=lax
: 防范跨站,大多数情况下禁止获取cookie
,除非导航到目标网址的GET
请求(链接、预加载、GET
表单)。这种称为宽松模式,比Strict
放宽了点限制。假如这个请求是这种请求(改变了当前页面或者打开了新页面)且同时是个GET
请求,则这个Cookie
可以作为第三方Cookie
。如果SamesiteCookie
被设置为Lax
,那么其他网站通过页面跳转过来的时候可以使用Cookie
,可以保障外域连接打开页面时用户的登录状态。但相应的,其安全性也比较低。在Chrome 80
版本之后,Cookie
的SameSite
由原来的None
改为了Lax
。
注意: 大多数网站已经将SameSite
的默认值设置为Lax
,此时如果网站想要关闭SameSite
属性,必须在将SameSite
属性设置为None
的同时设置Secure
属性,否则无效。
// 该设置无效
Set-Cookie: widget_session=abc123; SameSite=None
// 有效设置
Set-Cookie: widget_session=abc123; SameSite=None; Secure
四、作用域属性
4.1 domain
domain
: 为cookie
设置域名,如果请求域名与该字段匹配,那么就继续检查path
字段。
Domain=.mozilla.org
4.2 path
path
: 如果域名匹配,那么会检查path
匹配情况,如果也匹配,请求中就会带上cookie
。
4.3 expires
expires
表示 cookie
的过期时间点,使用了 GMT
时间格式的字符串。通过设置 max-age
或者 expires
删除 cookie
。
Set-Cookie: token=abcd; Expires=Fri, 29 Apr 2022 05:29:01 GMT
4.4 max-age
max-Age
表示 cookie
的有效时间长度,单位为秒。通过设置小于等于 0
的数字,可以让一个 cookie
失效。如果 Max-Age
和 Expires
同时存在,以 Max-Age
为准。通过设置 max-age
或者 expires
删除 cookie
。
Set-Cookie: token=abcd; Max-Age=6000