Cookies
1. Cookie
Cookie 一般来讲,由服务端创建并存储携带在 http Response Headers 的 Set-Cookie 中,并在浏览器下次请求同一服务器时,通过 Request Headers 的 Cookie 字段发送给后端。
Cookie 是无状态http的状态。
Cookie 目前主流用法:
会话状态管理;
个性化设置/推荐(广告投放);
浏览器行为跟踪;
同时,不仅仅是只有服务端才可创建 Cookie,浏览器或者说客户端也可操作 Cookie,如:document.cookie。
2. Cookie 生命周期
Cookie 生命周期 Cookie 的生命周期可以通过 Expires 或 Max-Age 来定义。
有趣的是,经过我的测试发现无论是在前端(浏览器)上直接设置 Expires/Max-Age 还是经过 Node 服务器进行设置 Expires/Max-Age 其最终都会被计算成日期传到前端。
也就是说,在前端可以看到或者说获取到的 Cookie 值其实只有两种,分别是 Date() 类型和 Session 。
🥇 Date() 日期类型
🥈 Session // 仅在当前会话有效 关于 Cookie 过期验证,没什么好验证的,过期的 Cookie 就直接被浏览器删掉了,根本到不了后端。就算你手动添加一个,那也不是之前那个了,因为那就相当于又重新生效了一个同名 Cookie 而已。
3. 限制访问 Cookie
Cookie 有两种方法可以确保 Cookie 被安全发送,并且不会被意外的参与者或脚本访问:Secure 属性和 HttpOnly 属性[1]。
Secure只能用在https协议上传输;HttpOnly客户端通过document.cookie无法获取设置该属性的Cookie字段;
4. Cookie 作用域
Cookie 作用域 Domain 和 Path 标识定义了 Cookie 的作用域:即允许 Cookie 应该发送给哪些URL[1]。
Domain:Cookie作用的域名,指定Domain时,作用的域名为指定域名及其子域名,若未指定,则默认为当前origin且不包含子域名;Path:总结为两句话。若设置了,则已设置的值为准,若未设置,则由URL的path的最后一个/向前截取,截取的结果作为Cookie的Path。其作用域为当前path路径下的所有子路径,包含当前路径[2];
5. SameSite 属性
SameSite 属性 SameSite 顾名思义——同一站点的配置项,理解来讲就是来限制 Cookie 传播是否受"同一站点—— SameSite "的限制。
MDN 里这样描述:SameSite Cookie 允许服务器要求某个 cookie 在跨站请求时不会被发送,从而可以阻止跨站请求伪造攻击(CSRF)[1]。
SameSite 共有下面三种值[3][4]:
None:就是没有限制,Cookie想怎么传就怎么传;Strict:Strict(严格)模式,严格到只有当前top.window对象的url及其子url才有资格传播,但不代表一定会传播,因为还要满足Cookie作用域 的限制;Lax:Lax(不严格)模式,即存在一些情况可以传播Cookie;
具体情况见下图描述⬇️。[5]

6. Cookie prefixes
Cookie prefixes Cookie prefixes 指在 Cookie 名前添加绑定的前缀:"__Host-" 与 "__Secure-"。
__Host-:MDN这么解释道:它需要设置Secure属性,并且来自安全的origin,同时还要设置Path为/,但Domain要为默认值,即只有在当前安全的host下才可传播发送该Cookie, 同时MDN称之为domain-locked, 我理解其为"被锁定的域"。__Secure-:相较于__Host-,其仅要求来自安全的origin,并设置Secure属性才可传播发送。
7. JavaScript 通过 Document.cookie 访问 Cookie
JavaScript 通过 Document.cookie 访问 Cookie 在第一章节中就已经剪短提到过通过 JavaScript 对 Cookie 进行操作的方法,但该方法仅可访问创建非 HttpOnly 标记的 Cookie。
8. Cookie 安全
Cookie 安全凡事涉及安全的问题都不会是小问题。
这里不太好概述,理解的也不深,直接贴链接吧
参考资料:
[1]. HTTP cookies of MDN
[2]. Cookie的path值的默认规则
[3]. Cookie SameSite
[4]. SameSite 是什么
[5]. Cookie中的SameSite设置
[6]. Cookie 安全 of MDN
[7]. Markdown syntax
最后更新于
这有帮助吗?