為什麼很多人不推薦你用JWT?

👉 這是一個或許對你有用的社群
🐱 一對一交流/面試小冊/簡歷最佳化/求職解惑,歡迎加入芋道快速開發平臺知識星球。下面是星球提供的部分資料:
👉這是一個或許對你有用的開源專案
國產 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是完全沒有問題的,但是一旦用到生產環境中,我們就需要避免這些可能存在的問題。

歡迎加入我的知識星球,全面提升技術能力。
👉 加入方式,長按”或“掃描”下方二維碼噢
星球的內容包括:專案實戰、面試招聘、原始碼解析、學習路線。
文章有幫助的話,在看,轉發吧。
謝謝支援喲 (*^__^*)

相關文章