国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

15158846557 在線咨詢 在線咨詢
15158846557 在線咨詢
所在位置: 首頁 > 營(yíng)銷資訊 > 網(wǎng)站運(yùn)營(yíng) > 大型網(wǎng)站的用戶登錄系統(tǒng)是如何設(shè)計(jì)的?

大型網(wǎng)站的用戶登錄系統(tǒng)是如何設(shè)計(jì)的?

時(shí)間:2024-02-13 17:50:01 | 來源:網(wǎng)站運(yùn)營(yíng)

時(shí)間:2024-02-13 17:50:01 來源:網(wǎng)站運(yùn)營(yíng)

大型網(wǎng)站的用戶登錄系統(tǒng)是如何設(shè)計(jì)的?:
原文首發(fā)自我的博客:分布式系統(tǒng)下的認(rèn)證與授權(quán)
在軟件系統(tǒng)設(shè)計(jì)中,如何讓應(yīng)用能夠在各種環(huán)境中安全高效的訪問是個(gè)復(fù)雜的問題,這個(gè)問題的背后是一系列軟件設(shè)計(jì)時(shí)需要考慮的架構(gòu)安全問題:架構(gòu)安全性 | 鳳凰架構(gòu)

在漫長(zhǎng)的架構(gòu)演進(jìn)歷史中,業(yè)界對(duì)這些問題已經(jīng)有很成熟的解決方案。在架構(gòu)安全這塊,最好的是遵循技術(shù)標(biāo)準(zhǔn)與最佳實(shí)踐,盡可能不重復(fù)造輪子或“創(chuàng)新”。下面這個(gè)思維導(dǎo)圖就是針對(duì)這些問題的常見的技術(shù)標(biāo)準(zhǔn)及方案:




在研究分布式系統(tǒng)的認(rèn)證和授權(quán)問題前,讓我們回到單體架構(gòu)的時(shí)代,看看在單體架構(gòu)上這些問題是如何被解決的。

單體系統(tǒng)

認(rèn)證

認(rèn)證主要解決 你是誰 的問題,從方式上來看有以下三種:認(rèn)證 | 鳳凰架構(gòu)

在單體系統(tǒng)時(shí)代,認(rèn)證方式一般是在通信信道上開啟 HTTPS,在通信協(xié)議上利用 HTTP Basic/Digest/Bearer/HOBA/OCRA 等方式并在通信內(nèi)容上結(jié)合表單或 TOTP 等的認(rèn)證組合方式。這樣可以從通信的不同階段獲得相應(yīng)的安全保證。

如果想對(duì)基于 HTTP 協(xié)議的認(rèn)證方式做進(jìn)一步的了解,可以參考這兩篇文章:

  1. 認(rèn)證 | 鳳凰架構(gòu)
  2. 細(xì)說API - 認(rèn)證、授權(quán)和憑證 - Thoughtworks洞見

單點(diǎn)登錄(SSO)

認(rèn)證的一個(gè)常見應(yīng)用場(chǎng)景是單點(diǎn)登錄。單點(diǎn)登錄主要解決了一個(gè)一次登錄訪問多個(gè)獨(dú)立應(yīng)用的問題。在單點(diǎn)登錄方案出現(xiàn)之前,每個(gè)應(yīng)用都需要獨(dú)立登錄維持各自的會(huì)話。相關(guān)的技術(shù)方案已經(jīng)很成熟,主要有以下:

授權(quán)

授權(quán)主要解決 你能做什么 的問題,從方案上來說有以下幾種:

如果想對(duì)授權(quán)做進(jìn)一步的了解,可以參考這篇文章:

  1. 授權(quán) | 鳳凰架構(gòu)

憑證

憑證是為了解決在認(rèn)證授權(quán)后如何承載認(rèn)證授權(quán)信息的問題。在單體應(yīng)用時(shí)代,主流的解決方案是基于 HTTP 協(xié)議的 Cookie-Session 機(jī)制為代表的服務(wù)端狀態(tài)存儲(chǔ)技術(shù)。

由于 HTTP 協(xié)議本身是無狀態(tài)的,要維持一個(gè)會(huì)話(Session),而不是每次訪問都重新認(rèn)證授權(quán),需要客戶端也就是瀏覽器通過 Cookie 來存儲(chǔ)服務(wù)器端返回的一個(gè)憑證信息,這個(gè)憑證信息一般是一串隨機(jī)的字符串,用來代表用戶此次的會(huì)話標(biāo)識(shí)。每次請(qǐng)求瀏覽器都會(huì)在 HTTP Header 中攜帶這個(gè) Cookie 信息,應(yīng)用拿到這個(gè)會(huì)話標(biāo)識(shí)后從內(nèi)存或緩存(Cache)中查詢出用戶的信息,這樣就定位到了具體的用戶,實(shí)現(xiàn)了會(huì)話的維持。

