JWT令牌詳解及Java中的使用實戰

JWT令牌詳解及Java中的使用實戰

摘要

本文將深入解析**JWT(JSON Web Token)**的核心概念,通過圖文并茂的方式詳解其工作原理,并手把手教你在Java中實現JWT的生成、驗證與解析。無論你是認證授權新手還是想鞏固知識的老手,都能在這里找到實用干貨!


目錄

  1. 什么是JWT?
  2. JWT結構剖析
  3. Java實現JWT實戰
  4. 核心API詳解
  5. 安全指南
  6. 總結

1. 什么是JWT?

1.1 基本定義

JWT(JSON Web Token) 是一種輕量級的開放標準(RFC 7519),用于在各方之間安全傳輸JSON格式信息。其典型應用場景包括:

  • 🔑 身份認證(如替代Session)
  • 🔒 跨服務安全通信
  • 🌐 跨域認證(如OAuth2)

1.2 核心優勢

特性說明
無狀態服務端無需存儲會話信息
跨語言支持所有主流語言均有成熟實現庫
自包含性令牌自身攜帶用戶信息及元數據
防篡改基于簽名機制保障數據完整性

2. JWT結構剖析

2.1 令牌組成

JWT由三部分通過.連接組成:

header.payload.signature

2.1.1 Header(頭部)
{"alg": "HS256",  // 簽名算法"typ": "JWT"     // 令牌類型
}

Base64Url編碼后形成第一部分

2.1.2 Payload(載荷)

包含聲明(Claims),分為三類:

  • 注冊聲明(預定義字段,如exp過期時間)
  • 公共聲明(自定義但需避免沖突)
  • 私有聲明(業務自定義數據)

示例:

{"sub": "1234567890","name": "John Doe","admin": true,"iat": 1516239022
}

Base64Url編碼后形成第二部分

2.1.3 Signature(簽名)

通過指定算法對前兩部分簽名,確保數據完整。以HS256為例:

HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload),secretKey)

3. Java實現JWT實戰

3.1 環境準備

推薦使用JJWT庫(目前最流行的Java JWT庫):

Maven依賴

<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-api</artifactId><version>0.11.5</version>
</dependency>
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-impl</artifactId><version>0.11.5</version><scope>runtime</scope>
</dependency>
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-jackson</artifactId><version>0.11.5</version><scope>runtime</scope>
</dependency>

3.2 生成JWT令牌

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import java.security.Key;
import java.util.Date;public class JwtDemo {// 生成安全密鑰(HS256需要至少256位)private static final Key SECRET_KEY = Keys.secretKeyFor(SignatureAlgorithm.HS256);private static final long EXPIRATION_TIME = 86400000; // 24小時public static String generateToken(String username) {return Jwts.builder().setSubject(username).setIssuedAt(new Date()).setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME)).claim("role", "admin") // 添加自定義聲明.signWith(SECRET_KEY).compact();}
}

3.3 解析驗證JWT

public static Claims parseToken(String token) {return Jwts.parserBuilder().setSigningKey(SECRET_KEY).build().parseClaimsJws(token).getBody();
}// 使用示例
public static void main(String[] args) {String token = generateToken("user1");System.out.println("Generated Token: " + token);Claims claims = parseToken(token);System.out.println("Subject: " + claims.getSubject());System.out.println("Expiration: " + claims.getExpiration());System.out.println("Role: " + claims.get("role"));
}

4. 核心API詳解

4.1 Jwts.builder() 方法鏈

方法作用
setSubject()設置主題(通常是用戶ID)
setIssuedAt()設置令牌簽發時間
setExpiration()設置過期時間
claim(key, value)添加自定義聲明
signWith(key)指定簽名密鑰和算法

4.2 異常處理

解析時需捕獲以下異常:

  • SignatureException: 簽名不匹配
  • MalformedJwtException: 令牌結構錯誤
  • ExpiredJwtException: 令牌已過期
  • UnsupportedJwtException: 不支持的JWT格式

示例:

try {Claims claims = parseToken(token);
} catch (ExpiredJwtException ex) {System.out.println("令牌已過期!");
} catch (SignatureException ex) {System.out.println("簽名驗證失敗!");
}

5. 安全指南

  1. 密鑰管理

    • 生產環境避免硬編碼密鑰
    • 推薦使用密鑰管理系統(如HashiCorp Vault)
  2. 傳輸安全

    • 必須通過HTTPS傳輸JWT
    • 避免URL參數傳遞(可能被日志記錄)
  3. 存儲策略

    • 瀏覽器端建議使用HttpOnly的Cookie
    • 移動端使用安全存儲(如Android Keystore)
  4. 最佳實踐

    • 設置合理的過期時間(建議≤24小時)
    • 敏感操作要求重新認證
    • 定期輪換簽名密鑰

