JWT在SpringBoot3中的作用及說明
一、JWT 是什么?(生活類比)
JWT 就像是一個 "電子身份證" 或者 "入場手環(huán)"。想象一下:
去游樂園玩:
- 你在入口處買票后,工作人員給你一個 彩色手環(huán)
- 這個手環(huán)上印著你的名字、入園時間、有效期
- 手環(huán)是防水的,很難偽造
- 你進(jìn)入園內(nèi)后,所有游樂設(shè)施都通過這個手環(huán)確認(rèn)你的身份和權(quán)限
- 你不需要每次都出示門票,也不需要重新排隊(duì)驗(yàn)證身份
參加會議:
- 你注冊會議后,收到一個 電子胸牌
- 胸牌上有你的照片、姓名、公司、會議場次權(quán)限
- 這個胸牌是加密的,別人無法復(fù)制
- 你可以自由進(jìn)入任何允許的會議室,保安只需要掃描胸牌就能驗(yàn)證
二、JWT 在 Spring Boot 中的具體作用
身份驗(yàn)證(登錄后)
- 用戶登錄后,服務(wù)器生成一個 JWT 令牌
- 這個令牌包含用戶的基本信息(用戶名、ID、角色等)
- 客戶端(瀏覽器 / 手機(jī))保存這個令牌
- 后續(xù)每次請求都帶上這個令牌,就像你戴著游樂園手環(huán)一樣
授權(quán)(權(quán)限控制)
- JWT 令牌中可以包含用戶的角色信息(如管理員、普通用戶)
- 服務(wù)器收到請求后,檢查令牌中的角色信息
- 決定用戶是否有權(quán)限訪問特定資源(比如只有管理員能刪除數(shù)據(jù))
無狀態(tài)性(最重要的特點(diǎn))
- 服務(wù)器不需要存儲令牌信息(不像傳統(tǒng)的 session 方式)
- 就像游樂園的手環(huán),工作人員不需要查電腦,直接看手環(huán)就能驗(yàn)證
- 這使得系統(tǒng)更容易擴(kuò)展到多個服務(wù)器(微服務(wù)架構(gòu))
三、為什么要用 JWT?(對比傳統(tǒng)方式)
傳統(tǒng)的 session/cookie 方式:
- 你去超市辦了一張會員卡
- 每次消費(fèi)都要刷卡,店員要查數(shù)據(jù)庫確認(rèn)你的身份
- 如果超市開了很多分店,數(shù)據(jù)同步會很麻煩
- 如果會員卡丟了,別人可能冒用你的身份
JWT 方式:
- 你在銀行辦了一張電子支票
- 支票上有你的信息、金額、有效期,而且是加密的
- 任何銀行都可以直接驗(yàn)證支票的真實(shí)性,不需要聯(lián)網(wǎng)查數(shù)據(jù)庫
- 即使支票被別人撿到,沒有密鑰也無法修改信息
四、Spring Boot 3 中 JWT 的工作流程
用戶登錄:
- 用戶提供用戶名和密碼
- Spring Boot 驗(yàn)證后,生成一個 JWT 令牌
客戶端保存:
- 瀏覽器把令牌保存在 localStorage 或 cookie 中
- 移動應(yīng)用把令牌保存在應(yīng)用內(nèi)存儲中
請求資源:
- 客戶端在每個請求的 Header 中添加
Authorization: Bearer <token> - 就像你去餐廳吃飯,進(jìn)門時出示你的會員卡
服務(wù)器驗(yàn)證:
- Spring Boot 檢查令牌的簽名和有效期
- 提取用戶信息,確定訪問權(quán)限
- 處理請求并返回結(jié)果
五、JWT 的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
- 無狀態(tài),易于擴(kuò)展(適合微服務(wù))
- 跨域支持好(不需要擔(dān)心 cookie 跨域問題)
- 性能高(不需要頻繁查詢數(shù)據(jù)庫)
- 可以在令牌中包含自定義信息
缺點(diǎn):
- 令牌體積較大(相比簡單的 session ID)
- 一旦簽發(fā),很難立即撤銷(除非實(shí)現(xiàn)黑名單機(jī)制)
- 令牌過期后,用戶需要重新登錄
六、生活中的 JWT 例子總結(jié)
- 登機(jī)牌:包含你的姓名、航班號、座位號、登機(jī)口,全球機(jī)場通用
- 酒店房卡:包含你的姓名、房間號、有效期,所有酒店員工都能驗(yàn)證
- 電子優(yōu)惠券:包含優(yōu)惠金額、有效期、使用條件,商家掃碼就能驗(yàn)證
JWT 的核心思想就是:一次驗(yàn)證,到處通行,而且驗(yàn)證過程簡單高效。這就是為什么它在現(xiàn)代 Web 應(yīng)用中如此受歡迎。
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java UUID 五個版本的區(qū)別及使用場景小結(jié)
在Java中,UUID是一個128位的唯一標(biāo)識符,廣泛應(yīng)用于生成唯一標(biāo)識符、分布式系統(tǒng)唯一鍵等場景,Java提供的java.util.UUID類支持五種UUID版本,每種具有不同的生成方式和使用場景,本文就來介紹一下如何使用,感興趣的可以了解一下2024-11-11
Java內(nèi)存模型與JVM運(yùn)行時數(shù)據(jù)區(qū)的區(qū)別詳解
這篇文章主要介紹了Java內(nèi)存模型與JVM運(yùn)行時數(shù)據(jù)區(qū)的區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10
記錄jdk21連接SQLServer因?yàn)門LS協(xié)議報(bào)錯問題
在使用Druid連接池連接SQL Server時,可能會遇到因TLS版本不匹配導(dǎo)致的連接失敗問題,具體表現(xiàn)為客戶端使用TLS1.3或TLS1.2,而SQL Server僅支持TLS1.0,導(dǎo)致無法建立安全連接,解決方法是修改JDK的安全配置,啟用TLS1.02024-10-10
簡單的理解java集合中的HashSet和HashTree幾個重寫方法
這篇文章主要介紹了簡單的理解java集合中的HashSet和HashTree幾個重寫方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
java 輸入一個數(shù)字組成的數(shù)組(輸出該數(shù)組的最大值和最小值)
這篇文章主要介紹了java 輸入一個數(shù)字組成的數(shù)組,輸出該數(shù)組的最大值和最小值,需要的朋友可以參考下2017-02-02
基于Java隨機(jī)生成手機(jī)短信驗(yàn)證碼的實(shí)例代碼
這篇文章主要介紹了Java隨機(jī)生成手機(jī)短信驗(yàn)證碼的實(shí)例代碼,代碼分為哦簡單版和復(fù)雜版,需要的朋友可以參考下2019-04-04
Java硬幣翻轉(zhuǎn)倍數(shù)遞增試算實(shí)例
這篇文章主要介紹了Java硬幣翻轉(zhuǎn)倍數(shù)遞增試算實(shí)例,有需要的朋友可以參考一下2013-12-12

