為什麽很多人不推薦你用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從業者交流群,以
交流技術
、
職位內推
、
行業探討
為主