6. 總結

通過本文,你應當已經掌握:

  • ? JWT的核心組成與工作原理
  • ? 在Java中生成/解析JWT的具體實現
  • ? 安全使用JWT的最佳實踐

Q&A: 歡迎評論區提問交流!👨💻

注:  
1. 實際使用時請替換示例中的GitHub地址、博客鏈接和圖片URL  
2. HS256的密鑰生成方式僅用于演示,生產環境需使用更安全的密鑰管理方案  
3. 建議在Web應用中結合過濾器進行JWT校驗(如Spring Security的`OncePerRequestFilter`)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/82192.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/82192.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/82192.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

晶圓隱裂檢測提高半導體行業效率

半導體行業是現代制造業的核心基石&#xff0c;被譽為“工業的糧食”&#xff0c;而晶圓是半導體制造的核心基板&#xff0c;其質量直接決定芯片的性能、良率和可靠性。晶圓隱裂檢測是保障半導體良率和可靠性的關鍵環節。 晶圓檢測 通過合理搭配工業相機與光學系統&#xff0c…

Java 的 ReentrantLock

Java中的ReentrantLock是java.util.concurrent.locks包下提供的一個可重入互斥鎖&#xff0c;用于替代synchronized關鍵字實現更靈活的線程同步。以下是其核心特性和使用方法的詳細說明&#xff1a; 核心特性 可重入性 同一個線程可以重復獲取同一個鎖&#xff08;鎖的持有計數…

達夢數據庫-學習-23-獲取執行計劃的N種方法

目錄 一、環境信息 二、說點什么 三、測試數據生成 四、測試語句 五、獲取執行計劃方法 1、EXPLAIN &#xff08;1&#xff09;樣例 &#xff08;2&#xff09;優勢 &#xff08;3&#xff09;劣勢 2、ET &#xff08;1&#xff09;開啟參數 &#xff08;2&#xff…

20200201工作筆記常用命令要整理

工作筆記常用命令&#xff1a; 1.repo常用命令&#xff1a; repo sync -c -j10 2. 常用adb命令 錯誤: error: device unauthorized. This adbds $ADB_VENDOR_KEYS is not set; try adb kill-server if that seems wrong. Otherwise check for a confirmation dialog on your d…

PET,Prompt Tuning,P Tuning,Lora,Qlora 大模型微調的簡介

概覽 到2025年&#xff0c;雖然PET&#xff08;Pattern-Exploiting Training&#xff09;和Prompt Tuning在學術界仍有探討&#xff0c;但在工業和生產環境中它們已基本被LoRA/QLoRA等參數高效微調&#xff08;PEFT&#xff09;方法取代 。LoRA因其實現簡單、推理零開銷&#…

9種方法,一鍵美化Python圖表

Matplotlib、Seaborn默認參數不好看&#xff0c;美化需要大量代碼。 本次分享9種方法&#xff0c;一鍵美化圖表&#xff0c;看看那個是你的菜。 1 Matplotlib style sheets Matplotlib內置多類style sheets&#xff0c; 一行代碼使用&#xff0c; plt.style.use(Solarize_Li…

在STM32上配置圖像處理庫

在STM32上配置并使用簡單的圖像濾波庫(以實現均值濾波為例,不依賴復雜的大型圖像處理庫,方便理解和在資源有限的STM32上運行)為例,給出代碼示例,使用STM32CubeIDE開發環境和HAL庫,假設已經初始化好了相關GPIO和DMA(如果有圖像數據傳輸需求),并且圖像數據存儲在一個二…

Android四大組件學習總結

?1. Activity 啟動模式問題? ?面試官?&#xff1a; “我看你項目里用了 SingleTask 模式&#xff0c;能具體說說為什么用它嗎&#xff1f;如果從 Activity A&#xff08;SingleTask&#xff09;跳轉到 B&#xff08;Standard&#xff09;&#xff0c;再返回 A&#xff0c;…

基于SamOutV8的序列生成模型實現與分析

項目概述 本項目實現了基于SamOutV8架構的序列生成模型&#xff0c;核心組件包括MaxStateSuper、FeedForward和DecoderLayer等模塊。通過結合自注意力機制與狀態編碼策略&#xff0c;該模型在處理長序列時表現出良好的性能。 核心組件解析 1. MaxStateSuper&#xff08;狀態編…

從腦電圖和大腦記錄中學習穩健的深度視覺表征

