记录使用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
设定的好处至少有两个。
- 即使从其他网站跳转过来也能维持登录状态,因此容易导入已有的Session管理。
- 因为限制了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'
})