JWT (Json Web Token)教程
頭
JWT第一部分是header,header主要包含兩個部分,alg指加密類型,可選值為HS256、RSA等等,typ=JWT為固定值,表示token的類型。。
{"typ": "JWT","alg": "HS256" }載體
JWT第二部分是payload,payload是token的詳細內容,一般包括iss?(發行者),?exp?(過期時間),?sub(用戶信息),?aud?(接收者),以及其他信息,詳細介紹請參考官網,也可以包含自定義字段。
{"iat": 1493090001,"name": "張三" } iss:Issuer,發行者 sub:Subject,主題 aud:Audience,觀眾 exp:Expiration time,過期時間 nbf:Not before iat:Issued at,發行時間 jti:JWT ID簽名
JWT第二部分是signature,這部分的內容是這樣計算得來的:
Base64(header).Base64(payload)得到一個Base64編碼的字符串(下文成EncodeString)
HS256(EncodeString,"秘鑰");計算得到的即使簽名。
計算得到上面三部分內容后,用.連接起來就是一個完整的 JWT TOKEN,秘鑰是保存在服務器上的一個私有密鑰。
將頭部、聲明、簽名用.號連在一起就得到了我們要的JWT。
eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1MTUyOTgxNDEsImtleSI6InZhdWxlIn0.orewTmil7YmIXKILHwFnw3Bq1Ox4maXEzp0NC5LRaFQ和Session方式存儲id的差異
Session方式存儲用戶id的最大弊病在于要占用大量服務器內存,對于較大型應用而言可能還要保存許多的狀態。一般而言,大型應用還需要借助一些KV數據庫和一系列緩存機制來實現Session的存儲。
而JWT方式將用戶狀態分散到了客戶端中,可以明顯減輕服務端的內存壓力。除了用戶id之外,還可以存儲其他的和用戶相關的信息,例如用戶角色,用戶性別等。
java 使用 jwt
引入jar
<!--JWT--> <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.0</version> </dependency>demo
package user;import io.jsonwebtoken.*; import org.joda.time.DateTime; import org.junit.Test;import java.util.Date;public class JWT {private static final String PRIVATE_KEY = "123456789";@Testpublic void jwtTest() throws InterruptedException {// 設置3秒后過期String jwt = this.buildJwt(DateTime.now().plusSeconds(3).toDate());System.out.println(jwt);// 驗證token是否可用boolean isOk = this.isJwtValid(jwt);System.out.println(isOk);}public String buildJwt(Date exp) {String jwt = Jwts.builder().signWith(SignatureAlgorithm.HS256, PRIVATE_KEY)//SECRET_KEY是加密算法對應的密鑰,這里使用額是HS256加密算法.setExpiration(exp)//expTime是過期時間.claim("key", "vaule")//該方法是在JWT中加入值為vaule的key字段.compact();return jwt;}public boolean isJwtValid(String jwt) {try {//解析JWT字符串中的數據,并進行最基礎的驗證Claims claims = Jwts.parser().setSigningKey(PRIVATE_KEY)//SECRET_KEY是加密算法對應的密鑰,jjwt可以自動判斷機密算法.parseClaimsJws(jwt)//jwt是JWT字符串.getBody();String vaule = claims.get("key", String.class);//獲取自定義字段key//判斷自定義字段是否正確if ("vaule".equals(vaule)) {return true;} else {return false;}}//在解析JWT字符串時,如果密鑰不正確,將會解析失敗,拋出SignatureException異常,說明該JWT字符串是偽造的//在解析JWT字符串時,如果‘過期時間字段’已經早于當前時間,將會拋出ExpiredJwtException異常,說明本次請求已經失效catch (SignatureException | ExpiredJwtException e) {return false;}} }
總結
以上是生活随笔為你收集整理的JWT (Json Web Token)教程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用itextpdf操作pdf
- 下一篇: OkHttp学习