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