Cookie是什么?cookies是你访问网站时创建的数据片段文件,

用来记录访问者的用户信息、历史记录、访问偏好、以及判定老访客的登陆状态,并且通过这些信息提升访问者在网站上的使用体验。

First-party cookies or Third-party cookies

  第一方cookie由你访问的站点创建。该站点指的是地址栏显示的站点;

  第三方cookie是由其他站点创建的。这些站点拥有你当前访问的网页上部分资源,如广告或图像。

  第一方/第三方cookie不是绝对的标签,而是相对于用户的上下文,同一cookie可以是第一方也可以是第三方,这取决于用户当时所在的网站。

为什么要提第三方cookie,这与下面的cookie的SameSite策略密切相关。

cookie的常规使用方式

web服务端发送给浏览器的cookie,浏览器会存储并在下次请求原服务器的时候回发cookie。

在HTTP请求模型中以标头的形式体现:Response中Set-Cookie标头种植cookie;Request Cookie标头携带(该请求允许携带的)cookies

HTTP/1.0  OK
Content-type: text/html
Set-Cookie: yummy_cookie=choco
Set-Cookie: X-BAT-FullTicketId=TGT--******; path=/; samesite=none; httponly [page content]

Cookie标头的内容是键值对(键值对才是具业务含义的cookie);同名cookie覆盖原键值,不同名cookie会追加到键值对。

GET /sample_page.html HTTP/1.1
Host: www.example.org
Cookie: yummy_cookie=choco; X-BAT-FullTicketId=TGT--******

  除了服务端响应时使用Set-Cookie标头种植cookie,浏览器JavaScript也可以种植cookie。

cookie的种植面积

DomainPath属性定义了cookie的写入范围:哪些url的请求可以携带该cookie。

  • Domain指定哪些host能被种植该cookie,如果没有指定,默认是当前document location所在的host,不包含子域;如果指定了Domain,那么包括子域(也就是说在该域名下共享cookie,这也是利用二级域名共享cookie实现单点登录的原理)。
例如设置了Domain=bat.com, 那么类似于developer.bat.com、xxoo.bat.com等子域下的url请求均会种下该cookie.
  • Path 指定能携带该cookie的具体url。 "/" 是目录分隔符,会匹配子目录.
 例如设置了Path =/doc,下面的目录都会被匹配.
- /docs
- /docs/web/
- /docs/web/http

cookie的有效时长

一般情况下浏览器关闭,cookie失效;

可通过设置特定的Expires或者Max-Age为cookie设置相对较长的有效时间。

 Set-Cookie: id= a2faw; Expires=Wed, Oct  : GMT

当设置了过期时间,这个设置的时间是相对于浏览器而言,而非服务器。

cookie与web安全息息相关

因为cookie是站点私有片段数据,与web上各种攻击密切相关,如XSS,CSRF.

根据W3c的操作规范,种植cookie时可通过某些属性限制cookie的使用方式。

发送cookie的物理安全

Secure指定了发送cookie的物理安全:要求以HTTPS形式回发cookie。 Chrome52+、Firefox52+已经支持Secure指令,再使用http请求已经不会携带Secure cookie

即便是Secure指令, 敏感信息也不要放在cookie中, 因为他们天生就不安全,https并不能提供足够有效的安全防护。

谁能访问cookie?

web上能访问cookie的物件有两种:

  • 浏览器请求

  • JavaScript

HttpOnly指示cookie将不能通过JavaScript的document.cookie编程接口访问,这样可以缓解对跨站点脚本(XSS)的攻击。

如:访问会话在浏览器留置的认证cookie就没有必要暴露给JavaScript,可对其设置HttpOnly指令
Set-Cookie: X-BAT-FullTicketId=TGT--******; Expires=Wed, Oct :: GMT; Secure; HttpOnly

哪些浏览器请求能合法携带cookie?

首先科普一下重要的web HTTP知识:

对页面资源的请求,依据请求发起者的源Origin与资源的源Origin的相等关系,被划分为4类。

