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. 原生javascript 基础动画原理

    一.实现原理: 1.开定时器前先清除定时器 2.设置定时器 3.当前元素的位置 + 每一步的长度 4.当元素当前位置超过目标点时,把当前位置==目标点 5.设置元素位置,开始运动 6.判断当前位置如果 ...

  2. Kettle中JavaScript内置函数说明

    本文链接:https://blog.csdn.net/u010192145/article/details/102220563 我们在使用JavaScript组件的时候,在左侧核心树对象栏中可以看到K ...

  3. Scala与Mongodb实践3-----运算环境的搭建

    目的:使的在IDEA中编辑代码,令代码实现mongodb运算,且转换较为便捷 由实验2可知,运算环境的搭建亦需要对数据进行存储和计算,故需要实现类型转换,所以在实验2的基础上搭建环境. 由菜鸟教程可得 ...

  4. map文件分析

    1.MAP文件基本概念 段(section):描述映像文件的代码和数据块 RO:Read-Only的缩写,包括RO-data(只读数据)和RO-code(代码) RW:Read-Write的缩写,主要 ...

  5. day6 云道页面 知识点梳理(1)

    关于块级元素.行内元素.行内块元素的梳理 (1)块级元素 特点:   a.可以设置宽高,行高,外边距和内边距   b.块级元素会独占一行    c.宽度默认是容器的100%    d.可以容纳内联元素 ...

  6. playbooks框架部署远程主机

    进入到ansible和python环境 进入python3.6虚拟环境 #su - deploy #source .py3-a2.5-env/bin/activate 加载ansible 2.5版本 ...

  7. 安装xpath helper

    1.下载 版本是:2.02的 链接:https://pan.baidu.com/s/1YdyTbWElL904EMQ-9Ougnw 提取码:bxxa 2.无效安装的解决方案 参考链接:https:// ...

  8. 字典 pop

    1.pop(key) 删除键值对,返回value2.若字典中没有这个key,则返回None,也可以自定义3.可用作if条件判断 来源: rest framework 框架 Serializer que ...

  9. Django 添加 app

    一.创建Django项目的时候添加 二.在终端创建app python manage.py startapp app名称 运行完命令后,要在settings.py文件中,添加配置文件

  10. laravel脚手架搭建项目问题之生产环境element-ui组件字体图标显示错误问题

    问题描述: 1.element-ui组件使用的是npm安装 2.npm scripe模式开发 3.使用git命令行工具开发 3.开发环境下图标正常显示 4.生产环境下图标显示不正常 分析原因: 图标文 ...