用戶登陸以後的操做,都會附帶包含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中。數據庫