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