JWT實現token認證


演變

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)(不要泄漏,最好周期性更換),通過加密算法生成。用於驗證整個數據完整和可靠性

生成的數據:

Encode.png

1.2 JWT交互流程

1、用戶登錄

2、服務的認證,通過后根據secret生成token

3、將生成的token返回給瀏覽器

4、用戶每次請求攜帶token

5、服務端利用公鑰解讀jwt簽名,判斷簽名有效后,從Payload中獲取用戶信息

6、處理請求,返回響應結果

參考:https://www.jianshu.com/p/fe67b4bb6f2c


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM