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的种植面积

Domain和Path属性定义了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. Nginx作为负载均衡——实战演练

    配置语法 Syntax:upstream name {...} Default:—— Context:http 演示 准备两台虚拟主机192.168.96.188.192.168.96.188 在18 ...

  2. Django 数据库连接缓存的坑

    https://www.cnblogs.com/xcsg/p/11446990.html

  3. numpy 数组的计算

    一.数组和数的计算 数组和数计算,数组中的每个元素和数进行计算 1.加 import numpy as np arr1 = np.arange(12).reshape(3, 4) print(arr1 ...

  4. matplotlib 条形图

    一.特点 离散数据,数据之间没有直接的关系 二.分类 1.垂直条形图 bar(x, height, width=0.8) # x 为x轴 # height 为y轴 # width 为 条形图的宽度 例 ...

  5. 【Oracle】分区表详解

    此文从以下几个方面来整理关于分区表的概念及操作: 1.表空间及分区表的概念     2.表分区的具体作用     3.表分区的优缺点     4.表分区的几种类型及操作方法     5.对表分区的维护 ...

  6. Excel.Application class

    https://docs.microsoft.com/en-us/javascript/api/excel/excel.application?view=office-js Represents th ...

  7. jmeter使用—正则表达式提取器

    当我们测试接口的时候,有些请求参数是需要从上个接口返回获取的数据,这样的话我们就需要用到关联了.今天我们使用的关联是正则表达式提取器来进行获取需要关联的数据. 下面来具体说明正则表达式提取器的使用方法 ...

  8. C#反射与特性(九):全网最全-解析反射

    目录 1,判断类型 1.1 类和委托 1.2 值类型 1.3 接口 1.4 数组 2, 类型成员 2.1 类 2.2 委托 2.3 接口 [微信平台,此文仅授权<NCC 开源社区>订阅号发 ...

  9. 3d动态文字的绘制

    在这里介绍一种3D文字的一种动态效果,可以说这是一种伪3D创建的一种3D的视觉效果 简单的讲解一下:大家或多或少都会听说过素描这种绘画手法,其实这种手法就是巧妙的利用了.阴影给人们带来的立体的视觉冲击 ...

  10. java泛型梳理

    java泛型梳理 概述 泛型,即参数化类型,是在JDK1.5之后才开始引入的. 所谓参数化类型是指所操作的数据类型在定义时被定义为一个参数,然后在使用时传入具体的类型. 这种参数类型可以用在类,接口, ...