這套古老的方案存在以下先天優(yōu)勢(shì):憑證 | 鳳凰架構(gòu)

一切都很美好,直到我們來到了分布式系統(tǒng)時(shí)代。

分布式系統(tǒng)

分布式系統(tǒng)與單體系統(tǒng)的一大區(qū)別就是狀態(tài)管理。分布式系統(tǒng)通過把單體系統(tǒng)中有狀態(tài)的部分轉(zhuǎn)移到中間件中去管理,從而很容易做到水平擴(kuò)容,提高系統(tǒng)峰值處理能力。在架構(gòu)認(rèn)證和授權(quán)部分,分布式和單體并沒有什么不同,唯獨(dú)有變化的在持有狀態(tài)的憑證部分。

我們知道單體應(yīng)用在服務(wù)端管理用戶會(huì)話信息,客戶端只持有會(huì)話標(biāo)識(shí)。如果服務(wù)端要將此用戶會(huì)話狀態(tài)轉(zhuǎn)移出去有兩種處理思路:

為什么在分布式系統(tǒng)中共享狀態(tài)就這么困難?這是因?yàn)榉植际较到y(tǒng)中有一個(gè)不可能三角的理論:CAP。這個(gè)理論簡(jiǎn)單的理解就是因?yàn)樵诜植际较到y(tǒng)中,因?yàn)榫W(wǎng)絡(luò)無法做到絕對(duì)的可靠(分區(qū)容錯(cuò)性:Partition Tolerance),只能在一致性(Consistency)和可靠性(Availability)間選擇一個(gè)。
比如上述的三種服務(wù)端方案其實(shí)都是犧牲了 CAP 的某個(gè)方面。比如第一種中心化存儲(chǔ)方案我們放棄了中心化存儲(chǔ)的分區(qū)容錯(cuò)性,一旦其網(wǎng)絡(luò)分區(qū),整個(gè)集群都會(huì)不可用。第二種會(huì)話復(fù)制方案我們犧牲了可用性,當(dāng)節(jié)點(diǎn)在同步會(huì)話數(shù)據(jù)時(shí),整個(gè)服務(wù)會(huì)短暫的不可用。第三種會(huì)話粘滯方案我們犧牲了一致性,一旦某個(gè)節(jié)點(diǎn)宕機(jī),整個(gè)集群的數(shù)據(jù)會(huì)因該節(jié)點(diǎn)的數(shù)據(jù)丟失而達(dá)到不一致的狀態(tài)。

JWT

如果你對(duì) JWT 不了解,可以先看這兩篇:

  1. JWT | 鳳凰架構(gòu)
  2. The Hard Parts of JWT Security Nobody Talks About
