演變
1.1 有狀態服務
在原來的單體系統中,有狀態服務,即服務端需要記錄每次會話的客戶端信息,從而識別客戶端身份,根據用戶身份進行請求的處理,session+cookie。在如今的大多數分布式系統中,暴露出很多缺點
- 服務端保存大量數據,增加服務端壓力
- 服務端保存用戶狀態,無法進行水平擴展
- 客戶端請求依賴服務端,多次請求必須訪問同一台服務器
1.2 無狀態服務
在分布式/微服務中,服務的無狀態性更加的重要,即:
- 服務端不保存任何客戶端請求者信息
- 客戶端的每次請求必須具備自描述信息,通過這些信息識別客戶端身份
帶來的好處是什么呢?
- 客戶端請求不依賴服務端的信息,任何多次請求不需要必須訪問到同一台服務
- 服務端的集群和狀態對客戶端透明
- 服務端可以任意的遷移和伸縮
- 減小服務端存儲壓力
無狀態服務的實現
整個登錄過程中,最關鍵的點是什么?
token的安全性
token是識別客戶端身份的唯一標示,如果加密不夠嚴密,被人偽造那就完蛋了。
采用何種方式加密才是安全可靠的呢?
我們將采用JWT + RSA非對稱加密
JWT
1.1簡介
JWT,全稱是Json Web Token, 是JSON風格輕量級的授權和身份認證規范,可實現無狀態、分布式的Web應用授權; 參考jwt官網
JWT包含三部分數據:
-
Header:頭部,通常頭部有兩部分信息:
- 聲明類型,這里是JWT
- 加密算法,自定義
我們會對頭部進行base64加密(可解密),得到第一部分數據
-
Payload:載荷,就是有效數據,一般包含下面信息:
- 用戶身份信息(注意,這里因為采用base64加密,可解密,因此不要存放敏感信息)
- 注冊聲明:如token的簽發時間,過期時間,簽發人等
這部分也會采用base64加密,得到第二部分數據
-
Signature:簽名,是整個數據的認證信息。一般根據前兩步的數據,再加上服務的的密鑰(secret)(不要泄漏,最好周期性更換),通過加密算法生成。用於驗證整個數據完整和可靠性
生成的數據:
1.2 JWT交互流程
1、用戶登錄
2、服務的認證,通過后根據secret生成token
3、將生成的token返回給瀏覽器
4、用戶每次請求攜帶token
5、服務端利用公鑰解讀jwt簽名,判斷簽名有效后,從Payload中獲取用戶信息
6、處理請求,返回響應結果