JWT的學習

1、HTTP無狀態及解決方案

HTTP一種是無狀態的協議,每次請求都是一次獨立的請求,一次交互之后就是陌生人。

以CSDN為例,先登錄一次,然后瀏覽器退出,這個時候在進入CSDN,按理說服務器是不知道你已經登陸了,所以需要你重新登錄,但實際卻是再次點進來之后,仍然保持登錄狀態。

這是因為解決了HTTP無狀態這個問題,解決方式有很多:

①使用Session和Cookie,將 無狀態 變為 有狀態

第一次請求時,服務器會自動記錄一個SessionId,然后把SessionId返回給瀏覽器。再次發起請求時,瀏覽器就會攜帶SessionId,而服務器就可以根據SessionId,去查詢會話信息(session)。

服務器可以往會話里保存用戶信息

?瀏覽器會自動保存SessionId

Session弊端:Session和Cookie適用于單機環境,默認情況下會話信息(session)是保存在服務器內存中,用戶量大的話,服務器內存壓力大。如果生產是集群環境,就沒辦法保證瀏覽器的請求每一次都傳到有會話信息的那一臺服務器。

這種也好解決,把會話信息存到Redis里,每次訪問,服務器根據SessionId,去Redis拿會話信息(SpringBoot實現了這個功能,引入【spring-session-data-redis】依賴包,做一些設置,就會自動將會話信息交給Redis管理),這樣做服務器的內存壓力也就會見。

②使用Token

在登錄時,生成一個Token放入Redis,之后把token返回給瀏覽器。瀏覽器發起其他請求時,攜帶這個token,服務器再去Redis看這個Token是否失效之類的。

③使用JWT

使用JWT和使用Token很像,但JWT不需要存儲到Redis,就能通過驗簽,知道用戶信息是否偽造、用戶登錄狀態是否過期等等。

2、JWT的基本介紹

JWT官網地址:https://jwt.io/

JWT,全稱JSON? WEB? TOKEN,是一種JSON格式的Web應用令牌,它是基于令牌去做認證。

什么是令牌,舉個例子,古代調兵用的虎符,這就相當于是令牌,有了虎符,才能調兵。而令牌也是,有了令牌,才能訪問后端接口。

以下是官網介紹

大致就是JWT能夠通過HMAC算法(默認算法),或者通過RSA、ECDSA算法生成數字簽名(Signature)。

JWT令牌的組成

JWT由三部分組成:Header(頭)、Payload(負載)、Signature(簽名),三部分用 "." 進行分隔

Header

兩部分組成:令牌的類型是什么,簽名(Signature)使用什么算法。

從官網復制的例子,表示令牌的類型是JWT,算法是 HMAC-SHA256

{"alg": "HS256","typ": "JWT"
}

Header的JSON串經過Base64編碼就轉換成 "x.y.z" 的 "x"部分

Payload

負載有七個默認字段

iss:發行人
exp:到期時間
sub:主體
aud:用戶
nbf:在此之前不可用
iat:發布時間
jti:JWT ID用于標識該JWT

官方樣例如下:name 和 admin為自定義的字段

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

負載里面可以放自定義字段,這部分內容也是通過Base64編碼變成"x.y.z"部分的"y"部分,可以通過Base64解碼,拿到里面的信息。所以,官方也推薦不要往負載里存放敏感信息,比如密碼之類的,除非想故意被攻擊。

Signature

官方提供的例子如下,可以看見,簽名是通過前兩部分(Header 和 Payload)base64編碼之后的字符串拼接成一個新的字符串,以及指定一個密鑰(secret),并使用Header里指定的算法生成的簽名。因此,密鑰是一定不能暴露出去的

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

假如攻擊者對前兩部分進行隨意修改,并冒充前端發起請求。后端每次驗簽的時候,都會根據前兩部分內容,加上密鑰(secret),再去生成一次簽名,而由于攻擊者修改了內容,所以生成的簽名肯定和傳來的簽名不匹配,這就說明被篡改了,從而驗簽失敗。

3、JWT的優缺點

優點