Http请求中Sec-Fetch-Site标头指示了这个属性:

Sec-Fetch-Site 描述
cross-site 请求的发起源与资源源完全不相同
same-origin 请求的发起源与资源源完全相同
same-site 请求的发起源与资源源部分相同:同一顶级域名下的二级域名
none  

Q1.   域Domain、源Origin、站Site、傻傻分不清清楚?

    

  观察www.cnblog.com任意一篇博文的network,看动图!

本人之前也被各种 域Domain源Origin、站Site专属名称搞得很困惑?

在博客页面www.cnblog.com/xxx/p/110.htm上发起的

  1. www.cnblogs.com/xxx/ajax/Follow/GetFollowStatus.aspx是same-origin请求

  2. blog-static.cnblogs.com/files/shwee/clock.js是same-site请求

  3. www.google-analytics.com/r/collect?v=1&_v=j81&a=38982783&t=pageview&_s=1是cross-site请求

Q2.  聊cookie为什么要提到给请求分类的Sec-Fetch-Site标头?

答:B站页面在请求A站资源时能否携带A站cookie(第三方cookie)不仅是一个道德问题;技术上还牵涉web安全(CSRF)。

针对以上的请求类型,浏览器针对cookie有SameSite属性,提供针对跨站点请求伪造攻击(CSRF)的保护。

在服务端Set-Cookie种植cookie时,SmmeSite属性值可指示浏览器是否可在后续的“同一站点”或“跨站点”请求中携带这些cookie

Set-Cookie: X-bat-FullTicketId=TGT--em4xx0faD1c4pbt*********k5Z0vN4uPOoEBWfGIP6l-bat-xxxxooo; path=/; samesite=none; httponly

有如下枚举值:

  • Lax : 对同源、顶级域的请求才可以携带cookie (等价于same-site)

  • Strict: 对同源请求才可以使携带cookie (等价于same-origin)

  • None: 对于cookie的使用无限制,随便使用

最新的IEEF cookie SameSite策略:

