【java】使用jwt進行認證受權

傳統的web應用使用session來維護用戶與服務器之間的狀態,用戶提交用戶名密碼到服務器,服務器生成會話id,並將驗證經過的用戶信息存到session中(內存or數據庫),會話id會寫出到cookie。

用戶登陸以後的操做,都會附帶包含sessionId的cookie,服務器根據用戶端傳來的sessionId獲取用戶信息,會話的有效期,包括用戶登出等操做都依賴對session的操做,以下圖:圖片----
基於session的認證用戶信息存在了服務端內存中,在分佈式環境中session是須要同步的。出現了基於token的認證方式,其實本質和session沒什麼區別。用戶提交登陸信息後,服務端驗證經過後頒發令牌。下圖是以redis爲例,將token和用戶信息保存到redis,客戶端再次訪問服務端時,會攜帶token,服務端經過token獲取用戶信息。會話的有效期,用戶的登出只須要操做redis中的token便可,以下圖:java

圖片

固然了,token自己也是能夠包含一些用戶非敏感信息減小查庫,包含數字簽名以防數據篡改,下面看下jwt(json web token)。----
從名稱能夠看出jwt仍是一個token,它有本身的規範,由標頭.有效載荷.簽名組成。頭用來描述散列算法,而後是用戶數據,最後是一個數字簽名。
web

圖片

----
先來看下jwt的java實現。
redis

com.auth0java-jwt3.10.2

使用jwt一般只須要兩個步驟,1經過jwt來生成token,2驗證token。算法

JwtUtil String = String = String MapStringStringclaimsAlgorithm algorithm = Algorithm.JWTCreator.Builder builder = JWT..withIssuer.withExpiresAtDateUtils.Dateclaims.forEachbuilder::withClaimbuilder.signalgorithmException eRuntimeExceptioneMapStringStringString tokenMapStringStringret = Maps.Algorithm algorithm = Algorithm.JWTVerifier verifier = JWT.algorithm.withIssuer.buildDecodedJWT jwt =  verifier.verifytokenMapStringClaimmap = jwt.getClaimsRuntimeExceptioneret

以上就是一個jwt的簡單示例,客戶端攜帶token請求時,服務端能夠校驗jwt的簽名及有效時間,校驗經過則放行,不然拒絕請求。
----優勢:能夠看到使用jwt自身就能夠完成認證,能夠減小資源鏈接,也能夠避免跨域認證請求,自帶信息也能夠用於數據傳遞。
缺點:能夠看到一旦生成token,就沒法回收,token的管理(刷新有效期&登出)須要其它補償機制(如使用redis管理token);默認有效載荷只是通過base64編碼,只是爲了方便傳輸,並未加密(也能夠自行加密),敏感數據不該該放到jwt中。數據庫

相關文章
相關標籤/搜索