深入研究HTTP跨站請求

背景

Chrome瀏覽器升級到80以后铺坞,對屬性SameSite的默認值從None改為了Lax,從而導致我們的個別線上應用突然間拉胯了棒厘。

為什么該改動會影響線上系統(tǒng)呢檩互,在此得先描述一下受影響應用的特點:

三方系統(tǒng)引入,我們當時采用的Iframe方案蓖柔,也就是在系統(tǒng)A(a.xx.cn)中的頁面通過Iframe加載系統(tǒng)B(b.com.cn)辰企。

異常原因

經過分析后發(fā)現(xiàn),內嵌的系統(tǒng)B無法讀取自己設置的Cookie况鸣,導致一系列的問題牢贸。

是不是很奇怪,系統(tǒng)B自己設置的Cookie镐捧,自己讀不了十减。

Why?

在分析前愤估,首先我們得先了解一下帮辟,屬性SameSite的含義:

image

簡單來說,SameSite是響應頭的一個屬性玩焰,它的值會決定跨站訪問的時候是否允許發(fā)送Cookie由驹。SameSite的值有三個:Strict,Lax昔园,None蔓榄。

  • Strict:

    最為嚴格,跨站訪問的時候默刚,完全不允許發(fā)送Cookie

  • Lax:

    規(guī)則稍微放松甥郑,跨站訪問的時候,鏈接荤西,預加載請求澜搅,GET表單可以發(fā)送Cookie

  • None:

    不限制伍俘,跨站訪問的時候都可以發(fā)送Cookie

請注意,我們在描述的時候勉躺,一直都加前綴“跨站訪問的時候”癌瘾,那什么是跨站?很多人會和跨域混淆饵溅,它倆在定義上是不同的妨退。

  • 跨域:

    非簡單請求,如果和請求目標在協(xié)議蜕企,域名咬荷,端口有一個不一樣,就認為是跨域轻掩。

  • 跨站:

    如果兩個站點萍丐,公共后綴(public suffix list)里的域名相同,并且再上一級也相同放典,就認為是同站逝变。反之就是跨站。

公共后綴(public suffix list)

是一份頂級域名列表奋构,最早是由Mozilla提出壳影,目前已經被主流瀏覽器采用。

舉個例子方便大家了解弥臼,下面兩個站點:a.teld.cn宴咧,b.teld.cn

  • 是跨域么?很明顯径缅,是跨域掺栅,因為域名不同。

  • 是跨站么纳猪?我們根據規(guī)則來看氧卧,公共后綴列表里,注冊的頂級域名是cn氏堤,cn前面一級是teld沙绝,都相同,所以不是跨站鼠锈。公共后綴有一份列表闪檬,大家可以自行搜索查看。

好购笆,目前為止粗悯,我們已經弄清楚跨域和跨站的區(qū)別。而屬性SameSite只是影響跨站訪問的情況同欠。我們再回過頭看第一句話“Chrome瀏覽器升級到80以后样傍,對屬性SameSite的默認值從None改為了Lax

那80版本以前是什么樣呢横缔?

80以前,SameSite的默認值是None铭乾,也就是說我們在跨站訪問的時候剪廉,都可以發(fā)送Cookie娃循。下面舉個例子(聚焦前后端分離的場景炕檩,服務端寫Cookie,暫時忽略):

document.cookie = "test=1; Max-Age=2600000; "

80以前跨站的時候捌斧,寫讀很正常笛质。但80以后呢,SameSite的默認值改為了Lax捞蚂,那跨站的時候妇押,自然就讀不到了。

怎么解姓迅?第一想法就是把默認值設置成None(80以上版本要求設置None的時候敲霍,必須設置Secure)

document.cookie = "test=1; Max-Age=2600000; SameSite=None; Secure"

80以上版本是解決了,哪80版本以下呢丁存?這就不得不說一下兼容性問題肩杈,下面是谷歌的升級說明(點擊放大查看):

image

