JWT對SpringCloud進行系統認證和服務鑒權


JWT對SpringCloud進行系統認證和服務鑒權

一、為什么要使用jwt?
在微服務架構下的服務基本都是無狀態的,傳統的使用session的方式不再適用,如果使用的話需要做同步session機制,所以產生了了一些技術來對微服務架構進行保護,例如常用的鑒權框架Spring Security OAuth2和用Jwt來進行保護,相對於框架而言,jwt較輕,且可以自包含一些用戶信息和設置過期時間,省去了Spring Security OAuth2繁瑣的步驟。

二、什么是JWT?
jwt(JSON WEB TOKEN)是一種用來在網絡上聲明某種身份的令牌(TOKEN),它的特點是緊湊且自包含並且基於JSON,通過一些常用的算法對包含的主體信息進行加密,安全性很高。它通常有三個部分組成:頭信息(Header),消息體(Payload),簽名(Signature)。
Header通常用來聲明令牌的類型和使用的算法,Payload主要用來包含用戶的一些信息,Signature部分則是將Base64編碼后的Header和Payload進行簽名。

三、在Spring Cloud 下如何使用 jwt?
在SC(Spring Cloud簡稱,以下將都采用這種方式)下通常使用需要安全保護的有兩處,分別為系統認證和服務內部鑒權。
1系統認證
(1)基本流程
jwt基本使用方式如下圖

用戶在提交登錄信息后,服務器校驗數據后將通過密鑰的方式來生成一個字符串token返回給客戶端,客戶端在之后的請求會把token放在header里,在請求到達服務器后,服務器會檢驗和解密token,如果token被篡改或者失效將會拒絕請求,如果有效則服務器可以獲得用戶的相關信息並執行請求內容,最后將結果返回。
在微服務架構下,通常有單獨一個服務Auth去管理相關認證,為了安全不會直接讓用戶訪問某個服務,會開放一個入口服務作為網關gateway,只允許外網網關,所有請求首先訪問gateway,有gateway將請求路由到各個服務,spring cloud下通常使用zuul來實現網關,整個基本過程如下圖所示

客戶端請求網關后,網關會根據路徑過濾請求,是登錄獲取token操作的路徑則直接放行,請求直接到達auth服務進行登錄操作,之后進行JWT私鑰加密生成token返回給客戶端;是其他請求將會進行token私鑰解密校驗,如果token被篡改或者失效則直接拒絕訪問並返回錯誤信息,如果驗證成功經過路由到達請求服務,請求服務響應並返回數據。
(2)如何實現登錄、刷新、注銷等?
登錄比較簡單,在驗證身份信息后可以使用工具包例如jjwt根據用戶信息生成token並設置有效時長,最后將token返回給客戶端存儲即可,客戶端只需要每次訪問時將token加在請求頭里即可,然后在zuul增加一個filter,此filter來過濾請求,如果是登錄獲取token則放行,其他的話用公鑰解密驗證token是否有效。
如果要實現刷新,則需要在生成token時生成一個refreshKey,在登錄時和token一並返回給客戶端,然后由客戶端保存定時使用refreshKey和token來刷新獲取新的有效時長的token,這個refreshKey可自定義生成,為了安全起見,服務器可能需要緩存refreshKey,可使用redis來進行存儲,每次刷新token都將生成新的refreshKey和token,服務器需要將老refreshKey替換,客戶端保存新的token和refreshKey來進行之后的訪問和刷新。
如果要實現注銷,並使得舊的token即便在有效期內也不能通過驗證,則需要修改登錄、刷新、和優化zuul的filter。首先在登錄時生成token和refreshKey后,需要將token也進行緩存,如果通過redis進行緩存可以直接放一個Set下,此Set存儲所有未過期的token。其次,在刷新時在這個Set中刪除舊的token並放入新的。最后對zuulFilter進行優化,在解密時先從redis里存放token的Set查找此token是否存在(redis的Set有提供方法),如果沒有則直接拒絕,如果有再進行下一步解密驗證有效時長,驗證有效時長是為了防止刷新機制失效、沒有刷新機制、網絡異常強行退出等事件出現,在這種情況下舊的token沒有被刪除,導致了舊的token一直可以訪問(如果只驗證是否token是否在緩存中)。在注銷時只需要刪除redis中Set的token記錄就好,最后寫個定時器去定時刪除redis中Set里面過時的token,原因也是刷新機制失效、沒有刷新機制、網絡異常強行退出等事件出現導致舊的token沒有被刪除。

四、JWT存在的問題
jwt第一次生成token 的時候會比較慢,而且因為采用了加密算法保證安全,所以比較耗CPU,在高並發的情況下需要考慮CPU占用問題。還有一個問題,jwt生成的token比較長,可能需要考慮流量問題。

 

 

 

————————————————
原文鏈接:https://blog.csdn.net/qq_36236890/article/details/79954647


免責聲明!

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



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