1、JWT生成的令牌保存在客戶端(前端),服務端不會保存令牌,減少了服務器內存的損耗。

2、易擴展,負載中可以保存自定義的信息。

3、使用強密鑰生成簽名時,JWT提供了很好的安全性。

4、使用JWT,HTTP仍是無狀態的,和Session、Cookie的方式正好相反,JWT不需要在服務器存儲會話信息,非常適合集群環境。

缺點

1、JWT 本身不支持會話管理,不能主動使令牌失效。假如用戶修改了密碼,這個時候肯定要重新登錄,原先的JWT令牌按理就應該失效,但是,由于沒有到令牌指定的過期時間,所以原先的令牌仍然是有效的。(可以將令牌存到redis,當修改密碼后刪除令牌,當令牌沒有就強制用戶去登錄)

2、負載(Payload)中存放過多用戶數據時,會影響性能。

4、如何使用JWT

大致流程:用戶通過前端頁面進行登錄,業務校驗通過之后,生成一個令牌(JWT),后端將JWT返回給前端,前端進行保存。之后,前端每次訪問后端,都必須攜帶JWT,后端去驗證令牌(JWT)的合法性。

①導入JWT依賴

<dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>3.4.0</version>
</dependency>

②編寫工具類,生成令牌

前面提到了,JWT令牌由三部分組成,所以創建一個JWT令牌,只要保證有這三部分就可以了

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;import java.util.Base64;
import java.util.Calendar;
import java.util.HashMap;public class JWTUtil {//密鑰,一般是從配置文件讀取private static final String secretKey = "4008123123@#";private static final String algorithm = Algorithm.HMAC256(secretKey).getName();/*** 生成JWT令牌** @return*/public static String generateJwtToken(String userId, String secretKey) {Calendar exp = Calendar.getInstance();//過期時間:當前時間往后推20分鐘exp.add(Calendar.MINUTE, 20);System.out.println("過期時間:" + exp.getTime());//        HashMap<String, Object> map = new HashMap<String, Object>();
//        map.put("alg",algorithm);
//        map.put("typ","JWT");String token = JWT.create()//header,即使不寫,也會使用默認的推薦算法HS256和JWT令牌類型
//                .withHeader(map).withExpiresAt(exp.getTime())  //默認的負載字段,設置過期時間.withClaim("userId", userId) //負載---自定義字段.withClaim("username", "UMR123") //負載---自定義字段.sign(Algorithm.HMAC256(secretKey));System.out.println(token);return token;}/*** 驗簽(驗證JWT令牌的合法性)** @param jwtToken* @param secretKey* @return 用來獲取令牌信息*/public static DecodedJWT verifyToken(String jwtToken, String secretKey) {//生成驗證對象JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(secretKey)).build();//如果驗證沒問題,就可以獲取到負載信息,如果簽名有問題(簽名不一致,令牌過期),就會報錯DecodedJWT verify = jwtVerifier.verify(jwtToken);System.out.println("負載(Payload)經過base64解碼:" + new String(Base64.getDecoder().decode(verify.getPayload())));System.out.println("userId信息:" + verify.getClaim("userId").asString());System.out.println("username信息:" + verify.getClaim("username").asString());System.out.println("令牌過期時間:" + verify.getExpiresAt());return verify;}public static void main(String[] args) {//生成令牌String jwtToken = generateJwtToken("user123", secretKey);System.out.println();verifyToken(jwtToken, secretKey);}
}

控制臺打印結果如下:?

服務端生成JWT令牌之后,客戶端在請求其他接口時,請求頭新增Authorization字段,放入JWT信息

Authorization: Bearer <token>

都是對數據完整性和用戶身份進行校驗,什么時候直接使用算法生成簽名,什么時候使用JWT?

當需求沒有要求過期時間,就可以使用直接使用算法,反之,用JWT令牌是最好的。

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

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

相關文章

時序和延時

1、延遲模型的類型 verilog有三種類型的延遲模型&#xff1a;分布延遲 、 集總延遲 、 路徑延遲&#xff08;pin to pin&#xff09; 1.1、 分布延遲 分布延遲是在每個獨立元件的基礎上進行定義的。 module M(output wire out ,input wire a …

