小cookie,大智慧
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
上发起的
www.cnblogs.com/xxx/ajax/Follow/GetFollowStatus.aspx
是same-origin请求
blog-static.cnblogs.com/files/shwee/clock.js
是same-site请求
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将被丢弃)
总之,IEEF配合浏览器给cookie的存取、传输规定了一套完整的策略,环环相扣,促进了web上cookie的平衡应用。
总结输出
第一方cookie vs 第三方cookie的认定: 取决于访客所处的上下文
cookie的常规用法,大家耳熟能详
根据源Origin、站Site、域Domain,请求被划分为4大类,关注HTTP
Sec-Fetch-Site
标头服务器在种植cookie时,可对cookie设置SameSite属性,故SameSite作用对象是cookie
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,大智慧的更多相关文章
- 【分享】小工具大智慧之Sql执行工具
原文:[分享]小工具大智慧之Sql执行工具 工具概况 情况是这样的,以前我们公司有很多Sql用于完成一些很不起眼但又不得不完成的业务,出于方便就直接在Sql查询分析器里执行,按理说应该写一些专门的工具 ...
- 小程序大智慧,sqlserver 注释提取工具
原文:小程序大智慧,sqlserver 注释提取工具 开篇背景 我习惯在写表的创建脚本时将注释直接写在脚本里,比如 /*账套*/ CREATE TABLE [dbo].[AccountingBook] ...
- 【Linux】小应用 大智慧
小应用 大智慧--重视 以工程师的标准要求自己
- 小游戏大智慧,10 个让人眼前一亮的 JavaScript 游戏
摘要: JS还可以这么玩~ Fundebug经授权转载,版权归原作者所有. 这是一篇有趣的文章,我们精选了 JS13K 游戏编程挑战的优秀作品,与大家分享.JS13K 是专为 JavaScript 开 ...
- Python下的opencv小问题大智慧
1.今晚日了狗了,图像显示不按照预期出现,然后突然就好了...... 2.根据第一个问题举一个例子,另一个我没保存... 是不是分不清楚???? plt.imshow(wjy2, cmap='gr ...
- opencv小问题大智慧
opencv易错点记录 1. 判断条件不应使用CV_ASSERT(),而使用CV_Assert(). 2. 用下面这个自适应阈值必须进行数据的转换,不能直接传入数据!不然程序一直崩溃,找了很久才发现 ...
- JavaScript 操作 Cookie
转自作者:聂微东出处:http://www.cnblogs.com/Darren_code/ 什么是 Cookie “cookie 是存储于访问者的计算机中的变量.每当同一台计算机通过浏览器 ...
- cookie的一些细节
什么是 Cookie “cookie 是存储于访问者的计算机中的变量.每当同一台计算机通过浏览器请求某个页面时,就会发送这个 cookie.你可以使用 JavaScript 来创建和取回 cookie ...
- JavaScript之Cookie讲解
什么是 Cookie “cookie 是存储于访问者的计算机中的变量.每当同一台计算机通过浏览器请求某个页面时,就会发送这个 cookie.你可以使用 JavaScript 来创建和取回 cookie ...
随机推荐
- Webpack实战(四):教教你如何轻松搞定-预处理器(loader)
前面三节,我主要给大家分享了有关webpack的一些配置的知识点,如何打包js文件,而如果我们遇到其他类型的资源如图片.css.字体font等等,我们该如何处理呢?今天会介绍预处理器(loader), ...
- crawler 听课笔记 碎碎念 1 初步了解各种选择器极其简单的使用
css中 身份证 id对应# 衣服 class对应 . 图片 pyquery...as pq html= request.get(url=''.....'') doc=pq(html) d ...
- CSS中设置元素的圆角矩形
圆角矩形介绍 在CSS中通过border-radius属性可以实现元素的圆角矩形. border-radius属性值一共有4个,左上.右上.左下.右下. border-radius属性值规则如下:第一 ...
- [DP][SA][可持久化线段树]黑红兔
源自 xyz32768 菜鸡的 FJ 省冬令营模拟赛题 原题 CF1063F Statement 给定一个长度为 \(n\) 的字符串 \(s\),仅包含小写英文字母 要从中从左往右选出若干段不相交的 ...
- 为BlueLake主题增加图片放大效果
fancyBox 是一个流行的媒体展示增强组件,可以方便为网站添加图片放大.相册浏览.视频弹出层播放等效果.优点有使用简单,支持高度自定义,兼顾触屏.响应式移动端特性,总之使用体验相当好. 现在,我们 ...
- 6、python基本数据类型之序列类型
前言:python的基本数据类型可以分为三类:数值类型.序列类型.散列类型,本文主要介绍序列类型及其通用操作. 一.序列类型 1)字符串(str):用单引号('),双引号("),三引号(三单 ...
- Docker windows 容器启动失败 network not found
前几天由于重启了服务器,docker配置的网络出了些问题导致在docker容器中安装的mysql识别用户权限时发生错误.(从宿主机A以user身份 登入到容器B中安装的Mysql时,用户竟然不是use ...
- python条件与循环-循环
1 while语句 while用于实现循环语句,通过判断条件是否为真,来决定是否继续执行. 1.1 一般语法 语法如下: while expression: suite_to_repeat 1.2 计 ...
- 分布式缓存Redis的持久化方式RDB和AOF
一.前言 Redis支持两种方式的持久化,RDB和AOF.RDB会根据指定的规则“定时”将内存中的数据存储到硬盘上,AOF会在每次执行命令后将命令本身记录下来.两种持久化方式可以单独使用其中一种,但更 ...
- sqli_labs学习笔记(一)Less-38~Less-53
续上,开门见山 堆叠注入,实际上就构成了两条SQL语句 http://43.247.91.228:84/Less-38/?id=1' union select 1,2,3 --+ //未报错 h ...