Cookie的secure屬性引起循環(huán)登錄問題分析及解決方案

作者:來自 vivo 互聯(lián)網(wǎng)服務(wù)器團隊- Wang Fei

單點登錄作為公共組件,在各個公司內(nèi)部被各個系統(tǒng)所廣泛使用瑞眼,但是在使用過程中我們會遇到各種各樣的問題,其中循環(huán)登錄問題就是一個比較經(jīng)典的問題肩杈。本文主要分析單點登錄和權(quán)限系統(tǒng)設(shè)計的基本原理祠斧,然后結(jié)合實際案例來分析循環(huán)登錄的原因速缆,并給出具體的解決辦法规哪。

一烁落、單點登錄簡單介紹

1.1 基本概念

一個公司內(nèi)部可能存在多個系統(tǒng)鸟蜡,如果每一個人在使用不同系統(tǒng)的時候都需要重新登錄膜赃,那么會做大量系統(tǒng)登錄切換、耗費比較多的精力去管理賬號和密碼揉忘,那么有沒有辦法在一個公司內(nèi)部的所有系統(tǒng)只需要一次登錄驗證跳座,后續(xù)使用其他系統(tǒng)的時候不用重復(fù)登錄就可以直接使用呢,這就是單點登錄要解決的問題癌淮。

單點登錄英文全稱 Single Sign On(SSO)躺坟,允許用戶一次登錄即可訪問多個應(yīng)用程序或系統(tǒng),無需為每個應(yīng)用程序或系統(tǒng)分別輸入認證憑據(jù)乳蓄,便可在其他所有系統(tǒng)中得到授權(quán)咪橙,無需再次登錄。

圖1.png

1.2 基本實現(xiàn)原理

圖2.png
  • 用戶登錄:用戶在任何一個應(yīng)用程序或系統(tǒng)中進行身份驗證虚倒,并提供他們的憑據(jù)美侦。
  • 認證系統(tǒng)驗證:該憑據(jù)被發(fā)送到認證系統(tǒng)進行驗證。如果憑據(jù)有效魂奥,則認證系統(tǒng)會為用戶生成數(shù)字簽名的令牌(如 Token 或 Ticket)菠剩。
  • 令牌分發(fā):認證系統(tǒng)將令牌返回給應(yīng)用程序或子系統(tǒng)。
  • 應(yīng)用程序或系統(tǒng)授權(quán):應(yīng)用程序或系統(tǒng)使用令牌驗證用戶的身份耻煤,并授權(quán)其訪問相應(yīng)資源或服務(wù)具壮。
  • 跨域系統(tǒng)訪問:用戶可以通過同一令牌訪問多個跨域應(yīng)用程序或系統(tǒng)准颓,而無需重復(fù)進行身份驗證。

二棺妓、循環(huán)登錄問題

在某一天我們登錄一個內(nèi)部系統(tǒng)時攘已,突然出現(xiàn)了循環(huán)登錄問題,前端頁面不斷刷新怜跑,提示“重定向次數(shù)過多問題”样勃。


圖3.png

打開前端調(diào)試功能, 我們會發(fā)現(xiàn)確實存在大量重定向請求的問題:

圖4.png

那么平時登錄沒問題的系統(tǒng)為什么突然間就循環(huán)登錄呢?并在頁面上提示的解決方法“嘗試刪除您的 Cookie 操作”性芬,按照這個操作以后峡眶,確實系統(tǒng)又可以跳轉(zhuǎn)到登錄頁面正常進行登錄了,這又是什么原因植锉?下面我們將逐一分析辫樱。

三、從一次正常登錄流程說起

圖5.png

上述是一個通用的系統(tǒng)權(quán)限管控和單點系統(tǒng)認證的標準流程:

  • 用戶第一次訪問時汽煮,在瀏覽器輸入 https://aaa.x.y 回車
  • 權(quán)限系統(tǒng)進行攔截搏熄,判斷用戶是否登錄,這里主要是通過是否有登錄信息判斷暇赤,如果沒有登錄心例,權(quán)限系統(tǒng)會幫我們跳轉(zhuǎn)到單點登錄系統(tǒng),彈出用戶登錄頁鞋囊。
  • 用戶填寫用戶名止后、密碼,單點登錄系統(tǒng)進行認證后溜腐,將登錄狀態(tài)寫入 SSO 的 session译株。
  • SSO 系統(tǒng)登錄完成后會給我們的系統(tǒng)生成一個 Token ,然后跳轉(zhuǎn)到我們的系統(tǒng)挺益,同時將 Token 作為參數(shù)傳遞給我們的系統(tǒng)歉糜。
  • 我們系統(tǒng)拿到 Token 后,從后臺向 SSO 發(fā)送請求望众,驗證 Token 是否有效匪补。
  • 驗證通過后,我們系統(tǒng)將記錄頂級域下的 Cookie 信息烂翰。
Connection: keep-alive
Content-Length: 0
Date: Wed, 25 Oct 2023 08:29:43 GMT
Location: http://aaa.x.y/console/login/auth?redirectUrl=http://aaa.x.y/
optrace: xx.xx.xx.xx:80/302 <- -
Server: nginx
Set-Cookie: token=fakdfajdfdjfdjkfaldfjk'afafjasfasfa; Max-Age=86400; Expires=Thu, 26-Oct-2023 08:29:43 GMT; Domain=x.y; Path=/; HttpOnly

一個公司內(nèi)部一般情況下只有一個域名夯缺,通過二級域名區(qū)分不同的系統(tǒng)。比如我們有個域名叫做:x.y 甘耿,同時有兩個業(yè)務(wù)系統(tǒng)分別為:app1.x.y 和 app2.x.y踊兜。SSO 登錄以后,可以將 Cookie 的域設(shè)置為頂域佳恬,即 x.y 捏境,這樣所有子域的系統(tǒng)都可以訪問到頂域的 Cookie于游,實現(xiàn)單點登錄功能。

圖6.png

四典蝌、循環(huán)登錄產(chǎn)生的根本原因

那么為什么會不斷循環(huán)登錄呢曙砂?

(1)從跳轉(zhuǎn)記錄來看,我們發(fā)現(xiàn)重新刷新頁面以后骏掀,重定向到了權(quán)限系統(tǒng),并且 Request Headers 中的 Cookie 信息沒有傳對應(yīng)的 Token 信息柱告。

圖7.png

(2)跳轉(zhuǎn)到權(quán)限系統(tǒng)過后截驮,再跳轉(zhuǎn)到本系統(tǒng)的時候,已經(jīng)獲取到了對應(yīng)的 Token 信息际度,但是在 Set-Cookie 信息的時候葵袭,出現(xiàn)了一個警告。

圖8.png

警告的具體內(nèi)容為:

警告內(nèi)容.jpg

大致意思是:這次執(zhí)行 Set-Cookie 操作被阻止了乖菱,原因是這個 Cookie 不是通過安全的連接進行傳輸?shù)钠挛覀冞@次訪問確實使用了 HTTP 進行,本應(yīng)該通過設(shè)置 Secure 屬性來覆蓋對應(yīng)的 Cookie窒所。

這里的 Secure 屬性是 Cookie 的一個屬性鹉勒,Secure 屬性是說如果一個 Cookie 被設(shè)置了 Secure = true,那么這個 Cookie 只能用 HTTPS 協(xié)議發(fā)送給服務(wù)器吵取,用 HTTP 協(xié)議是不發(fā)送的禽额,而我們查看上面標注位置的下一個 Login 請求確實沒有傳 Cookie 信息,從而繼續(xù)進行用戶是否登錄校驗皮官,進入死循環(huán)過程脯倒, 可以看下面的示意圖:

圖9.png

五、清除瀏覽器緩存的底層原理及解決方法

5.1 清除瀏覽器緩存的底層原理

我們可以看到循環(huán)登錄以后捺氢,會在瀏覽器頁面上提示 xxx.x.y 重定向次數(shù)過多藻丢,嘗試清除 Cookie 信息,那清除 Cookie 信息以后摄乒,是不是真的就可以解決這個問題呢悠反,我們嘗試著清除瀏覽器緩存,確實可以解決這個問題缺狠,那清除瀏覽器緩存來解決循環(huán)登錄問題的底層原理是什么呢问慎,其實質(zhì)就是將 Cookie 刪除,其他域名設(shè)置 Cookie 上的 Secure 屬性也就一并刪除了挤茄,從而使用 HTTP 域名進入重新登錄流程如叼,可以正常設(shè)置 Cookie 信息。

5.2 其他解決辦法

方法一:使用 HTTPS 的方式進行訪問
現(xiàn)實使用中穷劈,我們無法控制其他 HTTPS 訪問的具有相同頂級域名的服務(wù)不去設(shè)置 Cookie 的 Secure 屬性笼恰,因而我們在后面使用的過程中還是會遇到這個問題踊沸,那么有沒有一種徹底的解決辦法能夠避免這個問題再次出現(xiàn),我們前面已經(jīng)分析社证,之所以我們在開始使用 HTTP 能夠進行正常訪問逼龟,然后突然間不能正常訪問了,就是因為已經(jīng)被 HTTPS 設(shè)置了的 Cookie 信息是無法被 HTTP 重新設(shè)置的追葡,從而拿不到 Cookie 信息腺律。那么就出現(xiàn)了第一種解決辦法,使用 HTTPS 的方式進行訪問宜肉,即使其他服務(wù)設(shè)置了 Cookie 的 Secure 屬性匀钧,用 HTTPS 仍然能夠成功設(shè)置 Cookie 和獲取 Cookie。

