JWT總結

JWT(JSON Web Tokens)是一種用于在雙方之間安全傳輸信息的簡潔的、URL安全的令牌標準。以下是關于JWT的結構、作用、優點以及可能出現的問題的詳細解答:

一、JWT的結構

JWT的結構由三個部分組成,它們通過.(點)分隔:

  1. 頭部(Header):頭部通常由兩部分組成,第一部分是令牌的類型,即JWT;第二部分是使用的加密算法,比如HMAC SHA256或RSA等。頭部信息經過Base64編碼后形成JWT的第一部分。
  2. 載荷(Payload):載荷部分包含了要傳輸的聲明(claims)。聲明是關于實體(通常是用戶)和其他數據的聲明。聲明分為三種類型:注冊聲明(如iss發行人、exp過期時間等)、公共聲明(自定義的聲明,如user_idusername等)和私有聲明(不建議定義與注冊聲明和公共聲明相同的名稱)。載荷也使用Base64編碼進行序列化。
  3. 簽名(Signature):簽名部分是對頭部和載荷進行簽名生成的,用于驗證消息的完整性和來源。簽名的生成需要使用密鑰,只有擁有密鑰的一方才能對消息進行簽名和驗證。簽名部分同樣經過Base64編碼。

二、JWT的作用

JWT的主要作用是作為一種安全的令牌,在網絡應用的各方之間傳遞信息,確保信息的完整性和真實性。具體來說,JWT的作用包括:

  1. 身份驗證:JWT可以作為身份驗證的憑證,用于驗證用戶的身份,確保用戶有權訪問受保護的資源或執行特定操作。
  2. 信息交換:JWT可以在各方之間安全地傳輸信息,無需在服務器端保存會話信息,簡化了服務器的架構并提高了系統的可擴展性。
  3. 授權:JWT可以包含用戶的角色、權限等信息,用于授權用戶對特定資源或操作的訪問權限。
  4. 單點登錄(SSO):JWT可以用于實現單點登錄系統,用戶只需在一個系統上登錄,就可以在其他所有相互信任的系統上獲得授權而無需重新登錄。

三、JWT的優點

JWT的優點主要包括:

  1. 簡單輕量:JWT使用簡單的JSON格式,易于理解和使用。它是一種輕量級的身份驗證和授權方案,適用于不同類型的應用程序。
  2. 分布式和無狀態:由于JWT包含了所有必要的信息,服務器不需要在數據庫中存儲會話信息,也無需在集群中共享會話狀態。這使得應用程序可以輕松地進行水平擴展。
  3. 跨域支持:JWT可以通過HTTP頭或URL參數發送,因此可以輕松地跨域傳輸,并且沒有額外的設置或配置需要。
  4. 安全性:JWT使用數字簽名或加密機制來驗證數據的完整性和安全性。服務器可以使用密鑰對令牌進行簽名,并在每次請求中進行驗證,確保令牌不被篡改或偽造。
  5. 可擴展性:JWT是基于標準的JSON格式,因此可以通過添加自定義字段來輕松地擴展令牌的功能,以滿足特定的應用程序需求。

四、JWT可能出現的問題

盡管JWT具有許多優點,但在使用過程中也可能會出現一些問題,主要包括:

  1. 令牌體積大:如果JWT中包含了大量的聲明信息,那么生成的令牌體積可能會相對較大,這可能會增加網絡傳輸的負擔。需要權衡Token大小和網絡傳輸性能,并可能考慮使用壓縮算法或分段傳輸等方式來減小Token的大小。
  2. 令牌安全性問題
    • 敏感信息泄露:由于JWT在客戶端可以被解碼(盡管簽名部分無法偽造),因此不建議在JWT中存儲敏感信息。如果必須存儲敏感信息,應確保使用HTTPS等安全協議來保護JWT的傳輸。
    • 令牌篡改:如果JWT被中間人截獲并篡改,那么服務器在驗證JWT時可能會受到欺騙。因此,應確保使用安全的算法和密鑰來生成和驗證JWT。
    • 密鑰管理:密鑰的安全管理是JWT安全性的關鍵。如果密鑰被泄露,那么攻擊者可以偽造JWT進行攻擊。因此,需要采取適當的密鑰管理措施來保護密鑰的安全。
  1. 令牌無法撤銷:JWT一旦生成并發送給客戶端,就無法被撤銷。如果令牌被盜取或泄露,攻擊者可以一直使用該令牌進行訪問,直到令牌過期。為了解決這個問題,可以設置較短的過期時間,并在服務器端記錄Token的黑名單或使用JWT撤銷列表等方式來實現注銷。
  2. 性能問題:在高負載系統中,驗證和解析JWT可能會消耗大量內存和CPU資源。為了優化性能,可以考慮對JWT的驗證和解析過程進行優化,例如使用緩存機制來存儲已驗證的JWT等。
  3. CSRF攻擊:在某些情況下,JWT可能會被用于認證CSRF(跨站請求偽造)攻擊。為了防止此類攻擊,需要采取適當的CSRF保護措施

