认识
一、认识
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