當前位置: 妍妍網 > 碼農

為什麽很多人不推薦用JWT?

2024-07-05碼農

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

如果你經常看一些網上的帶你做計畫的教程,你就會發現 有很多的計畫都用到了JWT。那麽他到底安全嗎?為什麽那麽多人不推薦你去使用。這個文章將會從全方面的帶你了解JWT 以及他的優缺點。

什麽是JWT?

這個是他的官網JSON Web Tokens - jwt.io

https://jwt.io/

這個就是JWT

JWT 全稱JSON Web Token

如果你還不熟悉JWT,不要驚慌!它們並不那麽復雜!

你可以把JWT想象成一些JSON數據,你可以驗證這些數據是來自你認識的人。

當然如何實作我們在這裏不講,有興趣的可以去自己了解。

下面我們來說一下他的流程:

  • • 當你登入到一個網站,網站會生成一個JWT並將其發送給你。

  • • 這個JWT就像是一個包裹,裏面裝著一些關於你身份的資訊,比如你的使用者名稱、角色、許可權等。

  • • 然後,你在每次與該網站進行通訊時都會攜帶這個JWT。

  • • 每當你存取一個需要驗證身份的頁面時,你都會把這個JWT帶給網站。

  • • 網站收到JWT後,會驗證它的簽名以確保它是由網站簽發的,並且檢查其中的資訊來確認你的身份和許可權。

  • • 如果一切都透過了驗證,你就可以繼續存取受保護的頁面了。

  • 為什麽說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是完全沒有問題的,但是一旦用到生產環境中,我們就需要避免這些可能存在的問題。

    來源:juejin.cn/post/7365533351451672612

    IT交流群

    組建了程式設計師,架構師,IT從業者交流群,以 交流技術 職位內推 行業探討 為主