SpringBoot基礎Kafka示例

這里將生產者和消費者放在一個應用中 使用的Boot3.4.3 引入Kafka依賴 <dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId> </dependency>yml配置 spring:application:name: kafka-1#kafka…

API調試工具的無解困境:白名單、動態IP與平臺設計問題

引言 你是否曾經在開發中遇到過這樣的尷尬情形&#xff1a;你打開了平臺的API調試工具&#xff0c;準備一番操作&#xff0c;結果卻發現根本無法連接到平臺&#xff1f;別急&#xff0c;問題出在調試工具本身。今天我們要吐槽的就是那些神奇的開放平臺API調試工具&#xff0c;…

多方安全計算(MPC)電子拍賣系統

目錄 一、前言二、多方安全計算(MPC)與電子拍賣系統概述2.1 多方安全計算(MPC)的基本概念2.2 電子拍賣系統背景與需求三、MPC電子拍賣系統設計原理3.1 系統總體架構3.2 電子拍賣中的安全協議3.3 數學與算法證明四、數據加解密模塊設計五、GPU加速與系統性能優化六、GUI設計與系…

【Linux篇】初識Linux指令(上篇)

Linux命令世界&#xff1a;從新手到高手的必備指南 一 Linux發展與歷史1.1 Linux起源與發展1.2 Linux與Windows操作系統對比 二 Linux常用操作指令2.1 ls命令 - “List”&#xff08;列出文件)2.2 pwd指令- "打印當前工作目錄"2.3 cd指令 - “Change Directory”&…

編程視界:C++命名空間

目錄 命名空間 為什么要使用命名空間 什么是命名空間 命名空間的使用方式 關鍵點總結 命名空間的嵌套使用 匿名命名空間 跨模塊調用問題 命名空間可以多次定義 總結 首先從C的hello,world程序入手&#xff0c;來認識一下C語言 #include <iostream> using name…

Redux 和 MobX 高頻面試題

Redux 和 MobX 是 React 生態中的兩大狀態管理方案&#xff0c;在面試中常涉及 原理、使用方式、對比、最佳實踐 等方面。以下是 高頻面試題 詳細答案&#xff0c;助你輕松應對面試&#xff01;&#x1f680; &#x1f525; Redux 部分 1. Redux 是什么&#xff1f;為什么需要…

Excel 保護工作簿:它能解決哪些問題?如何正確使用?

在日常辦公中&#xff0c;Excel 表格常常涉及多人協作、重要數據保護&#xff0c;甚至是避免誤操作的情況。這時候&#xff0c;“保護工作簿”功能就能派上用場。它能有效防止他人修改表結構、刪除工作表&#xff0c;甚至可以設置密碼&#xff0c;確保數據的完整性和安全性。今…

Android Retrofit 框架注解定義與解析模塊深度剖析(一)

一、引言 在現代 Android 和 Java 開發中&#xff0c;網絡請求是不可或缺的一部分。Retrofit 作為 Square 公司開源的一款強大的類型安全的 HTTP 客戶端&#xff0c;憑借其簡潔易用的 API 和高效的性能&#xff0c;在開發者社區中廣受歡迎。Retrofit 的核心特性之一便是通過注…

C# Enumerable類 之 數據分組

總目錄 前言 在 C# 中&#xff0c;System.Linq.Enumerable 類是 LINQ&#xff08;Language Integrated Query&#xff09;的核心組成部分&#xff0c;它提供了一系列靜態方法&#xff0c;用于操作實現了 IEnumerable 接口的集合。通過這些方法&#xff0c;我們可以輕松地對集合…

推理模型對SQL理解能力的評測:DeepSeek r1、GPT-4o、Kimi k1.5和Claude 3.7 Sonnet

引言 隨著大型語言模型&#xff08;LLMs&#xff09;在技術領域的應用日益廣泛&#xff0c;評估這些模型在特定技術任務上的能力變得越來越重要。本研究聚焦于四款領先的推理模型——DeepSeek r1、GPT-4o、Kimi k1.5和Claude 3.7 Sonnet在SQL理解與分析方面的能力&#xff0c;…

