浅析JWT| JWT是啥子,Java构建JWT
小聲bbb
說到系統的安全識別,記得自己第一個項目,用的就是session,用戶登錄進來以后,給他session標記登錄,記錄id進去,輕輕松松,設計的操作也很簡單,類似操作HashMap。
這大概也有1年多快兩年了,現在回頭看真的是可怕,幾乎在裸奔
眾所周知,平常使用的Session是存儲在服務器的一種技術,可以理解為一個會話id,每次使用HTTP請求,都會攜帶一個sessionId,服務器根據這個SessionId去找對應的session
session一遍是和cookie搭配使用的,cookie是不安全的,毋容置疑(很多瀏覽器沒限制讀取),session則是系統生成的一個較長的sessionId,在過期時間內破解session比較困難。
關于session安全性文章,搜一下csdn,很多的
Session安全性
しかし,我預判了你的預判
Session可以理解為是存儲在服務器端,key叫sessionId的一個map結構。
Session類似于打電話(沒有來電號碼顯示),在一開始你表明了自己的身份,通話結束后,就失去了效果(實際上使用的是過期的手段)。
當訪問的數量增加,記錄登錄成為一個很大的壓力(有記錄,有過期操作等,每個人的session信息都要進行維護,且需要存儲),是否有一種服務器不用操心的辦法?
那么下面就是JWT(或者叫Token)發光發熱的舞臺了!
只是為了構建JWT請快步到相應的位置
正文目錄
- 小聲bbb
- 啥是JWT
- 細說JWT
- JWT 的幾個特點
- 現在來完成一個JWT的實現
- 第一步,導入maven
- 第二步,編寫Token的生成邏輯
- 編寫解密驗證的邏輯
啥是JWT
JWT的全稱JSON Web Token
這里我先簡單說一下JWT是個啥東西,然后分析為什么好用
JWT可以看做一個身份證,
眾所周知,身份證有這幾個特性:
- 身份證不能偽造(別動歪腦筋)
- 身份證上有個人信息
- 身份證上有簽發機關
- 身份證上有有效期
事實上,這幾乎就是JWT了
JWT的特性完全相同,甚至可以用理解身份證的角度來理解他
咳咳,不搞hs,回到正軌,通過我們一本正經的分析,
我們不難發現:Token可以做到在你臉前裸奔,但你卻無可奈何
盤點主要特性:
- 存儲簡單的信息,并且大家都能獲取信息
- 無法作假
- 存在過期
其中第一點很重要,token里面的信息是公開的,所以別放密碼.
這里插一嘴,jwt里面的信息確實是公開的,只不過大家都進行了二次加密,讓人感覺好像jwt里面的信息是不公開的
@某大學某實驗室的某學弟
細說JWT
JWT通常情況下是三段,但是也存在一些喪心病狂的,把token又加密了一遍(內行,我直呼內行)
下面是官方給的一個demo(例子)
這個網站也是可以訪問的,可以自己試著玩,也可以用來測試
https://jwt.io/
其中很明顯為三個部分:HEADER(頭部)、PAYLOAD(數據)、VERIFY SIGNATURE(簽名)
- 頭部:這個token使用了什么加密算法
- 數據:自己定的,想塞什么塞什么,一般有規定的幾個內容
- 簽名:可以理解為使用秘鑰加密后得到的一個不可逆加密(存密碼用的很多,原理類似)
其中數據(PAYLOAD)官方定了這幾個部分:
iss (issuer):簽發人exp (expiration time):過期時間sub (subject):主題aud (audience):受眾nbf (Not Before):生效時間iat (Issued At):簽發時間jti (JWT ID):編號簽名(Signature )部分是對前兩部分的簽名,防止數據篡改。
首先,需要指定一個密鑰(secret)。這個密鑰只有服務器才知道,不能泄露給用戶。然后,使用 Header 里面指定的簽名算法(默認是 HMAC SHA256),按照下面的公式產生簽名。
HMACSHA256(base64UrlEncode(header) + "." +base64UrlEncode(payload),secret)算出簽名以后,把 Header、Payload、Signature 三個部分拼成一個字符串,每個部分之間用"點"(.)分隔,就可以返回給用戶。
JWT 的幾個特點
上面用比較形象的方式描述了JWT,下面用官方的話來總結特點
現在來完成一個JWT的實現
詳細大家都有maven的經驗了
實在不會可以去maven倉庫把jar包下載
你用你三歲時就買來的鍵盤,輕松的使用這個jjwt框架,并老老實實的按照我給的流程感♂受
第一步,導入maven
<!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt --><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency>第二步,編寫Token的生成邏輯
public static String tokens(Map<String, Object> claims, String secretKey, int millisecond, String jwtIssuer, String jwtAud) {//獲取當前的時間Calendar calendar = Calendar.getInstance();Date date = new Date(System.currentTimeMillis());calendar.setTime(date);//向后退后秒數calendar.add(Calendar.MILLISECOND, millisecond);Date endTime = calendar.getTime();JwtBuilder builder = Jwts.builder().setClaims(claims).signWith(SignatureAlgorithm.HS256, secretKey).setClaims(claims).setIssuedAt(new Date()).setExpiration(endTime).setIssuer(jwtIssuer).setAudience(jwtAud);return builder.compact();}JwtBuilder 是jjwt提供的工具,可以很輕松的構建出一個jwt,利用Builder設計模式,對內容進行定義
其中payload的自定義內容是使用map保存的
編寫解密驗證的邏輯
public static Claims parse(String jwt, String secretKey) throws JwtExpireException, JwtVerifyException , JwtNotExistException{Claims claims = null;try {claims = Jwts.parser().setSigningKey(secretKey).parseClaimsJws(jwt).getBody();} catch (ExpiredJwtException expiredJwtException) {throw new ExpiredJwtException("token過期");} catch (JwtException jwtException) {throw new JwtException("JWT驗證錯誤");} catch (IllegalArgumentException illegalArgumentException) {throw new IllegalArgumentException("Token為空");}return claims;}Claims類就是你的PAYLOAD,可以直接取出信息使用,不拋出異常就視為成功了,如果希望信息隱藏,使用自己的秘鑰二次加密即可。
一鍵三連,支持弟弟
寫到這里,就完成了基礎的內容了,為了我們用起來更爽,
可以自行進行二次封裝,體驗更棒
總結
以上是生活随笔為你收集整理的浅析JWT| JWT是啥子,Java构建JWT的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js中公有方法、特权方法、静态方法
- 下一篇: linux pdf翻译