👉 這是一個或許對你有用的社群
《專案實戰(影片)》:從書中學,往事上“練” 《網際網路高頻面試題》:面朝簡歷學習,春暖花開 《架構 x 系統設計》:摧枯拉朽,掌控面試高頻場景題 《精進 Java 學習指南》:系統學習,網際網路主流技術棧 《必讀 Java 原始碼專欄》:知其然,知其所以然

👉這是一個或許對你有用的開源專案國產 Star 破 10w+ 的開源專案,前端包括管理後臺 + 微信小程式,後端支援單體和微服務架構。功能涵蓋 RBAC 許可權、SaaS 多租戶、資料許可權、商城、支付、工作流、大屏報表、微信公眾號、CRM 等等功能:
Boot 倉庫:https://gitee.com/zhijiantianya/ruoyi-vue-pro Cloud 倉庫:https://gitee.com/zhijiantianya/yudao-cloud 影片教程:https://doc.iocoder.cn 【國內首批】支援 JDK 21 + SpringBoot 3.2.2、JDK 8 + Spring Boot 2.7.18 雙版本
為什麼很多人不推薦你用JWT?
如果你經常看一些網上的帶你做專案的教程,你就會發現 有很多的專案都用到了JWT。那麼他到底安全嗎?為什麼那麼多人不推薦你去使用。這個文章將會從全方面的帶你瞭解JWT 以及他的優缺點。
基於 Spring Boot + MyBatis Plus + Vue & Element 實現的後臺管理系統 + 使用者小程式,支援 RBAC 動態許可權、多租戶、資料許可權、工作流、三方登入、支付、簡訊、商城等功能
專案地址:https://github.com/YunaiV/ruoyi-vue-pro 影片教程:https://doc.iocoder.cn/video/
什麼是JWT?
這個是他的官網JSON Web Tokens – jwt.io
https://jwt.io/
這個就是JWT

JWT 全稱JSON Web Token
如果你還不熟悉JWT,不要驚慌!它們並不那麼複雜!
你可以把JWT想象成一些JSON資料,你可以驗證這些資料是來自你認識的人。
當然如何實現我們在這裡不講,有興趣的可以去自己瞭解。
下面我們來說一下他的流程:
-
當你登入到一個網站,網站會生成一個JWT並將其傳送給你。 -
這個JWT就像是一個包裹,裡面裝著一些關於你身份的資訊,比如你的使用者名稱、角色、許可權等。 -
然後,你在每次與該網站進行通訊時都會攜帶這個JWT。 -
每當你訪問一個需要驗證身份的頁面時,你都會把這個JWT帶給網站。 -
網站收到JWT後,會驗證它的簽名以確保它是由網站簽發的,並且檢查其中的資訊來確認你的身份和許可權。 -
如果一切都通過了驗證,你就可以繼續訪問受保護的頁面了。

基於 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現的後臺管理系統 + 使用者小程式,支援 RBAC 動態許可權、多租戶、資料許可權、工作流、三方登入、支付、簡訊、商城等功能
專案地址:https://github.com/YunaiV/yudao-cloud 影片教程:https://doc.iocoder.cn/video/
為什麼說JWT很爛?
首先我們用JWT應該就是去做這些事情:
-
使用者註冊網站 -
使用者登入網站 -
使用者點選並執行操作 -
本網站使用使用者資訊進行建立、更新和刪除 資訊
這些事情對於資料庫的操作經常是這些方面的
-
記錄使用者正在執行的操作 -
將使用者的一些資料新增到資料庫中 -
檢查使用者的許可權,看看他們是否可以執行某些操作
之後我們來逐步說出他的一些缺點
大小
這個方面毋庸置疑。
比如我們需要儲存一個使用者ID 為xiaou
如果儲存到cookie裡面,我們的總大小隻有5個位元組。
如果我們將 ID 儲存在 一個 JWT 裡。他的大小就會增加大概51倍

這無疑就增大了我們的寬頻負擔。
冗餘簽名
JWT的主要賣點之一就是其加密簽名。因為JWT被加密簽名,接收方可以驗證JWT是否有效且可信。
但是,在過去20年裡幾乎每一個網路框架都可以在使用普通的會話cookie時獲得加密簽名的好處。
事實上,大多數網路框架會自動為你加密簽名(甚至加密!)你的cookie。這意味著你可以獲得與使用JWT簽名相同的好處,而無需使用JWT本身。
實際上,在大多數網路身份驗證情況下,JWT資料都是儲存在會話cookie中的,這意味著現在有兩個級別的簽名。一個在cookie本身上,一個在JWT上。
令牌撤銷問題
由於令牌在到期之前一直有效,伺服器沒有簡單的方法來撤銷它。
以下是一些可能導致這種情況危險的用例。
登出並不能真正使你登出!
想象一下你在推特上傳送推文後登出了登入。你可能會認為自己已經從伺服器登出了,但事實並非如此。因為JWT是自包含的,將在到期之前一直有效。這可能是5分鐘、30分鐘或任何作為令牌一部分設定的持續時間。因此,如果有人在此期間獲取了該令牌,他們可以繼續訪問直到它過期。
可能存在陳舊資料
想象一下使用者是管理員,被降級為許可權較低的普通使用者。同樣,這不會立即生效,使用者將繼續保持管理員身份,直到令牌過期。
JWT通常不加密
因此任何能夠執行中間人攻擊並嗅探JWT的人都擁有你的身份驗證憑據。這變得更容易,因為中間人攻擊只需要在伺服器和客戶端之間的連線上完成
安全問題
對於JWT是否安全。我們可以參考這個文章
https://research.securitum.com/jwt-json-web-token-security/
同時我們也可以看到是有專門的如何攻擊JWT的教程的
https://www.freebuf.com/articles/web/375465.html
總結
總的來說,JWT適合作為單次授權令牌,用於在兩個實體之間傳輸宣告資訊。
但是,JWT不適合作為長期持久資料的儲存機制,特別是用於管理使用者會話。使用JWT作為會話機制可能會引入一系列嚴重的安全和實現上的問題,相反,對於長期持久資料的儲存,更適合使用傳統的會話機制,如會話cookie,以及建立在其上的成熟的實現。
但是寫了這麼多,我還是想說,如果你作為自己開發學習使用,不考慮安全,不考慮效能的情況下,用JWT是完全沒有問題的,但是一旦用到生產環境中,我們就需要避免這些可能存在的問題。
歡迎加入我的知識星球,全面提升技術能力。
👉 加入方式,“長按”或“掃描”下方二維碼噢:

星球的內容包括:專案實戰、面試招聘、原始碼解析、學習路線。





文章有幫助的話,在看,轉發吧。
謝謝支援喲 (*^__^*)
關鍵詞
資訊
令牌
許可權
使用者
儲存在