JWT實現token認證

演變

1.1 有狀態服務

在原來的單體系統中,有狀態服務,即服務端須要記錄每次會話的客戶端信息,從而識別客戶端身份,根據用戶身份進行請求的處理,session+cookie。在現在的大多數分佈式系統中,暴露出不少缺點算法

  • 服務端保存大量數據,增長服務端壓力
  • 服務端保存用戶狀態,沒法進行水平擴展
  • 客戶端請求依賴服務端,屢次請求必須訪問同一臺服務器

1.2 無狀態服務

在分佈式/微服務中,服務的無狀態性更加的重要,即:瀏覽器

  • 服務端不保存任何客戶端請求者信息
  • 客戶端的每次請求必須具有自描述信息,經過這些信息識別客戶端身份

帶來的好處是什麼呢?安全

  • 客戶端請求不依賴服務端的信息,任何屢次請求不須要必須訪問到同一臺服務
  • 服務端的集羣和狀態對客戶端透明
  • 服務端能夠任意的遷移和伸縮
  • 減少服務端存儲壓力

無狀態服務的實現

整個登陸過程當中,最關鍵的點是什麼?服務器

token的安全性cookie

token是識別客戶端身份的惟一標示,若是加密不夠嚴密,被人僞造那就完蛋了。
採用何種方式加密纔是安全可靠的呢?
咱們將採用JWT + RSA非對稱加密session

JWT

1.1簡介

JWT,全稱是Json Web Token, 是JSON風格輕量級的受權和身份認證規範,可實現無狀態、分佈式的Web應用受權; 參考jwt官網分佈式

JWT包含三部分數據:微服務

  • Header:頭部,一般頭部有兩部分信息:加密

    • 聲明類型,這裏是JWT
    • 加密算法,自定義

    咱們會對頭部進行base64加密(可解密),獲得第一部分數據code

  • Payload:載荷,就是有效數據,通常包含下面信息:

    • 用戶身份信息(注意,這裏由於採用base64加密,可解密,所以不要存放敏感信息)
    • 註冊聲明:如token的簽發時間,過時時間,簽發人等

    這部分也會採用base64加密,獲得第二部分數據

  • Signature:簽名,是整個數據的認證信息。通常根據前兩步的數據,再加上服務的的密鑰(secret)(不要泄漏,最好週期性更換),經過加密算法生成。用於驗證整個數據完整和可靠性

生成的數據:

Encode.png

1.2 JWT交互流程

一、用戶登陸

二、服務的認證,經過後根據secret生成token

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

四、用戶每次請求攜帶token

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

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

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

相關文章
相關標籤/搜索