使用JWT+RSA完成SSO單點登入
1.1.什麼是有狀態?
有狀態服務,即服務端需要記錄每次會話的客戶端資訊,從而識別客戶端身份,根據使用者身份進行請求的處理,典型的設計如tomcat中的session。
缺點是什麼?
-
服務端儲存大量資料,增加服務端壓力
-
服務端儲存使用者狀態,無法進行水平擴充套件
-
客戶端請求依賴服務端,多次請求必須訪問同一臺伺服器
1.2.什麼是無狀態?
微服務叢集中的每個服務,對外提供的都是Rest風格的介面。而Rest風格的一個最重要的規範就是:服 務的無狀態性,即:
-
服務端不儲存任何客戶端請求者資訊
-
客戶端的每次請求必須具備自描述資訊,通過這些資訊識別客戶端身份
帶來的好處是什麼呢?
-
客戶端請求不依賴服務端的資訊,任何多次請求不需要必須訪問到同一臺服務
-
服務端的叢集和狀態對客戶端透明
-
服務端可以任意的遷移和伸縮
-
減小服務端儲存壓力
什麼是RSA加密?
RSA稱為非對稱加密,加密技術是對資訊進行編碼和解碼的技術,編碼是把原來可讀資訊(又稱明文)譯成程式碼形式(又稱密
文)其逆過程就是解碼(解密)
,加密技術的要點是加密演算法,RSA會根據你給的 鹽值
-
私鑰:通過
私鑰
加密的資料使用私鑰
或者公鑰
來解密。 -
公鑰:通過
公鑰
加密的資料只能使用私鑰
來解密。 -
優點:安全,難以破解
-
缺點:演算法比較耗時
什麼是JWT?
JWT,全稱是Json Web Token
, 是JSON風格輕量級的授權
和身份認證規範
,可實現無狀態、分散式的 Web應用授權。
看名知意,其實就是一種加密方式,分為三部分:
-
Header(頭部)
:一般只包含兩部分資訊:-
宣告加密的演算法,這裡使用的是HS256的加密演算法。
-
宣告Token的型別,這裡使用的是JWT的風格型別。
-
-
Payload(載荷)
:存放一些有效資料比如使用者ID、使用者名稱稱,解密之後可以獲取載荷
-
Signature(簽名)
:Signature由header
和payload
經過 base64 編碼後加鹽值
得到的。-
生成Signature的演算法如下:
-
var encodedString = base64UrlEncode(header) + "." + base64UrlEncode(payload);
HMACSHA256(encodedString, '!Q@#$%^%&');
-
在分散式下完成SSO單點登入
只使用JWT來完成單點登入
有了JWT為什麼還需要RSA?
可以發現,每次鑑權都需要訪問鑑權中心,系統間的網路請求頻率過高,效率略差,鑑權中心的壓力較大。
這時就用到了前面說的RSA,我們可以把私鑰
留在授權中心,把公鑰
給閘道器或者其他微服務,那麼就可以在閘道器或其他微服務當中直接解密JWT了,這樣做的好處是減少了授權中心的壓力。
使用JWT+RSA完成單點登入
![image-20201122203444462](D:\第一個月學習內容\java\CSDN部落格文章\使用JWT+RSA加密完成分散式下SSO功能\使用JWT+RSA加密完成分散式下SSO功能.assets\image-20201122203444462.png)