IDEA接入阿里云百煉中免費的通義千問[2025版]

安裝deepseek 上一篇文章IDEA安裝deepseek最新教程2025中說明了怎么用idea安裝codeGPT插件&#xff0c;并接入DeepSeek&#xff0c;無奈接入的官方api已經不能使用了&#xff0c;所以我們嘗試從其他地方接入 阿里云百煉https://bailian.console.aliyun.com/ 阿里云百煉?是阿…

實施一套先進的智能攝像頭服務系統。

一、項目背景 隨著物聯網、人工智能和大數據技術的飛速發展&#xff0c;智能攝像頭已成為家庭、企業以及公共安全領域的重要設備。其便捷、高效、智能的特點&#xff0c;使得市場需求日益增長。為了滿足用戶對智能監控的多樣化需求&#xff0c;提供更加全面、可靠的監控服務&a…

linux自啟動服務

在Linux環境中&#xff0c;systemd是一個系統和服務管理器&#xff0c;它為每個服務使用.service文件進行配置。systemctl是用于控制系統服務的主要工具。本文將詳細介紹如何使用systemctl來管理vsftpd服務&#xff0c;以及如何設置服務自啟動。 使用Systemd設置自啟動服務 創…

010-Catch2

Catch2 一、框架簡介 Catch2 是一個基于 C 的現代化單元測試框架&#xff0c;支持 TDD&#xff08;測試驅動開發&#xff09;和 BDD&#xff08;行為驅動開發&#xff09;模式。其核心優勢在于&#xff1a; 單頭文件設計&#xff1a;v2.x 版本僅需包含 catch.hpp 即可使用自然…

數字人分身開發指南:從概念到實戰

一、什么是數字人分身&#xff1f; 想象一下&#xff0c;在電腦或手機屏幕里&#xff0c;一個能跟你聊天、回答問題&#xff0c;甚至還能做表情的虛擬角色。這就是數字人分身&#xff0c;它用上了人工智能技術&#xff0c;讓機器也能像人一樣交流。無論是在線客服、網絡主播還…

Pixelmator Pro for Mac 專業圖像處理軟件【媲美PS的修圖】

介紹 Pixelmator Pro&#xff0c;是一款非常強大、美觀且易于使用的圖像編輯器&#xff0c;專為 Mac 設計。采用單窗口界面、基于機器學習的智能圖像編輯、自動水平檢測&#xff0c;智能快速選擇及更好的修復工具等功能優點。許多非破壞性的專業編輯工具可讓您進行最佳的照片處…

LiveGBS流媒體平臺GB/T28181常見問題-視頻流安全控制HTTP接口鑒權勾選流地址鑒權后401Unauthorized如何播放調用接口流地址校驗

LiveGBS流媒體平臺GB/T28181常見問題頻流安全控制HTTP接口鑒權勾選流地址鑒權后401Unauthorized如何播放調用接口流地址校驗&#xff1f; 1、安全控制1.1、HTTP接口鑒權1.2、流地址鑒權 2、401 Unauthorized2.1、攜帶token調用接口2.1.1、獲取鑒權token2.1.2、調用其它接口2.1.…

C++設計模式-抽象工廠模式:從原理、適用場景、使用方法,常見問題和解決方案深度解析

一、模式基本概念 1.1 定義與核心思想 抽象工廠模式&#xff08;Abstract Factory Pattern&#xff09;是創建型設計模式的集大成者&#xff0c;它通過提供統一的接口來創建多個相互關聯或依賴的對象族&#xff0c;而無需指定具體類。其核心思想體現在兩個維度&#xff1a; …

【prompt實戰】知乎問題解答專家

本文原創作者&#xff1a;姚瑞南 AI-agent 大模型運營專家&#xff0c;先后任職于美團、獵聘等中大廠AI訓練專家和智能運營專家崗&#xff1b;多年人工智能行業智能產品運營及大模型落地經驗&#xff0c;擁有AI外呼方向國家專利與PMP項目管理證書。&#xff08;轉載需經授權&am…