為什么很多人不推薦你用JWT?
共 2900字,需瀏覽 6分鐘
·
2024-07-18 07:40
回復(fù)架構(gòu)師獲取資源
大家好,我是你們的朋友架構(gòu)君,一個會寫代碼吟詩的架構(gòu)師。
為什么很多人不推薦你用JWT?
如果你經(jīng)常看一些網(wǎng)上的帶你做項目的教程,你就會發(fā)現(xiàn) 有很多的項目都用到了JWT。那么他到底安全嗎?為什么那么多人不推薦你去使用。這個文章將會從全方面的帶你了解JWT 以及他的優(yōu)缺點。
什么是JWT?
這個是他的官網(wǎng)JSON Web Tokens - jwt.io
https://jwt.io/
這個就是JWT
JWT 全稱JSON Web Token
如果你還不熟悉JWT,不要驚慌!它們并不那么復(fù)雜!
你可以把JWT想象成一些JSON數(shù)據(jù),你可以驗證這些數(shù)據(jù)是來自你認(rèn)識的人。
當(dāng)然如何實現(xiàn)我們在這里不講,有興趣的可以去自己了解。
下面我們來說一下他的流程:
? 當(dāng)你登錄到一個網(wǎng)站,網(wǎng)站會生成一個JWT并將其發(fā)送給你。
? 這個JWT就像是一個包裹,里面裝著一些關(guān)于你身份的信息,比如你的用戶名、角色、權(quán)限等。
? 然后,你在每次與該網(wǎng)站進(jìn)行通信時都會攜帶這個JWT。
? 每當(dāng)你訪問一個需要驗證身份的頁面時,你都會把這個JWT帶給網(wǎng)站。
? 網(wǎng)站收到JWT后,會驗證它的簽名以確保它是由網(wǎng)站簽發(fā)的,并且檢查其中的信息來確認(rèn)你的身份和權(quán)限。
? 如果一切都通過了驗證,你就可以繼續(xù)訪問受保護(hù)的頁面了。
為什么說JWT很爛?
首先我們用JWT應(yīng)該就是去做這些事情:
? 用戶注冊網(wǎng)站
? 用戶登錄網(wǎng)站
? 用戶點擊并執(zhí)行操作
? 本網(wǎng)站使用用戶信息進(jìn)行創(chuàng)建、更新和刪除 信息
這些事情對于數(shù)據(jù)庫的操作經(jīng)常是這些方面的
? 記錄用戶正在執(zhí)行的操作
? 將用戶的一些數(shù)據(jù)添加到數(shù)據(jù)庫中
? 檢查用戶的權(quán)限,看看他們是否可以執(zhí)行某些操作
之后我們來逐步說出他的一些缺點
大小
這個方面毋庸置疑。
比如我們需要存儲一個用戶ID 為xiaou
如果存儲到cookie里面,我們的總大小只有5個字節(jié)。
如果我們將 ID 存儲在 一個 JWT 里。他的大小就會增加大概51倍
這無疑就增大了我們的寬帶負(fù)擔(dān)。
冗余簽名
JWT的主要賣點之一就是其加密簽名。因為JWT被加密簽名,接收方可以驗證JWT是否有效且可信。
但是,在過去20年里幾乎每一個網(wǎng)絡(luò)框架都可以在使用普通的會話cookie時獲得加密簽名的好處。
事實上,大多數(shù)網(wǎng)絡(luò)框架會自動為你加密簽名(甚至加密!)你的cookie。這意味著你可以獲得與使用JWT簽名相同的好處,而無需使用JWT本身。
實際上,在大多數(shù)網(wǎng)絡(luò)身份驗證情況下,JWT數(shù)據(jù)都是存儲在會話cookie中的,這意味著現(xiàn)在有兩個級別的簽名。一個在cookie本身上,一個在JWT上。
令牌撤銷問題
由于令牌在到期之前一直有效,服務(wù)器沒有簡單的方法來撤銷它。
以下是一些可能導(dǎo)致這種情況危險的用例。
注銷并不能真正使你注銷!
想象一下你在推特上發(fā)送推文后注銷了登錄。你可能會認(rèn)為自己已經(jīng)從服務(wù)器注銷了,但事實并非如此。因為JWT是自包含的,將在到期之前一直有效。這可能是5分鐘、30分鐘或任何作為令牌一部分設(shè)置的持續(xù)時間。因此,如果有人在此期間獲取了該令牌,他們可以繼續(xù)訪問直到它過期。
可能存在陳舊數(shù)據(jù)
想象一下用戶是管理員,被降級為權(quán)限較低的普通用戶。同樣,這不會立即生效,用戶將繼續(xù)保持管理員身份,直到令牌過期。
JWT通常不加密
因此任何能夠執(zhí)行中間人攻擊并嗅探JWT的人都擁有你的身份驗證憑據(jù)。這變得更容易,因為中間人攻擊只需要在服務(wù)器和客戶端之間的連接上完成
安全問題
對于JWT是否安全。我們可以參考這個文章
https://research.securitum.com/jwt-json-web-token-security/
同時我們也可以看到是有專門的如何攻擊JWT的教程的
https://www.freebuf.com/articles/web/375465.html
總結(jié)
總的來說,JWT適合作為單次授權(quán)令牌,用于在兩個實體之間傳輸聲明信息。
但是,JWT不適合作為長期持久數(shù)據(jù)的存儲機(jī)制,特別是用于管理用戶會話。使用JWT作為會話機(jī)制可能會引入一系列嚴(yán)重的安全和實現(xiàn)上的問題,相反,對于長期持久數(shù)據(jù)的存儲,更適合使用傳統(tǒng)的會話機(jī)制,如會話cookie,以及建立在其上的成熟的實現(xiàn)。
但是寫了這么多,我還是想說,如果你作為自己開發(fā)學(xué)習(xí)使用,不考慮安全,不考慮性能的情況下,用JWT是完全沒有問題的,但是一旦用到生產(chǎn)環(huán)境中,我們就需要避免這些可能存在的問題。
來源:juejin.cn/post/7365533351451672612
這些年小編給你分享過的干貨
2.優(yōu)質(zhì)ERP系統(tǒng)帶進(jìn)銷存財務(wù)生產(chǎn)功能(附源碼)
3.優(yōu)質(zhì)SpringBoot帶工作流管理項目(附源碼)
5.SBoot+Vue外賣系統(tǒng)前后端都有(附源碼)
轉(zhuǎn)發(fā)在看就是最大的支持??