方法二:在 Cookie 信息中新設(shè)置一個 newToken
以上從 HTTP 轉(zhuǎn)為 HTTPS 訪問的方法在用戶主動找我們反饋時是能夠告訴它切換為 HTTPS 訪問的谬返,但是如果對于一些沒有主動找我們反饋的用戶之斯,其實是無法解決,可能喪失這個用戶造成用戶流失的情況遣铝,那么我們在用戶不進行切換的情況下是否能夠解決這個問題佑刷。

同一個公司內(nèi)部接入的權(quán)限系統(tǒng)是一種底層公共能力,為了保證單點登錄酿炸,其實用戶信息的讀取都是通過同一個 Cookie 參數(shù)(比如叫 Token )讀取的瘫絮,那么在其他域名設(shè)置了公共 Cookie 參數(shù)的 Secure 屬性而影響到 HTTP 登錄的時候,我們可以給服務(wù)新增加一個 Cookie 參數(shù) newToken 去解決梁沧。

六檀何、擴展: Cookie 的端口不隔離性

本文所闡述的問題,出現(xiàn)的背景是有兩個基本前提的:一是為了保證單點登錄廷支,兩個域名屬于同一個頂級域名频鉴,權(quán)限系統(tǒng)中關(guān)于用戶信息的校驗都是通過同一個 Cookie 屬性去讀取的;第二個是 HTTPS 設(shè)置了頂級域名的 Cookie 信息的 Secure 屬性恋拍,然后使用 HTTP 訪問會導(dǎo)致循環(huán)登錄垛孔。有些開發(fā)者可能會有這樣一個疑問,那就是 HTTPS 我們一般開通的端口是 443 施敢, HTTP 我們一般開通的端口是 8080 周荐,為啥不從端口上進行區(qū)分同一個 Cookie 屬性從而避免干擾呢?

這個在 Cookie 規(guī)范(RFC 6265)中有所描述僵娃,那就是 Cookie 不提供通過端口進行隔離的概作,也就是說如果一個 Cookie 可以被一臺服務(wù)器上的運行在某一個端口上的一個服務(wù)所讀取,那么也可以被這臺服務(wù)器上運行在另外一個端口上的服務(wù)所讀饶埂讯榕;如果一個 Cookie 可以被一臺服務(wù)器上的運行在某一個端口上的一個服務(wù)所寫入,那么也可以被這臺服務(wù)器上運行在另外一個端口上的服務(wù)所寫入。

七愚屁、總結(jié)

本文從實際開發(fā)過程中遇到的循環(huán)登錄問題入手济竹,分析了由于設(shè)置 Secure 屬性導(dǎo)致使用 HTTP 訪問網(wǎng)頁無法保存 Cookie 信息從而導(dǎo)致循環(huán)登錄的根本原因,也給出了其他兩個解決此種問題的方案霎槐,對于其他開發(fā)人員解決權(quán)限系統(tǒng)循環(huán)登錄問題具有一定的借鑒意義送浊。

參考資料:

單點登錄實現(xiàn)思路及方案
Sessions don't work in Chrome but do in IE
8.5. Weak Confidentiality

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市丘跌,隨后出現(xiàn)的幾起案子袭景,更是在濱河造成了極大的恐慌,老刑警劉巖碍岔,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浴讯,死亡現(xiàn)場離奇詭異,居然都是意外死亡蔼啦,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門仰猖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捏肢,“玉大人,你說我怎么就攤上這事饥侵⊥液眨” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵躏升,是天一觀的道長辩棒。 經(jīng)常有香客問我,道長膨疏,這世上最難降的妖魔是什么一睁? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮佃却,結(jié)果婚禮上者吁,老公的妹妹穿的比我還像新娘。我一直安慰自己饲帅,他們只是感情好复凳,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著灶泵,像睡著了一般育八。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赦邻,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天髓棋,我揣著相機與錄音,去河邊找鬼深纲。 笑死仲锄,一個胖子當著我的面吹牛劲妙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播儒喊,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼镣奋,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了怀愧?” 一聲冷哼從身側(cè)響起侨颈,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎芯义,沒想到半個月后哈垢,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡扛拨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年耘分,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绑警。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡求泰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出计盒,到底是詐尸還是另有隱情渴频,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布北启,位于F島的核電站卜朗,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏咕村。R本人自食惡果不足惜场钉,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望培廓。 院中可真熱鬧惹悄,春花似錦、人聲如沸肩钠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽价匠。三九已至当纱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間踩窖,已是汗流浹背坡氯。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人箫柳。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓手形,卻偏偏與公主長得像,于是被迫代替她去往敵國和親悯恍。 傳聞我的和親對象是個殘疾皇子库糠,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容