JWT令牌:實現安全會話跟蹤與登錄認證的利器

摘要:本文深入探討了JWT令牌在實現會話跟蹤和登錄認證方面的應用,詳細介紹了JWT令牌的概念、組成、生成與校驗方法,以及在實際案例中如何通過JWT令牌進行會話跟蹤和登錄認證的具體實現步驟,為系統的安全認證機制提供了全面且深入的技術指導。

關鍵詞:JWT令牌;會話跟蹤;登錄認證;生成與校驗
參考資料:黑馬程序員day12 完整項目請從第10天開始看

一、引言

在基于令牌技術實現會話追蹤的背景下,本文著重介紹功能強大的JWT令牌,它作為用戶身份標識,以字符串形式存在。接下來將詳細闡述JWT令牌的相關知識及在項目中的具體應用。

二、JWT令牌

2.1 介紹

JWT,全稱JSON Web Token,官網為https://jwt.io/ 。它定義了一種簡潔且自包含的格式,用于在通信雙方以json數據格式安全傳輸信息,憑借數字簽名確保信息可靠。

  • 簡潔性:JWT表現為簡單字符串,可在請求參數或請求頭中直接傳遞。
  • 自包含性:雖看似隨機字符串,但可按需求在其中存儲自定義數據,如用戶相關信息。本質上,JWT是對原始json數據格式進行安全封裝,實現通信雙方的安全信息傳輸。

JWT令牌由三部分組成,各部分間以英文點號分隔:

  • Header(頭):記錄令牌類型、簽名算法等信息,例如:{“alg”:“HS256”,“type”:“JWT”} 。
  • Payload(有效載荷):攜帶自定義信息、默認信息等,例如:{“id”:“1”,“username”:“Tom”} 。
  • Signature(簽名):用于防止Token被篡改,確保安全性。它通過將header、payload與指定秘鑰結合,運用指定簽名算法計算得出。簽名機制使得JWT令牌極為安全可靠,一旦令牌中任何部分被篡改,校驗時便會失敗。

生成JWT令牌時,會對JSON格式數據進行base64編碼。Base64是基于64個可打印字符表示二進制數據的編碼方式,使用的字符包括A - Z、a - z、0 - 9、加號、斜杠,共64個字符,另加等號作為補位符號。需注意,Base64是編碼方式,并非加密方式。

JWT令牌典型應用場景為登錄認證,流程如下:

  1. 瀏覽器發起登錄請求,訪問登錄接口,若登錄成功,生成JWT令牌并返回給前端。
  2. 前端接收JWT令牌后存儲,后續每次請求將其攜帶至服務端
  3. 服務端統一攔截請求,判斷是否攜帶令牌。若無令牌,拒絕訪問;若有令牌,校驗其有效性,有效則放行處理請求。

2.2 生成和校驗

為在Java代碼中生成和校驗JWT令牌,首先需引入JWT依賴:

<!-- JWT依賴-->
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version>
</dependency>

引入依賴后,可借助工具類Jwts提供的API完成操作。

  • 生成JWT代碼實現
@Test
public void genJwt(){Map<String,Object> claims = new HashMap<>();claims.put("id",1);claims.put("username","Tom");String jwt = Jwts.builder().setClaims(claims) //自定義內容(載荷)          .signWith(SignatureAlgorithm.HS256, "itheima") //簽名算法        .setExpiration(new Date(System.currentTimeMillis() + 24*3600*1000)) //有效期   .compact();System.out.println(jwt);
}

運行上述測試方法,輸出的結果即為生成的JWT令牌。可將令牌復制至JWT官網,粘貼于Encoded位置,自動解析令牌。解析后,第一部分顯示所用簽名算法為HS256;第二部分為自定義數據及設置的過期時間(exp),因前兩部分采用base64編碼,可直接解碼;第三部分由簽名算法計算得出,無法直接解析。https://jwt.io/#debugger-io
在這里插入圖片描述

校驗JWT令牌(解析生成的令牌)

@Test
public void parseJwt(){Claims claims = Jwts.parser().setSigningKey("itheima")//指定簽名密鑰(必須保證和生成令牌時使用相同的簽名密鑰)  .parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwiZXhwIjoxNjcyNzI5NzMwfQ.fHi0Ub8npbyt71UqLXDdLyipptLgxBUg_mSuGJtXtBk").getBody();System.out.println(claims);
}

