JWT與TOKEN
JWT(JSON Web Token)是一種基于 JSON 格式的輕量級安全令牌,通常用于在網絡應用間安全地傳遞信息。而“token”一詞則是一個更廣泛的術語,用來指代任何形式的令牌,用于在計算機系統中進行身份驗證或授權。JWT 是 token 的一種具體實現方式,提供了一種基于 JSON 結構的令牌標準,用于在客戶端和服務器之間傳遞信息,并在許多網絡應用中廣泛使用。
1.簡介
Json Web Token,通過數字簽名的方式,以JSON對象為載體,不需中間服務器驗證的情況下,允許在源和接收方之間可靠傳輸,確保信息的完整性和真實性
2.用處
授權認證,一旦用戶登錄,后續每個請求都包含有JWT,系統在每次處理請求之前,都先進行JWT安全校驗。
3.組成
由3部分組成,用"."拼接
三部分分別是:
-
Header
-
token類型
-
加密算法名稱
-
-
Payload 載荷,存放有效信息
-
標準中注冊的聲明 ---信息安全的分類
-
公共的聲明
-
私有的聲明
-
-
Signature 簽名
-
將加密后的Header和加密后的Payload用點拼接,再將結果通過header中聲明的加密算法進行加密
-
例子
<!--jwt依賴--><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency>
package com.jwt;import com.sun.javafx.binding.StringFormatter;
import io.jsonwebtoken.*;import java.util.Date;
import java.util.UUID;public class Test {// 24hprivate long time = 1000 * 60 * 60 * 24;private String signature = "admin";/*** 測試JWT令牌的生成和配置。* 使用JJWT庫創建一個包含特定頭部、載荷和簽名的JWT令牌。* 頭部配置了令牌的類型和算法。* 載荷包含了用戶名、密碼和主題等信息。* 設置了令牌的過期時間和唯一標識。* 使用HS256算法對令牌進行簽名以確保完整性。*/@org.junit.Testpublic void jwtTest() {// 創建JWT令牌構建器JwtBuilder jwtBuilder = Jwts.builder();// 構建并配置JWT令牌String jwtToken = jwtBuilder// 設置頭部參數,定義令牌類型和算法// header.setHeaderParam("typ", "JWT").setHeaderParam("alg", "HS256")// 設置載荷信息,包含用戶名和密碼// payload.claim("username", "admin").claim("password", "123456")// 設置主題.setSubject("admin-Test")// 設置令牌過期時間.setExpiration(new Date(System.currentTimeMillis() + time))// 設置令牌的唯一標識.setId(UUID.randomUUID().toString())// 設置令牌的發行時間.setIssuedAt(new Date())// 使用HS256算法和簽名密鑰對令牌進行簽名// signature.signWith(SignatureAlgorithm.HS256, signature)// 將令牌緊湊化為最終的字符串表示形式.compact();System.out.println(jwtToken);}/*** 解析JWT令牌。* 該方法演示了如何使用JJWT庫解析一個JWT令牌,并從中提取出聲明信息。* JWT令牌被設計為一種安全的數據傳輸方式,其中包含了用戶信息或其他需要傳遞給服務端的信息。* 在這個例子中,我們解析令牌以獲取用戶名、密碼、令牌ID、主題和過期時間等信息。*/@org.junit.Testpublic void parse(){// 定義一個JWT令牌字符串String jwtToken = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwicGFzc3dvcmQiOiIxMjM0NTYiLCJzdWIiOiJhZG1pbi1UZXN0IiwiZXhwIjoxNzE5ODM1Mzc4LCJqdGkiOiJiOGI2M2QxYy1iODhiLTQ4MDAtOWEyYi0yOTVkY2Q3NDNjMTQiLCJpYXQiOjE3MTk3NDg5Nzh9.Espy5I1IjwuPmnkHx-6TTie_VUP2zLDnasxfNDilclI";// 創建JWT解析器JwtParser jwtParser = Jwts.parser();// 設置解析器的簽名密鑰,并解析JWT令牌為Jws<Claims>對象Jws<Claims> claimsJws = jwtParser.setSigningKey(signature).parseClaimsJws(jwtToken);// 提取聲明信息Claims claims = claimsJws.getBody();// 打印提取的聲明信息:用戶名、密碼、令牌ID、主題和過期時間System.out.println(claims.get("username"));System.out.println(claims.get("password"));System.out.println(claims.getId());System.out.println(claims.getSubject());System.out.println(claims.getExpiration());}}
?