簡單來說就是:早期的版本并不能正確識別None,而且各個系統(tǒng)瀏覽器的行為還不一致解寝,有的會將SameSite=None的Cookie直接拒絕扩然,而有的就會解釋為SameSite=Strict,和我們的期望大相徑庭聋伦。

怎么解夫偶?目前通用的方案是多設置一個Cookie,如果Cookie讀寫方法封裝起來的話觉增,該操作對業(yè)務也是無感的兵拢,示例如下:

document.cookie = "test=1; Max-Age=2600000; SameSite=None; Secure"

多設置一個,當讀取的時候逾礁,先讀test卵佛,如果發(fā)現(xiàn)沒有再讀__test。

還有一種方案是通過UA檢測敞斋,進行瀏覽器黑名單的確認然后針對性處理截汪。雖然雙Cookie在資源上有浪費,但考慮到國內紛繁復雜的瀏覽器環(huán)境植捎,個人更推薦雙Cookie的解決方案衙解。

到這里問題結束了么?

  • 如果系統(tǒng)是Windows焰枢,問題結束了

  • 如果系統(tǒng)是Android蚓峦,問題結束了

  • 如果系統(tǒng)是IOS或iPadOS舌剂,并且使用的Safari,那么尷尬依舊存在

因為從iOS 和 iPadOS 13.4 開始暑椰,Safari增加了智能反追蹤功能霍转,如圖:

image

并且“阻止跨網站跟蹤”默認是開啟的,意思就是拒絕所有的跨站請求傳送Cookie一汽,可以理解為設置SameSite=Strict避消,所以如果是ToC系統(tǒng),要考慮蘋果Safari用戶的話召夹,上述處理都有瑕疵岩喷。

總結

所以,跨站問題要處理到什么程度监憎,要結合自身系統(tǒng)特點來判斷纱意。比如:

  • 網站并不依賴Cookie,那么恭喜你鲸阔,跨站對你沒任何影響偷霉。

  • 少量依賴,看看是否可以考慮PostMessage的方式

  • 內部系統(tǒng)的話是否可以限制瀏覽器版本

  • 通過Nginx層面的域名處理褐筛,把跨站變?yōu)榉强缯?/p>

技術沒有銀彈类少,只要我們深入了解跨站請求的機制和原理,在合適的場景采用合適的技術策略死讹,跨站問題最終將迎刃而解瞒滴。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市赞警,隨后出現(xiàn)的幾起案子妓忍,更是在濱河造成了極大的恐慌,老刑警劉巖愧旦,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件世剖,死亡現(xiàn)場離奇詭異,居然都是意外死亡笤虫,警方通過查閱死者的電腦和手機旁瘫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來琼蚯,“玉大人酬凳,你說我怎么就攤上這事≡馐” “怎么了宁仔?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長峦睡。 經常有香客問我翎苫,道長权埠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任煎谍,我火速辦了婚禮攘蔽,結果婚禮上,老公的妹妹穿的比我還像新娘呐粘。我一直安慰自己满俗,他們只是感情好,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布事哭。 她就那樣靜靜地躺著漫雷,像睡著了一般瓜富。 火紅的嫁衣襯著肌膚如雪鳍咱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天与柑,我揣著相機與錄音谤辜,去河邊找鬼。 笑死价捧,一個胖子當著我的面吹牛丑念,可吹牛的內容都是我干的。 我是一名探鬼主播结蟋,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼脯倚,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了嵌屎?” 一聲冷哼從身側響起推正,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎宝惰,沒想到半個月后植榕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡尼夺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年尊残,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片淤堵。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡寝衫,死狀恐怖,靈堂內的尸體忽然破棺而出拐邪,到底是詐尸還是另有隱情慰毅,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布庙睡,位于F島的核電站事富,受9級特大地震影響技俐,放射性物質發(fā)生泄漏。R本人自食惡果不足惜统台,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一雕擂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧贱勃,春花似錦井赌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至戚绕,卻和暖如春纹坐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背舞丛。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工耘子, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人球切。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓谷誓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親吨凑。 傳聞我的和親對象是個殘疾皇子捍歪,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內容