無狀態登入配置 單點登入 JWT

2021-10-14 17:37:49 字數 3489 閱讀 4183

多系統,單一位置登入,實現多系統同時登入的一種技術。

常出現在網際網路應用和企業級平台中。

單點登入一般是用於互相授信的系統,實現單一位置登入,全系統有效的。

session[1](跨域:ip,埠,主機名,網域名稱任意乙個不同的時候都稱為跨域,訪問不同的域時cookie不一樣)

通過設定cookie的domain來實現cookie的跨域傳遞。在cookie中傳遞乙個自定義的session_id。這個session_id是客戶端的唯一標記。將這個標記作為key,將客戶端需要儲存的資料作為value,在服務端進行儲存(資料庫儲存或nosql儲存)。這種機制就是session的跨域解決。

spring session

spring提供的用於處理集群會話共享的解決方案。spring-session技術是將使用者session資料儲存到三方儲存容器中,如:mysql,redis等。

spring-session技術是解決同網域名稱下的多伺服器集群session共享問題的。不能解決跨域session共享問題。

使用:配置乙個spring提供的filter,實現資料的攔截儲存,並轉換為spring-session需要的會話物件。必須提供乙個資料庫的**資訊(由spring-session提供,找spring-session-jdbc.jar/org/springframework/session/jdbc/*.sql,根據具體的資料庫找對應的sql檔案,做**的建立)。

spring-session表:儲存客戶端session物件的**。

spring-session-attributes表:儲存客戶端session中的attributes屬性資料的**。

spring-session框架,是結合servlet技術中的httpsession完成的會話共享機制。在**中是直接操作httpsession物件的。

nginx session共享

nginx中的ip_hash技術能夠將某個ip的請求定向到同一台後端,這樣一來這個ip下的某個客戶端和某個後端就能建立起穩固的session,ip_hash是在upstream配置中定義的,具體如下:

//** nginx.example.com

upstream nginx.example.com

server

}

token機制傳統方式http 是一種沒有狀態的協議,也就是它並不知道是誰是訪問應用。這裡我們把使用者看成是客戶端,客戶端使用使用者名稱還有密碼通過了身份驗證,不過下回這個客戶端再傳送請求時候,還得再驗證一下。

解決的方法就是,當使用者請求登入的時候,如果沒有問題,我們在服務端生成一條記錄,這個記錄裡可以說明一下登入的使用者是誰,然後把這條記錄的 id 號傳送給客戶端,客戶端收到以後把這個 id 號儲存在 cookie 裡,下次這個使用者再向服務端傳送請求的時候,可以帶著這個 cookie ,這樣服務端會驗證乙個這個 cookie 裡的資訊,看看能不能在服務端這裡找到對應的記錄,如果可以,說明使用者已經通過了身份驗證,就把使用者請求的資料返回給客戶端。

上面說的就是 session,我們需要在服務端儲存為登入的使用者生成的 session ,這些 session 可能會儲存在記憶體,磁碟,或者資料庫裡。我們可能需要在服務端定期的去清理過期的 session 。

token身份認證機制

客戶端使用使用者名稱、密碼請求登入

服務端收到請求,去驗證使用者名稱、密碼

驗證成功後,服務端會簽發乙個 token,再把這個 token 傳送給客戶端

客戶端收到 token 以後可以把它儲存起來,比如放在 cookie 裡或者local storage(sessionstorage瀏覽器關閉後儲存自動**)裡。客戶端每次向服務端請求資源的時候需要帶著服務端簽發的 token——————tonken只是乙個身份標記,真正的使用者資訊儲存在redis中,伺服器接收到token中時只需要到redis中查詢使用者狀態。

服務端收到請求,然後去驗證客戶端請求裡面帶著的 token,如果驗證成功,就向客戶端返回請求的資料

使用token驗證的優勢:

無狀態、可擴充套件

在客戶端儲存的tokens是無狀態的,並且能夠被擴充套件。基於這種無狀態和不儲存session資訊,負載負載均衡器能夠將使用者資訊從乙個服務傳到其他伺服器上。

安全性

請求中傳送token而不再是傳送cookie能夠防止csrf(跨站請求偽造————偽造資訊一般偽造cookie,請求頭中的資料可以經過家嗎)。即使在客戶端使用cookie儲存token,cookie也僅僅是乙個儲存機制而不是用於認證。不將資訊儲存在session中,讓我們少了對session操作。

使用者身份驗證:一旦使用者登入,每個後續請求都將包含jwt,允許使用者訪問該令牌允許的路由,服務和資源。單點登入是當今廣泛使用jwt的一項功能,因為它的開銷很小,並且能夠輕鬆地跨不同域使用。

資料資訊交換:jwt是一種非常方便的多方傳遞資料的載體,因為其可以使用資料前面來保證資料的有效性和安全性。

jwt是一種緊湊且自包含的,用於在多方傳遞json物件的技術。傳遞的資料可以使用數字簽名增加其安全行。可以使用hmac加密演算法或rsa公鑰/私鑰加密方式。

緊湊:資料小,可以通過url,post引數,請求頭髮送。且資料小代表傳輸速度快。

自包含:使用payload資料塊記錄使用者必要且不隱私的資料,可以有效的減少資料庫訪問次數,提高**效能。

jwt資料結構

jwt的資料結構是 : a.b.c。 由字元點『.』來分隔三部分資料。

a - header 頭資訊

b - payload (有效荷載?)

c - signature 簽名

資料結構: ——————json物件

alg是加密演算法定義內容,如:hmac sha256 或 rsa

typ是token型別,這裡固定為jwt。

在payload資料塊中一般用於記錄實體(通常為使用者資訊)或其他資料的。主要分為三個部分,分別是:已註冊資訊(registered claims),公開資料(public claims),私有資料(private claims)。

payload中常用資訊有:iss(發行者),exp(到期時間),sub(主題),aud(受眾)等。前面列舉的都是已註冊資訊————payload中最重要的,屬於系統內建的

公開資料部分一般都會在jwt登錄檔中增加定義。避免和已註冊資訊衝突。

公開資料和私有資料可以由程式設計師任意定義。

簽名資訊。這是乙個由開發者提供的資訊。是伺服器驗證的傳遞的資料是否有效安全的標準。在生成jwt最終資料的之前。先使用header中定義的加密演算法,將header和payload進行加密,並使用點進行連線。如:加密後的head.加密後的payload。再使用相同的加密演算法,對加密後的資料和簽名資訊進行加密。得到最終結果。

JWT單點登入

jwt單點登入 什麼是jwt介紹的比較清楚 jwt的優勢和劣勢等 註冊過程中,密碼從前台在傳輸到後台過程中,如何防止密碼被竊取或篡改?前台通過js加密下,後台通過演算法解密,再用後台方式加密,最後放到資料庫中 抓包技術。認證就是判斷你有沒有許可權獲取資料 鑑權就是看看你有沒有權利操作某個東西 使用密...

無狀態登入

有狀態服務,即服務端需要記錄每次會話的客戶端資訊,從而識別客戶端身份,根據使用者身份進行請求的處理,典型的設計如tomcat中的session。例如登入 使用者登入後,我們把登入者的資訊儲存在服務端session中,並且給使用者乙個cookie值,記錄對應的session。然後下次請求,使用者攜帶c...

無狀態登入原理

1.1.什麼是有狀態?有狀態服務,即服務端需要記錄每次會話的客戶端資訊,從而識別客戶端身份,根據使用者身份進行請求的處理,典型的設計如tomcat中的session。例如登入 使用者登入後,我們把登入者的資訊儲存在服務端session中,並且給使用者乙個cookie值,記錄對應的session。然後...