1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        工作5年,還不懂單點(diǎn)登錄系統(tǒng)?

        共 2015字,需瀏覽 5分鐘

         ·

        2021-09-18 18:55

        JSON Web Token可以用來設(shè)計(jì)單點(diǎn)登錄系統(tǒng)。我嘗試用八幅漫畫先讓大家理解如何設(shè)計(jì)正常的用戶認(rèn)證系統(tǒng),然后再延伸到單點(diǎn)登錄系統(tǒng)。

        用戶認(rèn)證八步走

        所謂用戶認(rèn)證(Authentication),就是讓用戶登錄,并且在接下來的一段時(shí)間內(nèi)讓用戶訪問網(wǎng)站時(shí)可以使用其賬戶,而不需要再次登錄的機(jī)制。

        小知識(shí):可別把用戶認(rèn)證和用戶授權(quán)(Authorization)搞混了。用戶授權(quán)指的是規(guī)定并允許用戶使用自己的權(quán)限,例如發(fā)布帖子、管理站點(diǎn)等。

        首先,服務(wù)器應(yīng)用(下面簡(jiǎn)稱“應(yīng)用”)讓用戶通過Web表單將自己的用戶名和密碼發(fā)送到服務(wù)器的接口。這一過程一般是一個(gè)HTTP POST請(qǐng)求。建議的方式是通過SSL加密的傳輸(https協(xié)議),從而避免敏感信息被嗅探。

        接下來,應(yīng)用和數(shù)據(jù)庫核對(duì)用戶名和密碼。

        核對(duì)用戶名和密碼成功后,應(yīng)用將用戶的id(圖中的user_id)作為JWT Payload的一個(gè)屬性,將其與頭部分別進(jìn)行Base64編碼拼接后簽名,形成一個(gè)JWT。這里的JWT就是一個(gè)形同lll.zzz.xxx的字符串。

        應(yīng)用將JWT字符串作為該請(qǐng)求Cookie的一部分返回給用戶。注意,在這里必須使用HttpOnly屬性來防止Cookie被JavaScript讀取,從而避免跨站腳本攻擊(XSS攻擊)。

        在Cookie失效或者被刪除前,用戶每次訪問應(yīng)用,應(yīng)用都會(huì)接受到含有jwt的Cookie。從而應(yīng)用就可以將JWT從請(qǐng)求中提取出來。

        應(yīng)用通過一系列任務(wù)檢查JWT的有效性。例如,檢查簽名是否正確;檢查Token是否過期;檢查Token的接收方是否是自己(可選)。


        應(yīng)用在確認(rèn)JWT有效之后,JWT進(jìn)行Base64解碼(可能在上一步中已經(jīng)完成),然后在Payload中讀取用戶的id值,也就是user_id屬性。這里用戶的id為1025。

        應(yīng)用從數(shù)據(jù)庫取到id為1025的用戶的信息,加載到內(nèi)存中,進(jìn)行ORM之類的一系列底層邏輯初始化。

        應(yīng)用根據(jù)用戶請(qǐng)求進(jìn)行響應(yīng)。

        和Session方式存儲(chǔ)id的差異

        Session方式存儲(chǔ)用戶id的最大弊病在于要占用大量服務(wù)器內(nèi)存,對(duì)于較大型應(yīng)用而言可能還要保存許多的狀態(tài)。一般而言,大型應(yīng)用還需要借助一些KV數(shù)據(jù)庫和一系列緩存機(jī)制來實(shí)現(xiàn)Session的存儲(chǔ)。

        而JWT方式將用戶狀態(tài)分散到了客戶端中,可以明顯減輕服務(wù)端的內(nèi)存壓力。除了用戶id之外,還可以存儲(chǔ)其他的和用戶相關(guān)的信息,例如該用戶是否是管理員、用戶所在的分桶等。

        雖說JWT方式讓服務(wù)器有一些計(jì)算壓力(例如加密、編碼和解碼),但是這些壓力相比磁盤I/O而言或許是半斤八兩。具體是否采用,需要在不同場(chǎng)景下用數(shù)據(jù)說話。

        單點(diǎn)登錄

        Session方式來存儲(chǔ)用戶id,一開始用戶的Session只會(huì)存儲(chǔ)在一臺(tái)服務(wù)器上。對(duì)于有多個(gè)子域名的站點(diǎn),每個(gè)子域名至少會(huì)對(duì)應(yīng)一臺(tái)不同的服務(wù)器,例如:

        • www.taobao.com
        • nv.taobao.com
        • nz.taobao.com
        • login.taobao.com

        所以如果要實(shí)現(xiàn)在login.taobao.com登錄后,在其他的子域名下依然可以取到Session,這要求我們?cè)诙嗯_(tái)服務(wù)器上同步Session。

        使用JWT的方式則沒有這個(gè)問題的存在,因?yàn)橛脩舻臓顟B(tài)已經(jīng)被傳送到了客戶端。因此,我們只需要將含有JWT的Cookie的domain設(shè)置為頂級(jí)域名即可,例如

        Set-Cookie: jwt=lll.zzz.xxx; HttpOnly; max-age=980000; domain=.taobao.com

        注意domain必須設(shè)置為一個(gè)點(diǎn)加頂級(jí)域名,即.taobao.com。這樣,taobao.com和*.taobao.com就都可以接受到這個(gè)Cookie,并獲取JWT了。

        來源:http://blog.leapoahead.com/2015/09/07/user-authentication-with-jwt/

        瀏覽 100
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            久久福利51 | 午夜一区二区三区视频 | 国产免费看黄网站 | 99国产免费 | 搡的我好爽视频免费观看野战 | 日韩精品无码一区二区中文字幕 | 伊人国产视频 | 天堂网在线播放 | 国产欧美黄片 | 黃色A片一級二級三級免費久久久 |