運行該測試方法,若解析過程未報錯,說明解析成功,可看到解析出的id和過期時間。若篡改令牌(如修改header中的數字),解析時會報錯,表明JWT令牌被篡改。此外,修改生成令牌時設置的過期時間,過期后再解析也會報錯,說明JWT令牌過期后失效。

使用JWT令牌時需注意:

  • JWT校驗所用簽名秘鑰必須與生成JWT令牌時的秘鑰配套。
  • 若JWT令牌解析校驗報錯,則表明令牌被篡改或已失效,即令牌非法。

2.3 登錄下發令牌

完成JWT令牌生成和校驗的基礎學習后,著手在案例中運用JWT令牌技術跟蹤會話,主要包含生成令牌和校驗令牌兩步。首先實現登錄成功后生成JWT令牌并返回給前端。

查看登錄接口文檔的響應數據部分可知,登錄成功后系統下發JWT令牌,后續請求需在請求頭header中以“token”為名稱,攜帶登錄時下發的JWT令牌。若檢測到用戶未登錄,返回固定錯誤信息。

實現步驟

  • 引入JWT工具類:在項目工程下創建com.itheima.utils包,并將提供的JWT工具類復制到該包下。
  • 登錄完成后,調用工具類生成JWT令牌并返回

JWT工具類

public class JwtUtils {private static String signKey = "itheima";//簽名密鑰private static Long expire = 43200000L; //有效時間/*** 生成JWT令牌* @param claims JWT第二部分負載 payload 中存儲的內容* @return*/public static String generateJwt(Map<String, Object> claims){String jwt = Jwts.builder().addClaims(claims)//自定義信息(有效載荷).signWith(SignatureAlgorithm.HS256, signKey)//簽名算法(頭部).setExpiration(new Date(System.currentTimeMillis() + expire))//過期時間.compact();return jwt;}/*** 解析JWT令牌* @param jwt JWT令牌* @return JWT第二部分負載 payload 中存儲的內容*/public static Claims parseJWT(String jwt){Claims claims = Jwts.parser().setSigningKey(signKey)//指定簽名密鑰.parseClaimsJws(jwt)//指定令牌Token.getBody();return claims;}
}

登錄成功,生成JWT令牌并返回

@RestController
@Slf4j
public class LoginController {//依賴業務層對象@Autowiredprivate EmpService empService;@PostMapping("/login")public Result login(@RequestBody Emp emp) {//調用業務層:登錄功能Emp loginEmp = empService.login(emp);//判斷:登錄用戶是否存在if(loginEmp !=null ){//自定義信息Map<String , Object> claims = new HashMap<>();claims.put("id", loginEmp.getId());claims.put("username",loginEmp.getUsername());claims.put("name",loginEmp.getName());//使用JWT工具類,生成身份令牌String token = JwtUtils.generateJwt(claims);return Result.success(token);}return Result.error("用戶名或密碼錯誤");}
}

簽名算法大致分類

對稱加密算法

  • HS256(HMAC with SHA - 256):使用 HMAC(Hash - based Message Authentication Code)算法結合 SHA - 256 哈希函數。在使用 HS256 算法時,服務器端和客戶端共享一個相同的密鑰(secret)。服務器使用該密鑰和 HS256 算法對頭部和載荷進行簽名生成
    JWT。客戶端收到 JWT 后,使用相同的密鑰和算法重新計算簽名,并與 JWT 中的簽名進行對比,若一致則說明 JWT 未被篡改。
  • HS384(HMAC with SHA - 384):類似于 HS256,只是使用了 SHA - 384 哈希函數,提供更高的安全性,但計算成本也相對較高。
  • HS512(HMAC with SHA - 512):使用 SHA - 512 哈希函數,安全性更高,但計算開銷也更大,適用于對安全性要求極高的場景。

非對稱加密算法

  • RS256(RSA Signature with SHA - 256):基于 RSA(Rivest - Shamir - Adleman)非對稱加密算法和 SHA - 256 哈希函數。服務器使用私鑰對頭部和載荷進行簽名生成 JWT,客戶端使用對應的公鑰來驗證簽名。這種方式無需在客戶端和服務器之間共享密鑰,提高了安全性,常用于分布式系統或對安全性要求較高的場景。
  • RS384(RSA Signature with SHA - 384):使用 RSA 算法結合 SHA - 384 哈希函數。
  • RS512(RSA Signature with SHA - 512):使用 RSA 算法結合 SHA - 512 哈希函數。

