java框架 token_Java安全框架(三):JWT(Json Web Token)
一、概述
1、什么是無狀態?
簡單講,服務里面一定要存一個session那就是有狀態,不需要存就是無狀態
2、服務架構演進
單體架構(有狀態)
缺陷:Session在服務器中,如果服務器有多個,由于服務器輪詢,會造成頻繁跳轉登錄;服務器開銷大
分布式架構:Redis集中管理session(有狀態)
缺陷:服務端要一直維持session狀態,redis掛掉了,所有用戶要重新登錄;服務器開銷大
微服務架構:JWT(無狀態)
優勢:登陸后返回jwt,以后每次用戶會攜帶jwt發送請求,服務端不需要再維持session狀態
二、JWT基礎知識
1、什么是JWT
通過json的形式作為web應用中的令牌,用于各方之間安全的信息傳輸。(json web token)
優勢
2、JWT結構
(1)結構
標頭(Header).有效載荷(Payload).簽名(Signature)
Header
{
“alg”: “HS256”, // 簽名算法
“typ”: “JWT” // 令牌類型
}
// 對上面做Base64編碼
base64UrlEncode(header)
Payload(有效負荷中不要放敏感信息,因為Base64編碼是可以解碼的)
{
“sub”: “1234567890”,
“name”: “tom”,
“admin”: true
}
// 對上面做Base64編碼
base64UrlEncode(payload)
Signature(防止Header和Payload被篡改)
HMACSHA256(base64UrlEncode(header) + “.” + base64UrlEncode(payload), “secret”);
(2)解密
(3)驗證
將傳入的token的第1、2部分加上secret進行加密,如果跟第3部分相同,則驗證通過。
HMACSHA256(base64UrlEncode(header) + “.” + base64UrlEncode(payload), “secret”);
3、JWT認證流程
三、JWT簡單使用
1、引入依賴
com.auth0
java-jwt
3.4.0
2、生成token
Calendar instance = Calendar.getInstance();
instance.add(Calendar.DATE, 6);
// 生成令牌
String token = JWT.create()
.withClaim("username", "張三") // 自定義用戶名
.withExpiresAt(instance.getTime()) // 設置過期時間
.sign(Algorithm.HMAC256("securityJWT")); // 設置簽名
// 輸出令牌
System.out.println(token);
生成的token
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1OTgzNDM5NDAsInVzZXJuYW1lIjoi5byg5LiJIn0.2mfqA8AMn9rK-OpKDYEbOO8hWb5DSdVOmL0a_mxq5CE
3、根據令牌和簽名解析數據
// 創建驗證對象
JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256("securityJWT")).build();
DecodedJWT decodedJWT = jwtVerifier.verify(“eyJ0eXAiOiJKV1Q...jkfSgrqD7BtZg7GeA");
System.out.println("用戶名:" + decodedJWT.getClaim("username").asString());
System.out.println("過期時間:" + decodedJWT.getExpiresAt());
四、單點登錄
1、什么是單點登錄?
我們在某寶中,可以看到,里面有很多別的應用,而我們想要用,直接點就行了,并不需要再次登錄,這就是單點登錄。
2、單點登陸的原理
多個應用間是通過token進行傳輸,當你登錄某寶之后,會產生一個token,在你后續訪問過程中都會攜帶這個token,而當你點擊其他應用時,也會把token傳過去,應用會對token進行解密驗證,驗證成功,即可訪問。
總結
以上是生活随笔為你收集整理的java框架 token_Java安全框架(三):JWT(Json Web Token)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【ZYNQ】T9+控制板硬件概览与修复
- 下一篇: 微型计算机退换货修理及规定,电脑家电“三