單點登陸之session跨域問題

2021-05-27 09:42:42 字數 1501 閱讀 8212

session主要分兩部分:

乙個是session資料,該資料預設情況下是存放在伺服器的tmp檔案下的,是以檔案形式存在,而非儲存在伺服器的記憶體中;

另乙個是標誌著session資料的session id,session id,就是那個 session 檔案的檔名,session id 是隨機生成的,因此能保證唯一性和隨機性,確保 session 的安全。一般如果沒有設定 session 的生存週期,則 session id 儲存在記憶體中,關閉瀏覽器後該 id 自動登出,重新請求該頁面後,重新註冊乙個 session id。如果客戶端沒有禁用 cookie,則 cookie 在啟動 session 會話的時候扮演的是儲存 session id 和 session 生存期的角色。

兩個不同的網域名稱**,想用同乙個session,就是牽扯到session跨域問題!

通過了解 session 的工作原理,我們可以發現,在預設情況下,各個伺服器會各自分別對同乙個客戶端產生 sessionid,如對於同乙個使用者瀏覽器,a 伺服器產生的 session id 是 30de1e9de3192ba6ce2992d27a1b6a0a,而b 伺服器生成的則是 c72665af28a8b14c0fe11afe3b59b51b。另外,php 的 session資料都是分別儲存在本伺服器的檔案系統中。想要共享 session 資料,那就必須實現兩個目標:

乙個是各個伺服器對同乙個客戶端產生的session id 必須相同,並且可通過同乙個 cookie 進行傳遞,也就是說各個伺服器必須可以讀取同乙個名為 phpsessid 的cookie;另乙個是 session 資料的儲存方式/位置必須保證各個伺服器都能夠訪問到。這兩個目標簡單地說就是多伺服器(a、b伺服器)共享客戶端的 session id,同時還必須共享伺服器端的 session 資料。

第乙個目標的實現其實很簡單,只需要對 cookie 的域(domain)進行特殊地設定即可(setcookie()函式中的第4個引數),預設情況下,cookie 的域是當前伺服器的網域名稱/ip 位址,而域不同的話,各個伺服器所設定的 cookie 是不能相互訪問的,如 www.aaa.com的伺服器是不能讀寫 www.bbb.com伺服器設定的 cookie 的。這裡我們所說的同一**的伺服器有其特殊性,那就是他們同屬於同乙個一級域,如:aaa.cocoglp.com 和www.cocoglp.com 都屬於域 .cocoglp.com,那麼我們就可以設定 cookie 的域為 .cocoglp.com,這樣 aaa.cocoglp.com、www.cocoglp.com等等都可以訪問此cookie。這樣各個伺服器共享同一客戶端 session id 的目的就達到了。

第二個目標的實現可以使用資料庫來儲存session 資料,這樣各個伺服器就可以方便地訪問同乙個資料來源,獲取相同的session 資料了;或者是通過檔案共享方式,如 nfs 方式,但設定、操作上有些複雜。

如果用資料庫儲存session資料的話,可能會有遺留問題,就是如果**的訪問量很大的話,session 的讀寫會頻繁地對資料庫進行操作,這樣效率就會明顯降低,好像這裡就可以用到c來寫段程式存放session在記憶體中,而不必每次運算元據庫了....

單點登陸 單點登陸設計

1單點登入基本流程場景1 使用者未登入情況下訪問受限資源 例如 使用者在站點a 登入成功了,這時候使用者再去訪問站點 下的受限資源。private a.do 由於使用者在站點a登入了,那麼在 x.com 域下一定存在authid的cookie,並且redis中一定儲存了使用者的登入資訊。當使用者訪問...

SSO 單點登陸

1.單點登陸概述 單點登入 single sign on 簡稱為 sso,是目前比較流行的企業業務整合的解決方案之一。sso的定義是在多個應用系統中,使用者只需要登入一次就可以訪問所有相互信任的應用系統。很早期的公司,一家公司可能只有乙個server,慢慢的server開始變多了。每個server都...

單點登陸問題

單點登入 單點登入 sso,single sign on 是一種方便使用者訪問多個系統的技術,使用者只需在登入時進行一次註冊,就可以在多個系統間自由穿梭,不必重複輸入使用者名稱和密碼來確定身份。單點登入的實質就是安全上下文 security context 或憑證 credential 在多個應用系...