橢圓曲線算法

  • ES256(Elliptic Curve Signature with SHA - 256):基于橢圓曲線密碼學(ECC)和 SHA - 256 哈希函數。與 RSA 相比,橢圓曲線算法在相同的安全強度下,密鑰長度更短,計算速度更快,適用于對性能要求較高且對安全性有一定要求的移動設備或資源受限的環境。
  • ES384(Elliptic Curve Signature with SHA - 384):使用橢圓曲線算法結合 SHA - 384 哈希函數。
  • ES512(Elliptic Curve Signature with SHA - 512):使用橢圓曲線算法結合 SHA - 512 哈希函數。

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

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

相關文章

Mybtis和Mybatis-Plus區別

MyBatis 和 MyBatis-Plus 是 Java 中常用的持久層框架&#xff0c;MyBatis-Plus 是在 MyBatis 基礎上增強的工具包&#xff0c;讓開發更便捷、高效。下面是兩者主要的區別&#xff1a; ? 核心區別總結&#xff1a; 特性MyBatisMyBatis-Plus配置復雜度需要手寫大量 XML 或注解…

JavaScript 性能優化實戰

一、代碼執行效率優化 1. 減少全局變量的使用 全局變量在 JavaScript 中會掛載在全局對象(瀏覽器環境下是window,Node.js 環境下是global)上,頻繁訪問全局變量會增加作用域鏈的查找時間。 // 反例:使用全局變量 var globalVar = example; function someFunction() {con…

學習筆記十六——Rust Monad從頭學

&#x1f9e0; 零基礎也能懂的 Rust Monad&#xff1a;逐步拆解 三大定律通俗講解 實戰技巧 &#x1f4e3; 第一部分&#xff1a;Monad 是什么&#xff1f; Monad 是一種“包值 鏈操作 保持結構”的代碼模式&#xff0c;用來處理帶上下文的值&#xff0c;并方便連續處理。 …

PL/SQL登錄慢,程序連接Oracle 提示無法連接或無監聽

PL/SQL登錄慢&#xff0c;程序連接Oracle 提示無法連接或無監聽 錯誤提示&#xff1a;ORA-12541: TNS: 無監聽程序 的解決辦法&#xff0c; 現象&#xff1a;PL/SQL登錄慢&#xff0c;程序連接Oracle 提示無法連接或無監聽 監聽已經正常開起&#xff0c;但還是PL/SQL登錄慢或…

Windows10,11賬戶管理,修改密碼,創建帳戶...

在這里&#xff0c;我們使用微軟操作系統的一款工具:netplwiz 它可以非常便捷的管理用戶賬戶. 一:修改密碼(無需現在密碼) 01修改注冊表 運行命令&#xff1a;regedit 在地址欄輸入&#xff1a; HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Passwor…

電腦 BIOS 操作指南(Computer BIOS Operation Guide)

電腦 BIOS 操作指南 電腦的BIOS界面&#xff08;應為“BIOS”&#xff09;是一個固件界面&#xff0c;允許用戶配置電腦的硬件設置。 進入BIOS后&#xff0c;你可以進行多種設置&#xff0c;具體包括&#xff1a; 1.啟動配置 啟動順序&#xff1a;設置從哪個設備啟動&#x…

iOS 冷啟動時間監控:啟動起點有哪些選擇?

?? iOS 冷啟動時間監控&#xff1a;啟動起點有哪些選擇&#xff1f; 作者&#xff1a;侯仕奇 來源&#xff1a;sqi.io 在監控 iOS 冷啟動性能時&#xff0c;一個關鍵問題是&#xff1a;如何精確記錄 App 冷啟動的開始時間&#xff1f; 本文將對不同的“冷啟動起點”監控方式…

onlyoffice關閉JWT后依然報錯如何解決?

onlyoffice關閉JWT后依然報錯如何解決&#xff1f; 一、部署方式 我是以docker方式部署的&#xff0c;直接通過環境變量禁用了JWT&#xff0c;命令如下&#xff1a; docker run -d \--name onlyoffice-no-jwt \--restartalways \-p 8069:80 \-e JWT_ENABLEDfalse \onlyoffic…

rk3588 驅動開發(一)字符設備開發

3.字符設備驅動開發 3.1 什么是字符設備驅動 字符設備&#xff1a;就是一個個字節&#xff0c;按照字節流進行讀寫操作的設備&#xff0c;讀寫是按照先后順序的。 舉例子&#xff1a;IIC 按鍵 LED SPI LCD 等 Linux 應用程序調用驅動程序流程&#xff1a; Linux中驅動加載成功…