五、demo

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;import java.util.Calendar;
import java.util.Map;/*** Jwt 工具類*/
public class JwtUtils {//自定義密鑰private static final String SIGN = "qwer";/*** 生成 Token* @param map 自定義的載荷數據* @return 返回 Token*/public static String createToken(Map<String, String> map) {//1.設置過期時間(默認 1 天過期)Calendar instance = Calendar.getInstance();instance.add(Calendar.MINUTE, 1);//2.創建 jwt builder,添加自定義的載荷數據JWTCreator.Builder builder = JWT.create();for(Map.Entry<String, String> entry : map.entrySet()) {builder.withClaim(entry.getKey(), entry.getValue());}//3.生成 TokenString token = builder.withExpiresAt(instance.getTime()) //過期時間.sign(Algorithm.HMAC256(SIGN));// signreturn token;}/*** 驗證 Token 合法性* @param token*/public static boolean checkToken(String token) {try {JWT.require(Algorithm.HMAC256(SIGN)).build().verify(token);} catch (Exception e) {e.printStackTrace();return false;}return true;}/*** 獲取 Token 信息* @param token* @return*/public static DecodedJWT getTokenInfo(String token) {DecodedJWT verify = JWT.require(Algorithm.HMAC256(SIGN)).build().verify(token);return verify;}}
    @GetMapping("/login")@ResponseBodypublic String login(String name) {//2.校驗密碼User dbUser = dbMap.get(name);if (dbUser == null) {return "not found user";}HashMap<String, String> map = new HashMap<>();map.put("name", name);String token = JwtUtils.createToken(map);cache.put(token, dbUser);return token;}@GetMapping("/checkToken")@ResponseBodypublic Boolean checkToken(String token) {System.out.println("checkToken---------------token" + token);return JwtUtils.checkToken(token);}@GetMapping("/logout")@ResponseBodypublic void logout(String token) {System.out.println("logout---------------token" + token);User user = cache.get(token);cache.remove(token);}

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

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

相關文章

fastadmin框架后臺列表固定第一行列表固定頭部

在列表中&#xff0c;如果列表字段很多&#xff0c;并且每頁數量很多&#xff0c;往下拉的時候就不好辨別數據是哪個字段的&#xff0c;對用戶造成不好的瀏覽體驗。 通過以下方法&#xff0c;可以實現將列表的第一行&#xff0c;也就是頭部&#xff0c;固定在第一行顯示&#…

TLS與SSL的區別

目錄 一、協議版本二、安全性三、性能四、兼容性五、總結 TLS&#xff08;Transport Layer Security&#xff09;和SSL&#xff08;Secure Sockets Layer&#xff09;都是為了保障互聯網通信安全而設計的協議&#xff0c;主要用于加密客戶端與服務器之間的數據傳輸。盡管它們的…

14-62 劍和詩人36 - 混合專家 (MoE) 擴展 AI 視野

了解混合專家 (MoE) 混合專家 (MoE) 是一種機器學習技術&#xff0c;它將多個“專家”神經網絡模型組合成一個更大的模型。MoE 的目標是通過組合專業專家&#xff08;每個專家專注于不同的子領域&#xff09;來提高 AI 系統的準確性和能力。 MoE 模型的一些關鍵特征&#xff1…

探索Kotlin:從K1到K2

人不走空 &#x1f308;個人主頁&#xff1a;人不走空 &#x1f496;系列專欄&#xff1a;算法專題 ?詩詞歌賦&#xff1a;斯是陋室&#xff0c;惟吾德馨 嘿&#xff0c;小伙伴們&#xff01;今天我們來聊聊Kotlin&#xff0c;這個在安卓開發圈里越來越火的編程語言。…

蘋果手機抹機(馬來西亞)操作步驟

蘋果手機抹機&#xff08;馬來西亞&#xff09;操作步驟 操作環境操作步驟 操作環境 蘋果6s&#xff0c;沒有插卡&#xff0c;就連接上了一個wifi 操作步驟

XML Schema 雜項數據類型

XML Schema 雜項數據類型 XML Schema 提供了多種數據類型,用于定義 XML 文檔中元素和屬性的結構和內容。除了常見的簡單類型(如字符串、整數、日期等)和復雜類型(如元素和屬性的組合)之外,XML Schema 還包括一些雜項數據類型,用于處理特定的數據格式和驗證需求。本文將…

錯位情緣懸疑升級

?&#x1f525;【錯位情緣&#xff0c;懸疑升級&#xff01;關芝芝與黃牡丹的驚世婚約】&#x1f525;?在這個迷霧重重的劇場&#xff0c;一場前所未有的錯位大戲正悄然上演&#xff01;&#x1f440; 你沒看錯&#xff0c;昔日兄弟的前女友關芝芝&#xff0c;竟搖身一變成了…

Unity-Invoke帶參數的代碼一個

Unity的分幀加載,其實沒多難,只要理解了原理 而Unity的延遲有兩種寫法, 一是, StartCoroutinue 二是, Invoke() 我記得之前,有一種Action Delay的寫法(找到在補上) 三現在更多的應該是, async task 等 其實原理都是一樣的(雖然底層邏輯不一樣,完全不一樣,但…

API 類別 - 選擇器

API 類別 - 選擇器 選擇器 API 是一種常用的接口,它允許開發人員通過特定的標準從一組數據中選擇特定的項目。這類 API 廣泛應用于各種編程場景,特別是在需要從大量數據中快速準確地提取信息時。本文將探討選擇器 API 的概念、應用場景、工作原理以及如何在實際項目中有效使…

FastAPI 學習之路(三十七)元數據和文檔 URL

實現前的效果 那么如何實現呢&#xff0c;第一種方式如下&#xff1a; from routers.items import item_router from routers.users import user_router""" 自定義FastApi應用中的元數據配置Title&#xff1a;在 OpenAPI 和自動 API 文檔用戶界面中作為 API 的…

【SGX系列教程】(五)enclave多線程測試,以及EPC內存測試

文章目錄 一. 概述二. 原理分析2.1 多線程在Enclave中的實現流程2.2 多線程和EPC內存分配之間的沖突2.3 解決多線程和EPC內存分配沖突的策略 三. 源碼分析3.1 代碼結構3.2 源碼3.2.1 App文件夾3.2.2 Enclave文件夾3.2.3 Makefile 3.3 總結 四.感謝支持 一. 概述 在Intel SGX環境…

Go語言特點

Go語言主要具有以下特點和優勢&#xff1a; 1. **高效的性能**&#xff1a;Go語言的性能與Java或C相似&#xff0c;通常比Python快30倍。 2. **并發性**&#xff1a;Go語言致力于簡化編程&#xff0c;其創新之處在于goroutines和通道&#xff0c;提供了輕量級的線程和gorouti…

從零開始學習嵌入式----C語言框架梳理與后期規劃

目錄 一、環境搭建. 二、見解 三、C語言框架梳理 四、嵌入式學習規劃流程圖&#xff08;學習順序可能有變&#xff09; 一、環境搭建. C語言是一門編程語言&#xff0c;在學習的時候要準備好環境。我個人比較喜歡用VS,具體怎么安裝請百度。學習C語言的時候&#xff0c;切忌…

【Spring】Spring Security 5及以上版本中`SecurityFilterChain`示例

1. 配置SecurityFilterChain 在Spring Boot應用程序中&#xff0c;通常通過配置類來定義SecurityFilterChain。Spring Boot 2.x及更高版本與Spring Security 5.x緊密集成&#xff0c;提供了簡化的配置方式。以下是一個基于Java配置的例子&#xff1a; import org.springframe…

HOW - 黑暗模式 Dark Mode

目錄 一、引入黑暗模式二、樣式生效方案代碼示例方法一&#xff1a;新建專用的黑暗模式樣式文件方法二&#xff1a;使用CSS變量或預處理器CSS變量示例&#xff1a;Sass示例&#xff1a; 方法三&#xff1a;添加特定的類名或屬性方法四&#xff1a;使用偽類和選擇器方法五&#…

應對高并發請求:服務器性能壓力的解決方案

應對高并發請求:服務器性能壓力的解決方案 在現代互聯網環境中,高并發請求是常見的挑戰。當大量請求同時涌向服務器,可能導致性能瓶頸,甚至服務器崩潰。為了解決這些問題,我們通常使用負載均衡和限流技術。本文將深入探討這些技術,并通過示例代碼展示如何實現。 1. 負載…

樹莓派pico入坑筆記,ssd1306使用

目錄 說明 后附進階玩法&#xff1a;顯示中文&#xff0c;外加簡單庫實現 官方模塊使用 使用樣例 方法說明 下面是繪圖支持的方法 進階玩法&#xff0c;顯示中文 方法&#xff0c;對漢字取字模&#xff0c;然后按像素對字模進行顯示 說明 circuitpython8.x使用iic接口驅…

get和 post的區別

get 是從服務器上獲取數據&#xff0c;post 是向服務器傳送數據。POST 比 GET 安全&#xff0c;因為數據在地址欄上不可見。 3.了解get 方式提交的數據最多只能有 1024 字節&#xff0c;而 post 則沒有此限制。 4.GET 使用 URL 或 Cookie 傳參。而 POST 將數據放在 request BOD…

類和對象——【運算符重載】

P. S.&#xff1a;以下代碼均在VS2019環境下測試&#xff0c;不代表所有編譯器均可通過。 P. S.&#xff1a;測試代碼均未展示頭文件iostream的聲明&#xff0c;使用時請自行添加。 博主主頁&#xff1a;Yan. yan. ??????????????????? ?? …

【vueUse庫Reactivity模塊各函數簡介及使用方法--中篇】

vueUse庫是一個專門為Vue打造的工具庫,提供了豐富的功能,包括監聽頁面元素的各種行為以及調用瀏覽器提供的各種能力等。其中的Browser模塊包含了一些實用的函數,以下是這些函數的簡介和使用方法: vueUse庫Sensors模塊各函數簡介及使用方法 vueUseReactivity函數1. reactiv…