面試官:說(shuō)說(shuō)SSO單點(diǎn)登錄的實(shí)現(xiàn)原理?
單點(diǎn)登錄(Single Sign-On, SSO)是一種讓用戶(hù)在多個(gè)應(yīng)用系統(tǒng)之間只需登錄一次就可以訪問(wèn)所有授權(quán)系統(tǒng)的機(jī)制。單點(diǎn)登錄主要目的是為了提高用戶(hù)體驗(yàn)并簡(jiǎn)化安全管理。
舉個(gè)例子,您在一個(gè)大型企業(yè)工作,該企業(yè)擁有一套由多個(gè)獨(dú)立應(yīng)用程序組成的生態(tài)系統(tǒng),例如:內(nèi)部郵箱系統(tǒng)、項(xiàng)目管理系統(tǒng)、員工自助服務(wù)系統(tǒng)、人力資源信息系統(tǒng)等。
而這些系統(tǒng)在沒(méi)有實(shí)施單點(diǎn)登錄的情況下會(huì)出現(xiàn)以下問(wèn)題:
用戶(hù)體驗(yàn)方面: 每天開(kāi)始工作時(shí),員工需要分別登錄每一個(gè)系統(tǒng)才能正常開(kāi)展工作,這不僅耗時(shí),而且容易造成密碼疲勞,即頻繁記憶和輸入不同系統(tǒng)的登錄憑證,降低了工作效率。舉例:?jiǎn)T工小王每天上班要先登錄內(nèi)部郵箱查看重要通知,然后切換至項(xiàng)目管理系統(tǒng)更新進(jìn)度,接著進(jìn)入人力資源信息系統(tǒng)查看工資單。如果沒(méi)有 SSO,他需要在每個(gè)系統(tǒng)單獨(dú)輸入用戶(hù)名和密碼。
安全管理方面: 各個(gè)系統(tǒng)間的密碼策略可能不一致,員工可能會(huì)因?yàn)殡y以記憶而在多個(gè)系統(tǒng)使用同一密碼,增加了數(shù)據(jù)泄露的風(fēng)險(xiǎn)。同時(shí),管理員對(duì)用戶(hù)賬戶(hù)的管理、權(quán)限變更及審計(jì)也會(huì)變得復(fù)雜。舉例:若小王在每個(gè)系統(tǒng)使用相同密碼,一旦某一系統(tǒng)存在安全隱患導(dǎo)致密碼泄露,攻擊者就有可能借此嘗試登錄其他系統(tǒng)。而有了 SSO,管理員只需在一處更改或撤銷(xiāo)小王的登錄權(quán)限,就能影響所有相關(guān)系統(tǒng)。
采用單點(diǎn)登錄后,小王只需在一天開(kāi)始時(shí)登錄一次,之后訪問(wèn)其他所有系統(tǒng)時(shí)都將自動(dòng)識(shí)別其身份并授權(quán)訪問(wèn),無(wú)需再次驗(yàn)證。這樣既減少了用戶(hù)登錄負(fù)擔(dān),又提高了安全性,因?yàn)楣芾韱T可以通過(guò)統(tǒng)一的入口更有效地執(zhí)行身份驗(yàn)證、授權(quán)以及審計(jì)策略。同時(shí),SSO 還可以配合多因素認(rèn)證(MFA)等增強(qiáng)措施,進(jìn)一步提升整個(gè)系統(tǒng)的安全級(jí)別。
1.單點(diǎn)登錄實(shí)現(xiàn)原理
單點(diǎn)登錄是在用戶(hù)登錄一個(gè)業(yè)務(wù)系統(tǒng)時(shí),先將登錄信息發(fā)送至單獨(dú)的 SSO 服務(wù)器進(jìn)行認(rèn)證,如果認(rèn)證成功則向該應(yīng)用程序或系統(tǒng)發(fā)送授權(quán)令牌,之后該用戶(hù)就可以使用授權(quán)令牌完成登錄并操作所有系統(tǒng)了。
單獨(dú)登錄通常的操作流程是這樣的:
用戶(hù)認(rèn)證:
- 用戶(hù)首先訪問(wèn)一個(gè)系統(tǒng),輸入用戶(hù)名和密碼進(jìn)行登錄。
- 登錄請(qǐng)求被發(fā)送到專(zhuān)門(mén)的認(rèn)證中心(Authentication Server)。
- 認(rèn)證中心驗(yàn)證用戶(hù)的身份信息,如果驗(yàn)證成功,則生成一個(gè)安全令牌(如 JWT、Ticket 等)。
令牌發(fā)放與傳遞:
認(rèn)證中心將令牌返回給用戶(hù)首次登錄的應(yīng)用系統(tǒng)。
應(yīng)用系統(tǒng)將令牌存儲(chǔ)在用戶(hù)的本地會(huì)話(如瀏覽器的 Cookie)中。
- 當(dāng)用戶(hù)訪問(wèn)其他需要 SSO 支持的應(yīng)用系統(tǒng)時(shí),瀏覽器會(huì)攜帶令牌自動(dòng)發(fā)送給目標(biāo)系統(tǒng)。
令牌驗(yàn)證與授權(quán):
目標(biāo)系統(tǒng)接收到請(qǐng)求后,發(fā)現(xiàn)攜帶了令牌,則將令牌發(fā)送給認(rèn)證中心進(jìn)行驗(yàn)證。
認(rèn)證中心驗(yàn)證令牌的有效性(包括簽名、有效期等)。
- 如果令牌有效,認(rèn)證中心會(huì)返回一個(gè)確認(rèn)信息給目標(biāo)系統(tǒng),證明用戶(hù)已通過(guò)認(rèn)證。
資源共享與授權(quán):
目標(biāo)系統(tǒng)接收到認(rèn)證中心的確認(rèn)后,允許用戶(hù)訪問(wèn)系統(tǒng)資源,而無(wú)需再次登錄。
- 目標(biāo)系統(tǒng)可以依據(jù)令牌中的信息進(jìn)行權(quán)限控制和角色映射。
會(huì)話管理:
為了保證安全性,一般會(huì)設(shè)置令牌的有效期,過(guò)了有效期后需要重新認(rèn)證。
在某些實(shí)現(xiàn)中,當(dāng)用戶(hù)在一個(gè)子系統(tǒng)中注銷(xiāo)時(shí),會(huì)通知認(rèn)證中心撤銷(xiāo)所有關(guān)聯(lián)令牌,從而實(shí)現(xiàn)全局注銷(xiāo),保證了其他系統(tǒng)也無(wú)法繼續(xù)使用過(guò)期的認(rèn)證信息。
在技術(shù)實(shí)現(xiàn)上,單點(diǎn)登錄可以借助如 CAS(Central Authentication Service)、OAuth、OpenID Connect 等標(biāo)準(zhǔn)協(xié)議,也可以基于企業(yè)內(nèi)部的自定義協(xié)議實(shí)現(xiàn)。在整個(gè)流程中,關(guān)鍵是要維護(hù)一個(gè)全局認(rèn)可的信任票證(token),并通過(guò)集中式的認(rèn)證服務(wù)中心來(lái)進(jìn)行身份的統(tǒng)一管理和驗(yàn)證。
2.單點(diǎn)登錄實(shí)現(xiàn)
在 Java 項(xiàng)目中,實(shí)現(xiàn)單點(diǎn)登錄(SSO)的方案主要有以下幾種:
OAuth2 + JWT(JSON Web Tokens)方案:OAuth2 是一個(gè)開(kāi)放標(biāo)準(zhǔn),允許用戶(hù)授權(quán)第三方應(yīng)用訪問(wèn)他們?cè)诜?wù)提供商處存儲(chǔ)的特定信息,而不需要將用戶(hù)名和密碼提供給第三方應(yīng)用。JWT 是一種用于身份驗(yàn)證和授權(quán)的令牌,通常與 OAuth2 一起使用。在 Spring Boot 中,你可以使用 Spring Security OAuth2 和 JWT 庫(kù)來(lái)實(shí)現(xiàn)這種方案。
CAS(Central Authentication Service)單點(diǎn)登錄方案:CAS 是一個(gè)開(kāi)源的、用于企業(yè)級(jí)的單點(diǎn)登錄解決方案。它提供了一套服務(wù)端和客戶(hù)端的組件,使得在多個(gè)應(yīng)用之間實(shí)現(xiàn)單點(diǎn)登錄變得簡(jiǎn)單。在 Spring Boot 中,你可以使用 Spring Security CAS 客戶(hù)端來(lái)實(shí)現(xiàn)這種方案。
Spring Security + OAuth2:Spring Security 是一個(gè)提供身份驗(yàn)證和授權(quán)功能的框架,它可以與 OAuth2 一起使用來(lái)實(shí)現(xiàn)單點(diǎn)登錄。在這種方案中,你可以使用 Spring Security 來(lái)處理用戶(hù)的身份驗(yàn)證和授權(quán),然后使用 OAuth2 來(lái)管理用戶(hù)在多個(gè)應(yīng)用之間的訪問(wèn)。
Spring Session:Spring Session 是一個(gè)用于管理用戶(hù)會(huì)話的框架,它可以幫助你在多個(gè)應(yīng)用之間共享會(huì)話信息,從而實(shí)現(xiàn)單點(diǎn)登錄。你可以使用 Spring Session 來(lái)將會(huì)話信息存儲(chǔ)在共享的地方(如 Redis),然后在每個(gè)應(yīng)用中通過(guò) Spring Session 來(lái)訪問(wèn)這些會(huì)話信息。
其中,OAuth2 + JWT 方案適合于需要對(duì)外提供 API 接口的應(yīng)用,而 CAS 方案則更適合于內(nèi)部系統(tǒng)之間的單點(diǎn)登錄。Spring Security + OAuth2 方案則是一種比較通用的選擇,既可以處理內(nèi)部系統(tǒng)的單點(diǎn)登錄,也可以處理對(duì)外提供 API 接口的情況。Spring Session 方案則更適合于需要將會(huì)話信息共享到多個(gè)應(yīng)用之間的場(chǎng)景,它也是最早和最簡(jiǎn)單的單點(diǎn)登錄實(shí)現(xiàn)方式。
3.SSO 和 OAuth2 有什么區(qū)別?
SSO 和 OAuth2 都是用于管理用戶(hù)身份驗(yàn)證和授權(quán)的協(xié)議,但它們的目標(biāo)和應(yīng)用場(chǎng)景有所不同,具體區(qū)別如下:
目標(biāo):
- SSO 的主要目標(biāo)是簡(jiǎn)化用戶(hù)在多個(gè)應(yīng)用系統(tǒng)中的登錄流程,讓用戶(hù)只需要登錄一次就可以訪問(wèn)所有授權(quán)的應(yīng)用系統(tǒng),提高用戶(hù)體驗(yàn)和效率。
- OAuth2 的主要目標(biāo)是允許第三方應(yīng)用代表用戶(hù)獲得訪問(wèn)特定資源的權(quán)限,同時(shí)保護(hù)用戶(hù)的敏感信息(如密碼)不被泄露。
應(yīng)用場(chǎng)景:
- SSO 通常用于大型企業(yè)內(nèi)部或相關(guān)聯(lián)的系統(tǒng)之間,用戶(hù)只需要在一個(gè)地方(如企業(yè)門(mén)戶(hù))進(jìn)行登錄,就可以訪問(wèn)多個(gè)內(nèi)部系統(tǒng)。
- OAuth2 廣泛應(yīng)用于第三方應(yīng)用需要訪問(wèn)用戶(hù)存儲(chǔ)在服務(wù)提供商(如 Google、Facebook)中的資源時(shí),用戶(hù)授權(quán)第三方應(yīng)用訪問(wèn)其資源,而無(wú)需將用戶(hù)名和密碼直接提供給第三方應(yīng)用。
實(shí)現(xiàn)方式:
- SSO 的實(shí)現(xiàn)通常依賴(lài)于一個(gè)集中的認(rèn)證中心(Authentication Server),用戶(hù)在這個(gè)中心進(jìn)行登錄,并獲得一個(gè)全局會(huì)話或令牌(Token),然后在訪問(wèn)其他應(yīng)用系統(tǒng)時(shí),這個(gè)令牌會(huì)被用來(lái)驗(yàn)證用戶(hù)的身份和權(quán)限。
- OAuth2 的實(shí)現(xiàn)涉及四個(gè)角色:資源所有者(Resource Owner)、授權(quán)服務(wù)器(Authorization Server)、客戶(hù)端(Client)和資源服務(wù)器(Resource Server)。用戶(hù)(資源所有者)授權(quán)客戶(hù)端訪問(wèn)其資源,授權(quán)服務(wù)器頒發(fā)訪問(wèn)令牌給客戶(hù)端,客戶(hù)端使用這個(gè)令牌訪問(wèn)資源服務(wù)器上的資源。
PS:SSO 和 OAuth2 都是用于管理用戶(hù)身份驗(yàn)證和授權(quán)的協(xié)議,但 SSO 更注重于簡(jiǎn)化用戶(hù)在多個(gè)應(yīng)用系統(tǒng)中的登錄流程,而 OAuth2更 注重于保護(hù)用戶(hù)的敏感信息,并允許第三方應(yīng)用代表用戶(hù)訪問(wèn)特定資源。在實(shí)際應(yīng)用中,它們可以相互結(jié)合使用,例如使用 OAuth2 來(lái)實(shí)現(xiàn) SSO 中的令牌頒發(fā)和驗(yàn)證過(guò)程。
課后思考
說(shuō)說(shuō) OAuth2 的實(shí)現(xiàn)原理?它有幾種授權(quán)模式?OAuth2 常用框架有哪些?它們有什么區(qū)別?