從腦電圖和大腦記錄中學習穩健的深度視覺表征 印度&#xff0c;印度&#xff0c;印度&#xff0c;印度大腦實驗室&#xff0c;印度 例如&#xff0c;達拉普&#xff0c;克普拉薩德&#xff0c;山&#xff0c;山&#xff0c;新的。ac .在 摘要 解碼人類大腦一直是新機器人科學家…

2025.5個人感悟

本人是一名2025級大四學生&#xff0c;離畢業就一個月了&#xff0c;目前論文終稿已寫完&#xff0c;有多的時間可以來寫一寫博客了。 &#xff08;1&#xff09;越焦慮什么&#xff0c;未來就有可能變成什么樣子。以前一直焦慮考不上研&#xff0c;秋招找不到工作&#xff0c…

使用騰訊云3臺輕量云服務器快速部署K8s集群實戰

一、服務器配置 1.集群數量 節點ip備注master10.0.4.9安全組放通&#xff0c;3節點內網互通node110.0.4.14安全組放通&#xff0c;3節點內網互通node210.0.4.17安全組放通&#xff0c;3節點內網互通 2.配置服務器&#xff08;每個節點執行&#xff09; 執行步驟1 #在對應的…

bitbar環境搭建(ruby 2.4 + rails 5.0.2)

此博客為武漢大學WA學院網絡安全課程&#xff0c;理論課大作業Web環境搭建。 博主搭了2天&#xff01;&#xff01;&#xff01;血淚教訓是還是不能太相信ppt上的教程。 一開始嘗試了ppt上的教程&#xff0c;然后又轉而尋找網絡資源 cs155源代碼和docker配置&#xff0c;做到…

leetcode:2469. 溫度轉換(python3解法,數學相關算法題)

難度&#xff1a;簡單 給你一個四舍五入到兩位小數的非負浮點數 celsius 來表示溫度&#xff0c;以 攝氏度&#xff08;Celsius&#xff09;為單位。 你需要將攝氏度轉換為 開氏度&#xff08;Kelvin&#xff09;和 華氏度&#xff08;Fahrenheit&#xff09;&#xff0c;并以數…

python 實現一個完整的基于Python的多視角三維重建系統,包含特征提取與匹配、相機位姿估計、三維重建、優化和可視化等功能

多視角三維重建系統 下面我將實現一個完整的基于Python的多視角三維重建系統,包含特征提取與匹配、相機位姿估計、三維重建、優化和可視化等功能。 1. 環境準備與數據加載 首先安裝必要的庫: pip install opencv-python opencv-contrib-python numpy matplotlib plotly s…

什么是國密、密評、商密

一、國密 定義與本質&#xff1a;國密即國家密碼管理局公布認定的國產密碼算法&#xff0c;也稱為商用密碼&#xff08;在此語境下與國密通用&#xff09;&#xff0c;指能夠實現商用密碼算法的加密、解密和認證等功能的技術&#xff0c;涵蓋密碼算法編程技術和密碼算法芯片、…

打卡35天

模型可視化與推理 知識點回顧&#xff1a; 三種不同的模型可視化方法&#xff1a;推薦torchinfo打印summary權重分布可視化 進度條功能&#xff1a;手動和自動寫法&#xff0c;讓打印結果更加美觀 推理的寫法&#xff1a;評估模式 作業&#xff1a;調整模型定義時的超參數&…

kafka之操作示例

一、常用shell命令 #1、創建topic bin/kafka-topics.sh --create --zookeeper localhost:2181 --replications 1 --topic test#2、查看創建的topic bin/kafka-topics.sh --list --zookeeper localhost:2181#3、生產者發布消息命令 &#xff08;執行完此命令后在控制臺輸入要發…

網絡安全基礎--第七課

路由表 路由器的轉發原理&#xff1a;當一個數據包進入路由器&#xff0c;路由器將基于數據包中的目標IP地址&#xff0c;查詢本地 路由表&#xff0c;若表中存在記錄&#xff0c;則將無條件按記錄轉發&#xff0c;若沒有記錄&#xff0c;路由器不能泛洪&#xff0c;因為路由器…

Java SpringBoot 扣子CozeAI SseEmitter流式對話完整實戰 打字機效果

書接上回&#xff1a;springBoot 整合 扣子cozeAI 智能體 對話https://blog.csdn.net/weixin_44548582/article/details/147457236 上文實現的是一次性等待并得到完整的AI回復內容&#xff0c;但隨著問題和AI的邏輯日趨復雜&#xff0c;會明顯增加這個等待時間&#xff0c;這對…