Spring-cloud學習筆記---分散式架構統一認證主流實現方案JWT簡介

饅頭太帥了 發表於 2020-11-29

Spring-cloud學習筆記—分散式架構統一認證主流實現方案JWT簡介

1.JWT改造統⼀認證授權中⼼的令牌儲存機制前的思考

  1. 當我們第⼀次登陸之後,認證伺服器頒發token並將其儲存在認證伺服器中,後期我們訪問資源伺服器時會攜帶token,資源伺服器會請求認證伺服器驗證token有效性,如果資源伺服器有很多,那麼認證伺服器壓⼒會很⼤
  2. 另外,資源伺服器向認證伺服器check_token,獲取的也是⽤戶資訊UserInfo,能否把⽤戶資訊儲存到令牌中,讓客戶端⼀直持有這個令牌,牌的驗證也在資源伺服器進⾏,這樣避免和認證伺服器頻繁的互動
  3. 我們可以考慮使JWT進⾏改造,使⽤JWT機制之後資源伺服器不需要訪問認證伺服器
  4. 在引入OAuth2的starter的時候,JWT就已經以來過來了

2. JWT令牌的介紹

  1. 通過上邊的測試我們發現,當資源服務和授權服務不在⼀起時資源服務使⽤RemoteTokenServices遠端請求授權 服務驗證token,如果訪問量較⼤將會影響系統的效能。
  2. 解決上邊問題: 令牌採⽤JWT格式即可解決上邊的問題,⽤戶認證通過會得到⼀個JWT令牌JWT令牌中已經包括了⽤戶相關的信 息,客戶端只需要攜帶JWT訪問資源服務,資源服務根據事先約定的演算法⾃⾏完成令牌校驗,⽆需每次都請求認證 服務完成授權。

3. 什麼是JWT

  1. JSON Web Token(JWT)是⼀個開放的⾏業標準(RFC 7519),它定義了⼀種簡介的、⾃包含的協議格式,⽤於 在通訊雙⽅傳遞json物件,傳遞的資訊經過數字簽名可以被驗證和信任。JWT可以使⽤HMAC演算法或使⽤RSA的公鑰/私鑰對來簽名,防⽌被篡改。

4. JWT令牌結構

  1. JWT令牌由三部分組成,每部分中間使⽤點(.)分隔,⽐如:xxxxx.yyyyy.zzzzz
  2. Header:頭部包括令牌的型別(即JWT)及使⽤的雜湊演算法(如HMAC SHA256或RSA)
    {
    	"alg": "HS256",
    	"typ": "JWT"
    }
    
  3. Payload:第⼆部分是負載,內容也是⼀個json物件,它是存放有效資訊的地⽅,它可以存放jwt提供的現成欄位,⽐如:iss(簽發者),exp(過期時間戳), sub(⾯向的⽤戶)等,也可⾃定義欄位。 此部分不建議存放敏感資訊,因為此部分可以解碼還原原始內容。 最後將第⼆部分負載使⽤Base64Url編碼,得到⼀個字串就是JWT令牌的第⼆部分。
    {
    	"sub": "1234567890",
    	"name": "John Doe",
    	"iat": 1516239022
    }
    ``
    
  4. Signature:第三部分是簽名,此部分⽤於防⽌jwt內容被篡改。 這個部分使⽤base64url將前兩部分進⾏編碼,編碼後使⽤點(.)連線組成字串,最後使⽤header中宣告簽名演算法進⾏簽名。
    HMACSHA256(
    	base64UrlEncode(header) + "." +
    	base64UrlEncode(payload),
    	secret)
    
    base64UrlEncode(header):jwt令牌的第⼀部分。
    base64UrlEncode(payload):jwt令牌的第⼆部分。
    secret:簽名所使⽤的金鑰。

第三部分Signature是防止篡改的,即使我們知道第一部分和第二部分的值,並且進行相同的機密演算法後,但是我們不知道secret的值,所以會防止被篡改

在這裡插入圖片描述