一、JWT簡介
JWT全稱為Json Web Token(JSON Web Token),主要用於網絡上信息的傳輸,也可以用於其他場合。JWT由3部分組成,分別是頭部(header)、載荷(payload)和簽名(signature)。頭部和載荷都是JSON格式的信息,簽名是用於驗證數據完整性的一串字符。使用JWT可以有效地避免在傳輸過程中被篡改的風險,同時也可以提高網絡傳輸效率。
二、JWT工具類的實現原理
JWT工具類通過封裝實現了jwt的生成和驗證。一個JWT實際上由3部分組成,即頭部、載荷和簽名,而這3部分都是由Base64編碼後的JSON字符串。首先,我們需要指定簽名的算法和密鑰。對於頭部和載荷部分,我們需要指定信息類型及傳輸的數據。具體而言,我們需要 RFC7519 規範中的一個例子:
{ "alg": "HS256", "typ": "JWT" } { "sub": "1234567890", "name": "Peter Smith", "iat": 1516239022 }
上面是一個頭部和載荷都包含的例子。在生成JWT時,我們需要通過指定這些信息和密鑰來生成簽名,並將簽名拼接到頭部和載荷後形成一個完整的JWT內容。
import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jws; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import io.jsonwebtoken.security.Keys; import org.apache.commons.codec.binary.Base64; import javax.crypto.SecretKey; import java.security.Key; import java.util.Date; public class JwtUtil { private static final long EXPIRATION_TIME = 3600_000; // 1小時 private static final Key SECRET = Keys.secretKeyFor(SignatureAlgorithm.HS256); /** * 生成JWT * * @param subject 認證主體 * @return JWT */ public static String generateToken(String subject) { Date now = new Date(); Date expiration = new Date(now.getTime() + EXPIRATION_TIME); return Jwts.builder() .setIssuer("JwtUtil") .setSubject(subject) .setIssuedAt(now) .setExpiration(expiration) .signWith(SECRET) .compact(); } /** * 解析JWT * * @param jwt JWT內容 * @return 令牌聲明 */ public static Claims parseToken(String jwt) { if (jwt == null) { return null; } String[] parts = jwt.split("\\."); if (parts.length != 3) { return null; } byte[] bytes = Base64.decodeBase64(parts[0]); String headerJson = new String(bytes); bytes = Base64.decodeBase64(parts[1]); String payloadJson = new String(bytes); byte[] signature = Base64.decodeBase64(parts[2]); Jws jwtClaims = Jwts.parserBuilder() .setSigningKey(SECRET) .build() .parseClaimsJws(jwt); return jwtClaims.getBody(); } }
三、JWT工具類的應用示例
使用JWT工具類生成和解析一條JWT內容非常簡單。首先,我們需要調用生成令牌的方法,傳入認證主體的信息即可。比如,以下代碼生成了一個認證主體為”johndoe”的JWT:
String jwt = JwtUtil.generateToken("johndoe");
生成的JWT如下:
eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJKd3RVbHQiLCJzdWIiOiJqb2huZG9lIiwiaWF0IjoxNjE2NDM1NDk2LCJleHAiOjE2MTY0Mzk0OTZ9.97WXEWl-9v_9-mMpJlav8Qoyx5lEhrnbZm8F5ZkT9uA
其間包含頭部、載荷和簽名三部分。
接着,我們可以使用JWT工具類的解析方法將JWT解析成認證主體內容。比如,以下代碼將jwt解析為Claims:
Claims claims = JwtUtil.parseToken(jwt);
解析後的結果如下:
{ "iss": "JwtUtil", "sub": "johndoe", "iat": 1616435496, "exp": 1616439496 }
四、JWT工具類的優缺點
優點
JWT工具類的優點主要包括以下幾個方面:
1. 簡化處理
JWT工具類封裝了JWT的生成和解析過程,使得使用者可以不必了解JWT的細節就可以輕鬆實現JWT功能。
2. 安全性高
JWT工具類實現了簽名的生成和驗證過程,通過指定簽名算法和密鑰可以有效地避免信息在傳輸過程中被篡改的風險,保證了信息傳輸的安全性。
缺點
JWT工具類的缺點主要體現在以下幾個方面:
1. 客戶端存儲問題
由於JWT是無狀態的,因此在認證過程中需要將所有的信息都包含在JWT中,這就使得JWT變得較為臃腫。同時,JWT也需要被存儲於客戶端,如果存儲在cookie中,就容易受到 CSRF(跨站請求偽造)的攻擊;而如果存儲在localStorage中,則容易受到 XSS(跨站腳本攻擊)的攻擊。
2. 無效驗證問題
由於JWT是無狀態的,一旦簽發後,就無法使其失效。即使將JWT存儲在數據庫或者Redis中,也只能通過刪除來使其失效,而這樣往往需要對數據庫或者Redis進行頻繁的訪問和更新,影響系統的效率。
五、總結
JWT工具類是實現JWT功能的重要工具。通過對JWT工具類的詳細闡述,我們可以了解到JWT的實現原理和如何應用於具體場景。同時,我們也需要注意到JWT工具類的優缺點,避免在使用JWT工具類時出現問題。
原創文章,作者:IQUWS,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/333229.html