首先介绍下基本信息:公司的某个业务系统是h.xxx.com
,登陆走的经过iframe
嵌入的网页passport.xxx.com
。html
本地开发环境下,业务系统只支持http
协议,因此对应访问地址为http://h.xxx.com
,登陆接口始终是https://passport.xxx.com
。git
这样就是一个跨协议的状况了。github
某一天,有同窗登陆系统后始终提示“你未登陆,请先登陆B站”,并且并非全部人有该问题。web
通过一系列排查,发现惟一的区别只有Chrome
浏览器版本不一致(使用部分其余浏览器也是没有问题的)。chrome
从v88
升级到v89
后,Chrome
浏览器内置的schemeful-same-site
规则默认值改成启用,致使跨协议也被认定为跨站(cross-site),cookies
没法传递。浏览器
临时解决方案:地址栏打开chrome://flags/#schemeful-same-site
,将选项设置为Disabled
。安全
在Chrome 80
版本,SameSite
的默认值被改成Lax
。
eTLD+1
部分一致就能够称之为same-site
。cookie
scheme
和eTLD+1
部分一致则被称为schemeful same-site
app
下面是一些schemeful same-site
的案例:工具
Origin A | Origin B | schemeful same-site |
---|---|---|
https://www.example.com:443 | https://www.evil.com:443 | cross-site: 域名不一样 |
https://login.example.com:443 | schemeful same-site: 容许子域名不一样 | |
http://www.example.com:443 | cross-site: 协议不一样 | |
https://www.example.com:80 | schemeful same-site: 容许端口不一样 | |
https://www.example.com:443 | schemeful same-site: 彻底匹配 | |
https://www.example.com | schemeful same-site: 容许端口不一样 |
Schemeful Same-Site 是 same-site
的进阶版,经过协议+域名两个维度来定义,若是想深刻了解下,你能够浏览这篇文章:Understanding 'same-site' and 'same-origin' 。
这意味着 http://website.example 和 https://website.example 相互之间是跨站(cross-site)的。
若是你的网站已经所有使用HTTPS
,那Schemeful Same-Site
不会有任何影响,不然应该尽快升级到HTTPS
。
若是你的项目同时使用HTTP
和HTTPS
,那就颇有必要了解相关规则,接下来将介绍一些场景以及与之对应的cookie
行为。
之前能够经过设置SameSite=None; Secure
来容许 跨协议的cookies
传输,原做者建议不要使用这个临时解决方案,应该尽快全站部署HTTPS
,事实上也确实是这样的,就像前文的登陆问题,你永远不知道浏览器给你的下一个“惊喜”是什么。
Chrome
和Firefox
上提供了schemeful-same-site
的配置入口。
Chrome 86
开始,修改chrome://flags/#schemeful-same-site
选项为Enabled
便是启用。Firefox 79
开始,打开about:config
修改 network.cookie.sameSite.schemeful
选项为true
。在之前的浏览器更新中,为了防止跨站请求伪造(CSRF)攻击,已经将SameSite=Lax
设置为默认项。
然而攻击者仍是能经过不安全的HTTP
协议篡改cookies
,影响到也使用一样cookies
的HTTPS
页面。
schemeful-same-site
也就应运而生。
以前两个跨协议同域名的页面跳转是容许携带设为SameSite=Strict
的cookies
。
如今不一样协议被认定为跨站(cross-site),因此设为SameSite=Strict
的cookies
就被阻挡了。
HTTP → HTTPS | HTTPS → HTTP | |
---|---|---|
SameSite=Strict | ⛔ Blocked | ⛔ Blocked |
SameSite=Lax | ✅ Allowed | ✅ Allowed |
SameSite=None;Secure | ✅ Allowed | ⛔ Blocked |
主流浏览器都会阻止 active mixed content(主动型混合内容) ,如scripts
、iframe
。Chrome
和Firefox
浏览器正在尝试升级或阻止passive mixed content
(被动型混合内容)。
子资源(subresources
)包括图片,iframes
以及 XHR
、Fetch
请求
以前若是一个页面加载了跨协议的资源,他们之间是能够共享设为SameSite=Strict
、SameSite=Lax
的cookies
。
然而如今二者通通被浏览器阻止,没法传输共享。
另外即便HTTPS
可以加载HTTP
资源,全部的cookies
仍是会被阻止。
HTTP → HTTPS | HTTPS → HTTP | |
---|---|---|
SameSite=Strict | ⛔ Blocked | ⛔ Blocked |
SameSite=Lax | ⛔ Blocked | ⛔ Blocked |
SameSite=None;Secure | ✅ Allowed | ⛔ Blocked |
之前跨协议的POST
请求是能够携带设为SameSite=Lax
或SameSite=Strict
的cookies
。
如今只有设置为SameSite=None
的cookies
能够在表单请求时被发送。
HTTP → HTTPS | HTTPS → HTTP | |
---|---|---|
SameSite=Strict | ⛔ Blocked | ⛔ Blocked |
SameSite=Lax | ⛔ Blocked | ⛔ Blocked |
SameSite=None;Secure | ✅ Allowed | ⛔ Blocked |
Chrome
和Firefox
上的开发者工具都已经支持相关配置,而且会在控制台给出提示。
Chrome 86
版本开始,DevTools->Issue
显示关于Schemeful Same-Site
的高亮提示。
Navigation issues
:
子资源加载issues
:
详情能够阅读 Testing and Debugging Tips for Schemeful Same-Site。
Firefox
79版本开始,network.cookie.sameSite.schemeful
设置为true
后,控制台也会呈现相关信息:
HTTPS
,为何还会看到issues
?极可能是网页内的一些连接或资源仍是指向不安全的地址。
其中一个解决办法就是使用 HTTP Strict-Transport-Security (HSTS) + includeSubDomain
。
使用 HSTS
+ includeSubDomain
方案以后,即使你的页面里还存在不安全的连接,浏览器会自动替换安全的协议访问。
能够调整SameSite
的设置,放宽限制。
SameSite=Strict
的cookies
被阻止时,你能够调整为SameSite=Lax
Strict
或Lax
的cookies
均被阻止,同时cookies
是发送到安全URL
的,把设置为None
后就能够生效。cookies
没有设置SameSite
属性?没有SameSite
属性的cookies
,会被当成SameSite=Lax
处理。
Same-site:
wss://
connection from https://
ws://
connection from http://
Cross-site:
wss://
connection from http://
ws://
connection from https://
本文主要内容来自:Schemeful Same-Site
关注公众号:湖中剑,找到更多关于个人内容。