将一个域下的cookie传到另一个域_单点登录那些事儿(二)同域下的单点登录
單點登錄(SSO,Single Sign On)對我們來說已經不陌生了,一次登錄,處處登錄。企業旗下都是自己的應用系統,所有的應用系統都使用同一個一級域名,通過不同的二級域名來區分應用系統。例如:百度,百度下面有很多子系統——百度文本庫、百度知道等。在我們的體驗中,登錄了百度帳號,其他子應用系統也就隨之登錄了。這次,讓我們了解下背后實現原理--同域下的單點登錄。
同域 SSO 原理設計
同域 SSO 原理分析
HTTP 協議是無狀態的,單個系統的會話由服務端 Session 進行維持,Session 保持會話的原理是通過給瀏覽器返回 Set-Cookie 請求頭,瀏覽器收到后把包含 Sessionid 的 Cookie 寫入瀏覽器,每次訪問都會自動攜帶該站點下的 Cookie,在服務端讀取其中的 Sessionid 進行驗證,實現會話保持。通過巧用 Cookie 頂域的特性和 Session 共享,可以實現同域下的多個系統登錄認證,也就是同域下的單點登錄。
Session-Cookie 機制
服務端通過 Cookie 認證客戶端。
用戶在第一次登錄后,服務端將返回一個 Cookie 給客戶端(這個 Cookie 包含 Sessionid),用戶下一次發起請求后將在 header 帶上這個 Cookie,服務端便可以識別出具體的客戶端。
Spring-Session 共享
解決同域下集群 Session 共享的問題。當服務端為集群而不是單點的時候,需要集群服務器之間的 Session 共享才能實現 Session-Cookie 機制的同域 SSO。
實現方式:通過過濾器攔擊請求,獲取 Session 數據并保存到數據庫(Session 持久化),之后 Session 數據將統一從數據庫中獲取。
同域 SSO 驗證方式
同一個域名下的不同站點是如何進行驗證
根據瀏覽器的 Cookie 同源規則,兩個站點是可以共享 Cookie 的,前提是這兩個站點在同一個域名(或者二級域名)下。
這種同域下的 Cookie,瀏覽器會將 Cookie 以及 Cookie 所屬的域存在本地。當對該域下的任何子站點進行訪問的時候,瀏覽器會將這些 Cookie 發送給站點系統。
假設:我們有兩個站點 www.authing.com/site1,www.authing.com/site2 。這兩個站點共享同一個主機地址,并且二者在同一域名下。
當瀏覽器端存儲的 Cookie 的域是 www.authing.com 的時候,site1 和 site2 兩個站點是同屬于該域的。所以對于該域下的 Cookie,兩個站點都可以得到。只要它們的 Session 信息是保存在同一個地方即可。
同一個域名下不同的子域如何進行驗證
假設:我們的站點是按照下面的域名進行部署的 sub1.auhting.com, sub2.authing.com, 這兩個站點共享同一域 authing.com。
默認情況下,瀏覽器會發送給 Cookie 所屬域所對應的主機。也就是說,sub1.auhting.com, sub2.authing.com 的 Cookie 的默認所屬域是不同的,因此我們需要在服務端通過設置 Cookie domain 來進行處理。
當然,登錄 sub2.authing.com 的方式也是相同的。經過上面的步驟就可以實現不同二級域名的單點登錄了。
百度系列應用的單點登錄
下面我們通過一個具體的例子來體會一下同域下不同應用的單點登錄和單點登出,這次我們選擇了百度知道和百度網盤。
我們登錄百度網盤,百度會將共享登錄狀態的 Cookie 寫入到了 .baidu.com 域名之下,然后我們刷新百度知道,網站變成了已登錄狀態,便能在發出的第一個請求中查看到攜帶了 .baidu.com 域名下的 Cookie,百度也已經為我們返回的頁面上打印出了用戶名。
接下來我們刪除這兩個 Cookie:BDUSS、BDUSS_BFESS,然后切換到百度網盤并刷新頁面,系統顯示已經退出。服務器返回 HTTP 響應,通過 Set-Cookie Header 將 .baidu.com 下的兩個 Cookie 刪除,瀏覽器刪除 Cookie 后,同域下的其他網站也就單點退出了。
單點登錄機制已成為企業身份及訪問管理解決方案中不可或缺的組成部分。同域下的單點登錄,是單點登錄機制方面的一種常見的解決方案。下期,我們再聊聊跨域下的單點登錄,以及更多全方位的身份和訪問管理解決方案,請持續關注 Authing。
總結
以上是生活随笔為你收集整理的将一个域下的cookie传到另一个域_单点登录那些事儿(二)同域下的单点登录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: request url换成ip地址_【协
- 下一篇: php 使用sendgrid api 发