首先介紹下基本信息:公司的某個業務系統是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
關注公衆號:湖中劍,找到更多關於個人內容。