由于 JWT 的 Payload 并未做過多限制,所以很容易產(chǎn)生濫用的問題,并且?guī)砗芏嗾`解。 比如下面的一些問題:

相信看了上述的一些問題,你對(duì) JWT 的“簡(jiǎn)單、安全”有了新的理解。這還沒完,JWT 還有以下一些 Cookie-Session 沒有的問題:

JWT 解決了 Cookie-Session 方案在分布式系統(tǒng)中因 CAP 的限制而帶來的問題,但同時(shí)也帶來了一些新的問題。所以并不能說 JWT 就是 Cookie-Session 在分布式系統(tǒng)中的完美替代。

那么 JWT 的最佳使用場(chǎng)景到底是什么?這篇 Stop using JWT for sessions 給出了以下的結(jié)論:JWT 更適合作分布式系統(tǒng)中的一次性令牌使用。分布式系統(tǒng)繼續(xù)使用 Cookie-Session 做會(huì)話管理,但可以在認(rèn)證鑒權(quán)后生成 JWT 做分布式系統(tǒng)內(nèi)部服務(wù)調(diào)用間的一次性令牌。

讓我們通過一個(gè)例子來理解下在分布式系統(tǒng)下的認(rèn)證授權(quán)場(chǎng)景。

一個(gè)例子

  1. 用戶通過 HTTPS 訪問我們的應(yīng)用。當(dāng)請(qǐng)求發(fā)送至微服務(wù)網(wǎng)關(guān)層(Gateway),網(wǎng)關(guān)檢測(cè) HTTP Header 中的 Cookie 發(fā)現(xiàn)沒有 SESSIONID 這個(gè)鍵值對(duì),重定向至 SSO 登錄頁面。
  2. 用戶通過 SSO 登錄我們的應(yīng)用。
    1. 用戶信息存放至 AD/LDAP 等系統(tǒng)中。管理員提前給用戶配置好角色權(quán)限。
    2. SSO 集成方案我們選擇 OIDC。OIDC 集成了 AD/LDAP,當(dāng)用戶提供正確的用戶名和密碼后,SSO 重定向至網(wǎng)關(guān)。
    3. 網(wǎng)關(guān)生成了 SESSIONID 鍵值對(duì)并通過 HTTP Set-Cookie 響應(yīng)給用戶瀏覽器設(shè)置了此 Cookie。
  3. 瀏覽器重新發(fā)起帶 SESSIONID Cookie 的請(qǐng)求。網(wǎng)關(guān)經(jīng)過查詢其緩存或中間件(如將會(huì)話信息存放至 Redis)中的 Session 信息確認(rèn)了用戶的身份信息。之后網(wǎng)關(guān)請(qǐng)求 Auth 服務(wù)利用其私鑰簽名生成 JWT 憑證,JWT Payload 中可以存放一部分用戶信息和角色信息,這些信息可以從中間件中或 AD/LDAP 中查詢出。
  4. 網(wǎng)關(guān)之后將此 JWT 憑證通過反向代理轉(zhuǎn)發(fā)至內(nèi)部的 BFF 服務(wù),之后請(qǐng)求到達(dá)內(nèi)部的領(lǐng)域微服務(wù)。
  5. 各領(lǐng)域微服務(wù)接受到請(qǐng)求后,先從 HTTP Header 中拿出 JWT 憑證。
    1. 在執(zhí)行真正的業(yè)務(wù)邏輯前,先利用之前定時(shí)從 Auth 服務(wù)中同步獲取的公鑰。
      1. Auth 服務(wù)通過一個(gè)類似 https://<your_domain>/.well-known/jwks.json 的 API 提供 JWT 公鑰的分發(fā)。關(guān)于 .well-known 前綴,可閱讀 RFC 5785 做進(jìn)一步了解。在 jwks.json 文件中,我們可以找到 JWK 或 JSON Web Key,這是我們用來驗(yàn)證簽名的公鑰。
      2. 校驗(yàn) JWT 這塊邏輯屬于微服務(wù)共有的部分,一般可以開發(fā)一個(gè) SDK 包來做這個(gè)通用的工作。為了提高性能,可使用緩存技術(shù),定時(shí)從 Auth 中同步公鑰。
    2. 獲取到公鑰后驗(yàn)證成功后拿出 JWT Payload 即可獲取到用戶信息和角色權(quán)限。
全部流程就是這樣,我們得到了以下的一些好處:

架構(gòu)總是在演進(jìn),也許分布式系統(tǒng)中很多問題我們還沒完全解決,就來到了云原生時(shí)代。

云原生系統(tǒng)

如果你對(duì)云原生應(yīng)用開發(fā)還不了解的話,可以先看看我這篇 K8S 云原生應(yīng)用開發(fā)小記。云原生系統(tǒng)其實(shí)并不是什么后分布式系統(tǒng)時(shí)代。它們兩者都是為了解決不同場(chǎng)景的問題而出現(xiàn)的解決方案。

在認(rèn)證授權(quán)這塊,云原生系統(tǒng)的優(yōu)勢(shì)在于可以通過 服務(wù)網(wǎng)格(Service Mesh) 做一些業(yè)務(wù)系統(tǒng)中通用的切面工作,比如我們?cè)诜植际较到y(tǒng)中遇到的校驗(yàn) JWT 的 SDK 其實(shí)就可以放入服務(wù)網(wǎng)格中的邊車(Sidecar)去實(shí)現(xiàn),讓業(yè)務(wù)應(yīng)用更專注特定領(lǐng)域的業(yè)務(wù)。

由于這篇文章并不主要討論云原生,對(duì)這部分感興趣的可以參考以下兩篇文章做進(jìn)一步了解:

  1. Service Mesh架構(gòu)下的認(rèn)證與授權(quán)
  2. Authentication sidecar

總結(jié)

由于篇幅及能力限制,這篇文章我只能從高層次梳理在不同架構(gòu)演進(jìn)中認(rèn)證、授權(quán)及憑證這些和架構(gòu)安全相關(guān)的技術(shù)的發(fā)展過程。由于這些技術(shù)涉及了大量的技術(shù)標(biāo)準(zhǔn)及實(shí)踐,很難在一篇文章中對(duì)這些技術(shù)做詳盡的分享,更無法去分享如何實(shí)現(xiàn)。但有了這些理論支持和最佳實(shí)踐,希望能讓你在實(shí)現(xiàn)的過程中多了一個(gè)指引。如果你想進(jìn)一步了解,可參考文章中的參考文章鏈接。

最后,技術(shù)總是在不斷的發(fā)展,但并不是新技術(shù)總比老技術(shù)“先進(jìn)”。正如文章中對(duì) Cookie-Session 與 JWT 的分析對(duì)比,技術(shù)方案總是充滿了各種 Trade-off。而作為一個(gè)工程師,我們能做的就是認(rèn)清這些技術(shù)的歷史背景及局限性,選擇最適合項(xiàng)目需求的技術(shù)方案。

關(guān)鍵詞:設(shè)計(jì),系統(tǒng),用戶,大型

74
73
25
news

版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點(diǎn)擊下載Chrome瀏覽器
關(guān)閉