使用JWT+RSA完成SSO單點登錄

無狀態登錄原理

1.1.什麼是有狀態?

有狀態服務,即服務端需要記錄每次會話的客戶端資訊,從而識別客戶端身份,根據用戶身份進行請求的處理,典型的設計如tomcat中的session。

例如登錄:用戶登錄後,我們把登錄者的資訊保存在服務端session中,並且給用戶一個cookie值,記錄對應的session。然後下次請求,用戶攜帶cookie值來,我們就能識別到對應session,從而找到用戶的資訊。

缺點是什麼?

  • 服務端保存大量數據,增加服務端壓力

  • 服務端保存用戶狀態,無法進行水平擴展

  • 客戶端請求依賴服務端,多次請求必須訪問同一台伺服器

1.2.什麼是無狀態?

微服務集群中的每個服務,對外提供的都是Rest風格的介面。而Rest風格的一個最重要的規範就是:服 務的無狀態性,即:

  • 服務端不保存任何客戶端請求者資訊

  • 客戶端的每次請求必須具備自描述資訊,通過這些資訊識別客戶端身份

帶來的好處是什麼呢?

  • 客戶端請求不依賴服務端的資訊,任何多次請求不需要必須訪問到同一台服務

  • 服務端的集群和狀態對客戶端透明

  • 服務端可以任意的遷移和伸縮

  • 減小服務端存儲壓力

什麼是RSA加密?

RSA稱為非對稱加密,加密技術是對資訊進行編碼和解碼的技術,編碼是把原來可讀資訊(又稱明文)譯成程式碼形式(又稱密 文)其逆過程就是解碼(解密),加密技術的要點是加密演算法,RSA會根據你給的 鹽值 生成私鑰和公鑰:

  • 私鑰:通過私鑰加密的數據使用私鑰或者公鑰來解密。

  • 公鑰:通過公鑰加密的數據只能使用私鑰來解密。

  • 優點:安全,難以破解

  • 缺點:演算法比較耗時

什麼是JWT?

JWT,全稱是Json Web Token, 是JSON風格輕量級的授權和身份認證規範,可實現無狀態、分散式的 Web應用授權。

看名知意,其實就是一種加密方式,分為三部分:

  • Header(頭部):一般只包含兩部分資訊:

    • 聲明加密的演算法,這裡使用的是HS256的加密演算法。

    • 聲明Token的類型,這裡使用的是JWT的風格類型。

  • Payload(載荷):存放一些有效數據比如用戶ID、用戶名稱,解密之後可以獲取載荷中的用戶資訊,因為採用Base64編碼格式,所以可以被解碼,不要放敏感資訊,例如登錄密碼之類的。

  • 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)

Tags: