單點登錄原理介紹 - 邱乘屹的個人技術博客


單點登錄(Single Sign On),簡稱爲 SSO。SSO的定義是在多個應用系統中,用戶只需要登錄一次就可以訪問所有相互信任的應用系統。因在不同場景中使用的單點登錄方式不同,在此做一個記錄。

如何解決單點登陸

  1. Redis作爲緩存儲存session信息(cookie/session)
  2. JWT來解決單點登陸

使用cookie和session解決單點登陸

將Session存儲於Redis上,然後將整個系統的全局Cookie Domain設置於頂級域名上,這樣SessionID就能在各個子系統間共享。
在這裏插入圖片描述
redis存儲所有SessionID。每次做session驗證不再從本機對比session,而是將session放在redis裏統一管理。無論那臺服務器上存儲的session都放在redis中。那麼在判斷的時候都以redis裏的數據爲準,即可解決單點登陸問題

但是這個方案存在着嚴重的擴展性問題,首先,ASP.NET的Session存儲必須爲SessionStateItemCollection對象,而存儲的結構是經過序列化後經過加密存儲的。並且當用戶訪問應用時,他首先做的就是將存儲容器裏的所有內容全部取出,並且反序列化爲SessionStateItemCollection對象。這就決定了他具有以下約束:

Session中所涉及的類型必須是子系統中共同擁有的(即程序集、類型都需要一致),這導致Session的使用受到諸多限制;

跨頂級域名的情況完全無法處理;

使用JWT解決單點登陸

JWT優勢

因爲json的通用性,所以JWT是可以進行跨語言支持的,像JAVA,JavaScript,NodeJS,PHP等很多語言都可以使用。
因爲有了payload部分,所以JWT可以在自身存儲一些其他業務邏輯所必要的非敏感信息,因爲payload是可解密的。
便於傳輸,jwt的構成非常簡單,字節佔用很小,所以它是非常便於傳輸的。
它不需要在服務端保存會話信息, 所以它易於應用的擴展

JWT劣勢

保護好secret私鑰,該私鑰非常重要。如果泄露,任何人都可以僞造。
一旦token泄露,在有效期內任何人都可以使用該token進入系統,且不可撤回。

JWT安全要求

不應該在jwt的payload部分存放敏感信息,因爲該部分是客戶端可解密的部分。
如果可以,請使用https協議

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章