單點登入,實現登入狀態保持
單點登入
SSO,也就是單點登入bai(single sign-on),它是一種認證方法,要求使用者只登入一次
使用一個使用者ID和密碼,登入多個應用、系統或Web網站。而Open Group對單點登入的定義是“單點登入(SSO)是使用者認證和授權的單一行為可以允許一位使用者訪問他的訪問許可中包含的所有電腦和系統,而不要輸入多個密碼的機制。單點登入減少了人為錯誤,
這是系統失敗的重要因素,需求量很大,但很難實施。”
企業的單點登入(SSO)為終端使用者提供了改善使用者經驗,幫助IT員工減少管理大量應用上的密碼的成本。
方法一:cookie和session配合使用
首先,使用者登入輸入使用者名稱和密碼,瀏覽器傳送post
當用戶下一次發起請求時,瀏覽器會自動攜帶cookie去請求伺服器,伺服器識別後,通過裡面的sessionID,就可以直接讀取session中的使用者資訊。這樣,使用者就可以直接訪問,不需要再輸入使用者名稱和密碼來驗證身份。
缺點:
cookie
容易被修改,被劫持,並不是絕對的安全- 大型專案中,伺服器往往不止一臺
如果第一次請求,使用者資訊被儲存在伺服器1的session
空間裡。而第二次請求被分流到了伺服器2,這樣就獲取不到使用者資訊,依然要重新登入。
方法二:如果cookie被禁用了,怎麼保持登入狀態?
保持登入的關鍵不是cookie
,而是通過 cookie
儲存和傳輸的 sessionID
,其本質是能獲取使用者資訊的資料。除了 cookie
,還通常使用 HTTP
請求頭來傳輸,比如標準的Authorization
,也可以自定義,如 X-Auth-SessionID
等。但是這個請求頭瀏覽器不會像 cookie
一樣自動攜帶,需要手工處理。也可以進行url
地址重寫,將sessionID
追加在url
後面
注意:
前面的cookie
和session
這種模式,沒有分散式架構,無法支援橫向擴充套件。如果使用一個伺服器,該模式完全沒有問題。但是,如果它是伺服器群集或面向服務的跨域體系結構的話,則需要一個統一的session
方法三:JWT(JSON Web Token)
什麼是JWT?
JSON Web Token(JWT)
是一個開放式標準(RFC 7519),它定義了一種緊湊且自包含的方式,用於在各方之間以JSON
物件安全傳輸資訊。這些資訊可以通過數字簽名進行驗證和信任。可以使用祕鑰(使用HMAC
演算法)或使用RSA
的公鑰/私鑰對對JWT
進行簽名。
為什麼使用JWT?
隨著技術的發展,分散式web
應用的普及,通過session
管理使用者登入狀態成本越來越高,因此慢慢發展成為token
的方式做登入身份校驗,然後通過token
去取redis
中的快取的使用者資訊。隨著之後JWT
的出現,校驗方式更加簡單便捷化,無需通過redis
快取,而是直接根據token
取出儲存的使用者資訊,以及對token
可用性校驗,單點登入更為簡單。
JWT的優點:
- 體積小,因而傳輸速度更快
- 多樣化的傳輸方式,可以通過
URL
傳輸、POST
傳輸、請求頭Header
傳輸(常用) - 簡單方便,服務端拿到
jwt
後無需再次查詢資料庫校驗token
可用性,也無需進行redis
快取校驗 - 在分散式系統中,很好地解決了單點登入問題
- 很方便的解決了跨域授權問題,因為跨域無法共享
cookie
JWT的缺點:
- 因為
JWT
是無狀態的,因此服務端無法控制已經生成的Token
失效,這是不可控的 - 獲取到
JWT
也就擁有了登入許可權,因此JWT
是不可洩露的,網站最好使用https
,防止中間攻擊偷取JWT
實現方式:
JWT
的原則是在伺服器身份驗證之後,將生成一個JSON
物件並將其傳送回用戶;- 之後,當用戶與伺服器通訊時,客戶端在請求中發回
JSON
物件。伺服器僅依賴於這個JSON
物件來標識使用者。為了防止使用者篡改資料,伺服器將在生成物件時添加簽名 - 伺服器不儲存任何會話資料,即伺服器變為無狀態,使其更容易擴充套件。