记录使用JS-Cookies过程中的收获

Cookie是什么

Cookie 剑桥词典翻译:小甜饼,曲奇饼;

是一种小而扁平的烘焙食品,通常含有面粉、糖和油,也可能加入其他材料,如葡萄干、燕麦、巧克力豆、坚果和果酱等。

咳咳,正经一点

Cookie(也叫HTTP cookie,web cookie)是一个带有少量数据的文本文件(不超过4k)。当我们使用自己的电脑(客户端)通过浏览器进行访问网页的时候,网页(有可能)就会生成一个证书返回给我们的浏览器并写入本地,这个证书就是cookie

主要用于在客户端上保存用户数据,起到简单的缓存和用户身份识别等作用

cookie常常被用于存储用户的私有信息,所以为了保证隐私安全,防止cookie信息被盗取,浏览器施行了同源政策。只有当各个网络访问满足同源策略时,才允许共享cookie信息。 所谓的「同源」指的是:

  • 协议相同
  • 域名相同
  • 端口相同

只有当这三者相同时,浏览器才认为是符合同源策略的。 而基于cookie的网络攻击则是通过绕过各种办法绕过同源策略来实施攻击,比如XSS、CSRF攻击

为了预防利用cookie做跨域攻击,所以cookie中增加SameSite属性,用它来标明是否是同站cookie,可以有效防止CSRF攻击或用户追踪。

SameSite属性有三个属性值,分别是:

  • Strict 严格
  • Lax 宽松
  • None 未设定

Strict

Strict 即严格,完全禁止第三方 Cookie,跨站点时,任何情况下都不会发送 Cookie。

换言之,只有当前网页的 URL 与请求目标一致,才会带上 Cookie。

Set-Cookie: CookieName=CookieOfSysadm.cc; SameSite=Strict; 

由于这个设定过于严格,将会造成非常不好的用户体验。

Lax

Lax 规则相对 Strict 宽松一些,大多数情况也是不发送第三方 Cookie,但是导航到目标网址的 GET 请求除外。

Set-Cookie: CookieName=CookieOfSysadm.cc; SameSite=Lax; 

导航到目标网址的 GET 请求,只包括三种情况:链接、预加载和GET表单。

Lax 设定的好处至少有两个。

  1. 即使从其他网站跳转过来也能维持登录状态,因此容易导入已有的Session管理。
  2. 因为限制了POST不能发送Cookie,所以同 Strict 一样杜绝了CSRF攻击的可能性。

None

未设定值,这个是目前的默认值,不过为了安全考虑 Chrome 计划将 Lax 变为默认设置。

当然了,网站可以选择显式关闭 SameSite 属性,将其设为 None

不过,前提是必须同时设置 Secure 属性(Cookie 只能通过 HTTPS 协议发送),否则无效。

这也是报错 “某些 Cookie 滥用推荐的“sameSite“属性” 的原因。

Set-Cookie: laravel_session=sysadm.cc; SameSite=None; Secure

使用JS-Cookies代码编写如下:

Cookies.set('userName', userName.value, {
    secure: true,
    expires: 1,
    sameSite: 'Lax'
})
最后修改:2024 年 03 月 23 日
如果觉得我的文章对你有用,请随意赞赏