1.    敦促浏览器版本迁移,使cookie的SameSite默认= Lax(如果没有设置SameSite属性,这个SameSite就默认是Lax

2.   如果需要跨域发送cookie,请使用None枚举值选择无SameSite限制, None指令需要搭配Secure指令 (如果使用SameSite=None, 但是不带secure,那么这个cookie将被丢弃)

Tip :None枚举值是标准新增枚举值,一些旧浏览器不识别这个枚举值,可能导致一些问题.

总之,IEEF配合浏览器给cookie的存取、传输规定了一套完整的策略,环环相扣,促进了web上cookie的平衡应用。

总结输出

  1. 第一方cookie vs 第三方cookie的认定: 取决于访客所处的上下文

  2. cookie的常规用法,大家耳熟能详

  3. 根据源Origin、站Site、域Domain,请求被划分为4大类,关注HTTP Sec-Fetch-Site标头

  4. 服务器在种植cookie时,可对cookie设置SameSite属性,故SameSite作用对象是cookie

  5. SameSite属性决定了后续的跨域/跨站请求是否可以携带B站cookie,缓解了CSRF攻击

  • https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies

  • https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Sec-Fetch-Site

  • https://web.dev/samesite-cookies-explained

小cookie,大智慧的更多相关文章

  1. 【分享】小工具大智慧之Sql执行工具

    原文:[分享]小工具大智慧之Sql执行工具 工具概况 情况是这样的,以前我们公司有很多Sql用于完成一些很不起眼但又不得不完成的业务,出于方便就直接在Sql查询分析器里执行,按理说应该写一些专门的工具 ...

  2. 小程序大智慧,sqlserver 注释提取工具

    原文:小程序大智慧,sqlserver 注释提取工具 开篇背景 我习惯在写表的创建脚本时将注释直接写在脚本里,比如 /*账套*/ CREATE TABLE [dbo].[AccountingBook] ...

  3. 【Linux】小应用 大智慧

    小应用 大智慧--重视 以工程师的标准要求自己

  4. 小游戏大智慧,10 个让人眼前一亮的 JavaScript 游戏

    摘要: JS还可以这么玩~ Fundebug经授权转载,版权归原作者所有. 这是一篇有趣的文章,我们精选了 JS13K 游戏编程挑战的优秀作品,与大家分享.JS13K 是专为 JavaScript 开 ...

  5. Python下的opencv小问题大智慧

    1.今晚日了狗了,图像显示不按照预期出现,然后突然就好了...... 2.根据第一个问题举一个例子,另一个我没保存... 是不是分不清楚????   plt.imshow(wjy2, cmap='gr ...

  6. opencv小问题大智慧

    opencv易错点记录 1. 判断条件不应使用CV_ASSERT(),而使用CV_Assert(). 2.  用下面这个自适应阈值必须进行数据的转换,不能直接传入数据!不然程序一直崩溃,找了很久才发现 ...

  7. JavaScript 操作 Cookie

    转自作者:聂微东出处:http://www.cnblogs.com/Darren_code/      什么是 Cookie “cookie 是存储于访问者的计算机中的变量.每当同一台计算机通过浏览器 ...

  8. cookie的一些细节

    什么是 Cookie “cookie 是存储于访问者的计算机中的变量.每当同一台计算机通过浏览器请求某个页面时,就会发送这个 cookie.你可以使用 JavaScript 来创建和取回 cookie ...

  9. JavaScript之Cookie讲解

    什么是 Cookie “cookie 是存储于访问者的计算机中的变量.每当同一台计算机通过浏览器请求某个页面时,就会发送这个 cookie.你可以使用 JavaScript 来创建和取回 cookie ...

随机推荐

  1. Yolo V3损失函数占个坑

    https://blog.csdn.net/weixin_43384257/article/details/100974776目前来看讲的最清楚的博客 https://zhuanlan.zhihu.c ...

  2. 越来越清晰的TFRecord处理图片的步骤

    # 首先是模块的导入 """ os模块是处理文件夹用的 PIL模块是用来处理图片的 """ import tensorflow as tf ...

  3. CF - 高精度 + 贪心

    Last year Bob earned by selling memory sticks. During each of n days of his work one of the two foll ...

  4. electron教程(番外篇一): 开发环境及插件, VSCode调试, ESLint + Google JavaScript Style Guide代码规范

    我的electron教程系列 electron教程(一): electron的安装和项目的创建 electron教程(番外篇一): 开发环境及插件, VSCode调试, ESLint + Google ...

  5. java 类初识

    一.定义 成员变量 成员方法 注意: 1.成员变量有默认值,是全局变量 2.成员方法,不需要使用static 3.成员变量的默认值 整型 0 浮点型 0.0 引用数据类型 null 二.使用 1.导包 ...

  6. powershell Google Firefox

    $firefox = @{ DisplayName = "Mozilla Firefox"; filename = "Firefox Setup 68.0b7.msi&q ...

  7. Day8-Python3基础-Socket网络编程

    目录: 1.Socket语法及相关 2.SocketServer实现多并发 Socket语法及相关 socket概念 socket本质上就是在2台网络互通的电脑之间,架设一个通道,两台电脑通过这个通道 ...

  8. Docker Swarm 从入门到放弃

    准备工作 我本机是macOS,所以我直接安装了docker desktop,其中包含了docker-machine,不用单独安装. 安装docker主机驱动 我在网上很多人提到了使用virtualbo ...

  9. nginx之历史回溯

    前言 nginx是一个web应用及反向代理工具,由一名俄罗斯程序员(Igor)发明的:NGINX是一个免费的,开源的高性能HTTP服务器和反向代理,以及IMAP / POP3代理服务器. NGINX以 ...

  10. laravel 服务容器的由来 代码展示

    <?php /** * 目的:代码的完善来说明从 基础类的调用到 工厂类的使用 再到容器的出现的原因 * (首先要明白工厂类和容器的关系 可以理解:容器就是工厂类的升级版(为了解决类的依赖)) ...