分佈式系統登錄原理

1.傳統系統登錄

        user ----> server1    

        即用戶user在服務server1上輸入登錄名、密碼等信息;server1完成用戶信息校驗,並將對應信息寫入server1的session中。

        問題:分佈式系統,微服務架構中,在server1中完成登錄,但是訪問server2時仍需登錄。

 

2.分佈式架構模型下的登錄問題剖析

        常見的如圖,將一個項目,分爲多個server,部署在不同的服務器。如wucenter,部署在3個服務器上,即server1  、server2 、server3等。通常會使用Nginx進行負載均衡,默認爲便利的方式,例本次請求分發至server1,下次分發至server2 ,下下次分發至server3。當用戶在server1完成登錄操作後,下次請求getPhone操作,此時請求被分發至server2,在傳統登錄模型中,由於server2中不含有在server1登錄後保存的session信息,此時仍需登錄。

 

3.處理方案

       a. iphash的處理方案:

       即在Nginx中,將請求來訪的Ip和對應的server進行綁定,從而保證同一ip地址的請求均是在同一個服務器下,避免了分發不同請求時的session問題。

       問題:server1宕機時導致大量的請求失敗,會存在大量的請求被分發至同一服務器導致負載均衡失效。

       b.session同步的處理方案

        即當用戶在server1完成登錄後,會通過服務器的http請求將session下發至其他的所有的server中。

        問題:同一session在各個服務器上保存導致內存佔用問題,網絡通訊延時導致的server2中的session獲取不及時問題

        c.redis方式

        即通過key-value的方式,在server1完成登錄後,將用戶信息以value的形式,保存在redis中。同時將key發送至客戶端的cookie中。客戶端下次發送請求時,Negix分發到的server,通過cookie中獲取key,進而從redis中獲取對應的用戶信息的操作。

        優點:安全

        核心問題:key的生成以及發送問題。

以淘寶-天貓爲例剖析redis實現的分佈式登錄問題

        1.用戶在淘寶發起登錄請求,輸入賬戶名密碼;

        2.淘寶驗證通過後,將對應的用戶信息封裝爲value,併產生一個key,將key-value存儲到一個store系統中;

        3.淘寶將對應的key通過cookie發送到客戶端;

        4.用戶下次從天貓獲取數據時,http請求會攜帶對應的cookie信息,發送請求到天貓;

        5.天貓解析對應的cookie,獲取到對應的key,從store系統獲取對應的用戶信息,進而執行其他操作;獲取失敗則返回登錄頁面,使用戶重新登錄。

cookie的相關操作

       1.如果在Cookie中設置了"HttpOnly"屬性,那麼通過JavaScript腳本將無法讀取到Cookie信息,這樣能有效的防止XSS攻擊,讓網站應用更加安全。

        2.cookie的相關方法

                setName(String name)   修改Session ID的名稱,默認爲"JSESSIONID"
                setDomain(String domain) 設置當前Cookie所處於的域
                setPath(String path) 設置當前Cookie所處於的相對路徑
                setHttpOnly(boolean httpOnly) 設置是否支持HttpOnly屬性
                setSecure(boolean secure) 若使用HTTPS安全連接,則需要設置其屬性爲true
                setMaxAge(int maxAge)  設置存活時間,單位爲秒
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章