落霞與孤鶩齊飛, JWT與Session兩種驗證機(jī)制的比較

?

落霞與孤鶩齊飛, JWT與Session兩種驗證機(jī)制的比較

大家好,這一期呢,我們來說一下網(wǎng)絡(luò)程序開發(fā)中的驗證的方式。常用的就是兩種:jwt和session,現(xiàn)在來比較一下的這兩種驗證方式。

先來探討一下這jwt的驗證方式。這種方式就是在服務(wù)器端和客戶端通過一個jwt token來保證通信的合法性。

在這個jwt token中你可以保存一些數(shù)據(jù)。要想看到這個token中存在哪些數(shù)據(jù),你可以去這個jwt io網(wǎng)站上去查一下。里面的數(shù)據(jù)是成對的,有一個鍵值,有一個對應(yīng)的值。

一個jwt token中,存在三個部分, 第1部分是頭部, 用來存放算法和類型。第2部分是數(shù)據(jù)部分, 我們大部分時間會用到這一部分。第3部分是簽名信息。

下面我們來看一下session的方式。Session的關(guān)鍵就是一個section ID。服務(wù)器端通過這個session ID來驗證通訊的合法性。同時使用這個session ID來獲取相應(yīng)的信息。

這些信息可能是在內(nèi)存中的數(shù)據(jù)信息, 也可能是在數(shù)據(jù)庫表中,也有可能在其他的緩沖機(jī)制里面。

在大型項目中一般比較常用的就是像redis這樣子的緩沖機(jī)制。在這個機(jī)制中會有一個redis的服務(wù)程序,有多個server,會有一個load balancer 負(fù)載均衡器, 這個負(fù)載均衡器作為與客戶端進(jìn)行交互的前沿??蛻舳烁?fù)載均衡器之間通過session ID來進(jìn)行交互。

現(xiàn)在來討論一下這兩種機(jī)制的好處和壞處。

jwt機(jī)制是無狀態(tài)的。在這種機(jī)制下,你不需要單獨的存放任何與你的訪問狀態(tài)相關(guān)的數(shù)據(jù)。這些東西都在一個token里面。

這種機(jī)制的好處就是使程序更加簡單。你不需要用額外的程序邏輯來管理通信狀態(tài)。

壞處就是數(shù)據(jù)是公開的,你只要拿到這個token,你就可以查到里面的數(shù)據(jù)。

另一個不好的地方是,如果token中你包含的數(shù)據(jù)太多,在通信過程中每次都要傳送這些數(shù)據(jù)會增加網(wǎng)絡(luò)交互的負(fù)擔(dān)。

Jwt token, 你可以通過設(shè)置至一個超時值來讓它失效。在它有效的這個時間里,除非你更改secret, 除此之外你是沒有辦法把它取消的。

Session機(jī)制是有狀態(tài)的。在通訊傳輸?shù)倪^程中,你只需要傳送一個session ID就可以了。與這個session相關(guān)的數(shù)據(jù)會在服務(wù)器端有一個備份。當(dāng)然客戶端也有一個備份, 因為你需要這部分?jǐn)?shù)據(jù)去做一些前端的操作。

這種機(jī)制的好處就是安全。在傳授的過程中,你只需要傳輸一個session ID, 不需要傳送全部的數(shù)據(jù)信息。具體的數(shù)據(jù),由你的請求類型來決定。

這種機(jī)制的壞處就是要額外去管理這部分通訊狀態(tài)數(shù)據(jù)。對于我們程序來說,就要單獨寫相關(guān)的數(shù)據(jù)庫表格來存放session部分,要寫相關(guān)的程序來讀取和更新這些數(shù)據(jù)。

在安全性上session有更好的優(yōu)勢。你可以刪除服務(wù)器端的session數(shù)據(jù)。

具體到某個開發(fā)項目上這兩種機(jī)制有優(yōu)勢也有劣勢,不能一概而論,還是要具體問題具體分析。

作者簡介:

山東人。

從事軟件開發(fā)研究二十多年。

先后在如下地區(qū)工作:山東(青鳥華光),北京(北大方正,SDL Trados, O2Micro, Motorola),德國斯圖加特(Trados),新加坡(ITE),加拿大溫哥華(Schneider Electric, Nokia Here, Western Digital, Microsoft, Aviso Wealth, MDA),現(xiàn)居溫哥華。

個人愛好:陪孩子玩耍學(xué)習(xí),練拳,好好學(xué)習(xí),天天向上。

專家領(lǐng)域:

安卓(Java,Kotlin),iOS(Swift),

Angular(Typescript,Javascript),

Asp.Net Core(C#),

Spring Boot(Java),

nodejs(Javascript),

Go(golang)

歡迎關(guān)注一起學(xué)習(xí)討論,共同進(jìn)步。

十年內(nèi)計劃寫出超過三千六百篇文章,與超過三萬名讀者互動。

這些文章會在今日頭條,知乎,簡書,微博,微信公眾平臺,阿里大魚號,Medium等各大平臺同步上線,敬請期待關(guān)注,歡迎洽談合作相關(guān)事宜。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容