有狀態服務,即服務端須要記錄每次會話的客戶端信息,從而識別客戶端身份,根據用戶身份進行請求的處理,典型的設計如tomcat中的session。java
例如登陸:用戶登陸後,咱們把登陸者的信息保存在服務端session中,而且給用戶一個cookie值,記錄對應的session。而後下次請求,用戶攜帶cookie值來,咱們就能識別到對應session,從而找到用戶的信息。git
缺點是什麼?github
微服務集羣中的每一個服務,對外提供的都是Rest風格的接口。而Rest風格的一個最重要的規範就是:服務的無狀態性,即:算法
帶來的好處是什麼呢?數據庫
無狀態登陸的流程:瀏覽器
流程圖:tomcat
整個登陸過程當中,最關鍵的點是什麼?安全
token的安全性服務器
token是識別客戶端身份的惟一標示,若是加密不夠嚴密,被人僞造那就完蛋了。cookie
採用何種方式加密纔是安全可靠的呢?
咱們將採用JWT + RSA非對稱加密
JWT,全稱是Json Web Token, 是JSON風格輕量級的受權和身份認證規範,可實現無狀態、分佈式的Web應用受權;官網:https://jwt.io
GitHub上jwt的java客戶端:https://github.com/jwtk/jjwt
JWT包含三部分數據:
Header:頭部,一般頭部有兩部分信息:
咱們會對頭部進行base64加密(可解密),獲得第一部分數據
Payload:載荷,就是有效數據,通常包含下面信息:
這部分也會採用base64加密,獲得第二部分數據
Signature:簽名,是整個數據的認證信息。通常根據前兩步的數據,再加上服務的的密鑰(secret)(不要泄漏,最好週期性更換),經過加密算法生成。用於驗證整個數據完整和可靠性
生成的數據格式:
能夠看到分爲3段,每段就是上面的一部分數據
流程圖:
步驟翻譯:
由於JWT簽發的token中已經包含了用戶的身份信息,而且每次請求都會攜帶,這樣服務的就無需保存用戶信息,甚至無需去數據庫查詢,徹底符合了Rest的無狀態規範。
加密技術是對信息進行編碼和解碼的技術,編碼是把原來可讀信息(又稱明文)譯成代碼形式(又稱密文),其逆過程就是解碼(解密),加密技術的要點是加密算法,加密算法能夠分爲三類:
RSA算法歷史:
1977年,三位數學家Rivest、Shamir 和 Adleman 設計了一種算法,能夠實現非對稱加密。這種算法用他們三我的的名字縮寫:RSA
咱們逐步演進系統架構設計。須要注意的是:secret是簽名的關鍵,所以必定要保密,咱們放到鑑權中心保存,其它任何服務中都不能獲取secret。
在微服務架構中,咱們能夠把服務的鑑權操做放到網關中,將未經過鑑權的請求直接攔截,如圖:
發現什麼問題了?
每次鑑權都須要訪問鑑權中心,系統間的網絡請求頻率太高,效率略差,鑑權中心的壓力較大。
直接看圖: