SpringBoot 整合 JWT 實現分佈式應用登錄校驗

什麼是 JWT?

JSON Web 令牌(JWT)是一個開放標準(RFC 7519),它定義了一種緊湊且自包含的方式,用於在各方之間安全地傳輸信息作爲 JSON 對象。由於此信息是經過數字簽名的,因此可以被驗證和信任。可以使用祕密(使用 HMAC 算法)或使用 RSA 或 ECDSA 的公鑰 / 私鑰對對 JWT 進行簽名。

儘管可以對 JWT 進行加密以提供雙方之間的保密性,但我們將重點關注已_簽名的_令牌。簽名的令牌可以驗證其中包含的聲明的_完整性_,而加密的令牌則將這些聲明_隱藏_在其他方的面前。當使用公鑰 / 私鑰對對令牌進行簽名時,簽名還證明只有持有私鑰的一方纔是對其進行簽名的一方。

JWT 組成部分

header+payload+signature

JWT 優缺點

SpringBoot 整合 JWT

1、添加相關依賴、

io.jsonwebtoken     jjwt     0.7.0

2、封裝 JWT Utils 工具類

封裝生成 token 方法

`public static String geneJsonWebToken(LoginUser loginUser) {
    if (loginUser == null) {
        throw new NullPointerException("loginUser對象爲空");
    }
    Long userId = loginUser.getId();
    String token = Jwts.builder().setSubject(SUBJECT)
        .claim("head_img", loginUser.getHeadImg())
        .claim("id", loginUser.getId())
        .claim("name", loginUser.getName())
        .claim("mail", loginUser.getMail())
        .setIssuedAt(new Date())
        .setExpiration(new Date(System.currentTimeMillis() + EXPIRE_TIME))
        .signWith(SignatureAlgorithm.HS256, SECRET).compact();

    token = TOKEN_PREFIX + token;
    return token;
}
`

封裝解析 token 方法

public static Claims checkJwt(String token){     try {         Claims claims = Jwts.parser()             .setSigningKey(SECRET)             .parseClaimsJws(token.replace(TOKEN_PREFIX, ""))             .getBody();         return claims;     } catch (Exception e) {         log.info("jwt解密失敗,token={}",token,e.getMessage());     }     return null; }

JWT 相關問題

JWT 過期自動刷新方案介紹

背景

解決方案

`用戶登錄成功的時候,一次性給他兩個Token,分別爲AccessToken和RefreshToken
AccessToken有效期較短,比如1天或者5天,用於正常請求
RefreshToken有效期可以設置長一些,例如10天、20天,作爲刷新AccessToken的憑證

刷新方案:當AccessToken即將過期的時候,例如提前30分鐘,客戶端利用RefreshToken請求指定的API獲取新的AccessToken並更新本地存儲中的AccessToken

核心邏輯
1、登錄成功後,jwt生成AccessToken;UUID生成RefreshToken並存儲在服務端redis中,設置過期時間
2、接口返回3個字段AccessToken/RefreshToken/訪問令牌過期時間戳
3、由於RefreshToken存儲在服務端redis中,假如這個RefreshToken也過期,則提示重新登錄; 

老王的疑問:RefreshToken有效期那麼長,和直接將AccessToken的有效期延長有什麼區別

答:RefreshToken不像AccessToken那樣在大多數請求中都被使用,主要是本地檢測accessToken快過期的時候才使用,
一般本地存儲的時候,也不叫refreshToken,前端可以取個別名,混淆代碼讓攻擊者不能直接識別這個就是刷新令牌

缺點:前端每次請求需要判斷token距離過期時間
優點:後端壓力小,代碼邏輯改動不大
`

JWT 令牌 token 泄露惡意使用解決方案

解密:使用互聯網大廠的產品時經常遇到這個情況

如何避免 token 令牌泄露被惡意使用

解決方案

`生成token的時候,加密的payload加入當前用戶ip。

攔截器解密後,獲取payload的ip和當前訪問ip判斷是否同個,如果不是則提示重新登錄

優點:服務端無需存儲相關內容,性能高,假如用戶廣州登錄,泄露了token給杭州的黑客,依舊用不了

缺點:如果用戶用使用過程中ip變動頻繁,則操作會經常提示重新登錄,體驗不友好

當然也可以讓用戶開啓安全模式和非安全模式,讓用戶自己知道這個情況,一些區塊鏈、比特幣交易所裏面就會讓用戶自己選擇控制這個token令牌安全是否和ip、終端、地理網絡信息進行綁定
`

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/UlIIJBzpnHyfcRgyoFIeYQ