設計模式 --- 外觀模式

外觀模式是一種結構型設計模式&#xff0c;為復雜子系統提供??統一的高層接口??&#xff0c;通過定義一個外觀類來??簡化客戶端與子系統的交互??&#xff0c;降低系統耦合度。這種模式隱藏了子系統的復雜性&#xff0c;將客戶端與子系統的實現細節隔離開來&#xff0c;…

我的gittee倉庫

日常代碼: 日常代碼提交https://gitee.com/xinxin-pingping/daily-code 有需要的寶子們可自行讀取。

微服務調用中的“大對象陷阱”:CPU飆高問題解析與優化

背景 對幾十萬條用戶歷史存量數據寫入&#xff0c;且存在大對象的基礎上。kafka消費進行消費寫mysql超時。導致上游服務調用時異常&#xff0c;CPU飆高異常。 大對象解釋 大對象的定義與危害 1. 什么是大對象&#xff1f; JVM 內存分配機制&#xff1a;Java 中對象優先分配…

代碼隨想錄算法訓練營day6(字符串)

華子目錄 反轉字符串思路 反轉字符串II思路 替換數字思路 反轉字符串 https://leetcode.cn/problems/reverse-string/ 思路 使用雙指針&#xff0c;初始化時&#xff0c;left指向下標0的位置&#xff0c;right指向最后一個元素的下標當while left<right時&#xff0c;交換…

Oracle 19c新特性:OCP認證考試與職業躍遷的關鍵?

在數字化轉型的浪潮中&#xff0c;Oracle 19c作為數據庫領域的旗艦版本&#xff0c;不僅承載著技術革新的使命&#xff0c;更成為IT從業者職業進階的“黃金跳板”。無論是企業級應用的高可用性需求&#xff0c;還是云原生架構的快速迭代&#xff0c;Oracle 19c的智能化與多模型…

【MySQL數據庫入門到精通】

文章目錄 一、SQL分類二、DDL-數據庫操作1.查詢2.創建數據庫3.刪除數據庫4.使用數據庫 三、DDL-表操作1.查詢 一、SQL分類 根據功能主要分為DDL DML DQL DCL DDL:Date Definition Language數據定義語言&#xff1a;定義數據庫&#xff0c;表和字段 DML:Date Manipulatin Lan…

MCP服務端開發

MCP(Memory, Context, Planning)是一種增強AI系統認知能力的框架,通過整合記憶管理、上下文理解和規劃能力,可以顯著提升AI系統的表現。下面我將為您開發一個完整的MCP服務端。 概述 我們將使用Python開發一個基于FastAPI的MCP服務端,包含以下核心組件: Memory Manager…

前端:uniapp中uni.pageScrollTo方法與元素的overflow-y:auto之間的關聯

在uniapp中&#xff0c;uni.pageScrollTo方法與元素的overflow-y:auto屬性之間存在以下關聯和差異&#xff1a; 一、功能定位差異 ?uni.pageScrollTo? 屬于?頁面級滾動控制?&#xff0c;作用于整個頁面容器?34。要求頁面內容高度必須超過屏幕高度&#xff0c;且由根元素下…

基礎知識-指針

1、指針的基本概念 1.1 什么是指針 1.1.1 指針的定義 指針是一種特殊的變量&#xff0c;與普通變量存儲具體數據不同&#xff0c;它存儲的是內存地址。在計算機程序運行時&#xff0c;數據都被存放在內存中&#xff0c;而指針就像是指向這些數據存放位置的 “路標”。通過指針…

VS遠程Linux_CMake項目搭建

VS遠程Linux CMake項目搭建 準備工作 遠程計算機上安裝 gcc: 一個開源的編譯器集合, GCC支持多種編程語言的編譯&#xff0c;包括C、C、Objective-C、Fortran、Ada、Go、D和Javagdb: GDB&#xff08;GNU Debugger&#xff09;是一個功能強大的調試工具&#xff0c;主要用于調…

替代升級VMware | 云軸科技ZStack構建山西證券一云多芯云平臺

通過云軸科技ZStack Cloud云平臺&#xff0c;山西證券打造了敏捷部署、簡單運維的云平臺&#xff0c;不僅兼容x86、海光、鯤鵬三種異構服務器實現一云多芯&#xff0c;還通過云平臺虛擬化納管模塊納管原有VMware虛擬化資源&#xff0c;并對接第三方集中式存儲&#xff0c;在保護…