APP服務端接口,用jwt還是用redis和token,分別有什麼優勢?

社會深度觀察


jwt屬於無狀態設計,用戶登陸的信息關鍵存放在jwt加密數據裡,這種設計下服務器不需要存儲jwt密文,只需要解密就能拿到授權信息等用戶信息。這種設計是一種利用計算力減少token設計下數據庫及緩存的壓力和設計複雜度,因此它的本質就是不存儲登陸授權,而通過密文本身保存授權信息。

token加redis設計,是一種登陸後分配隨機token,然後記錄token與用戶信息對應關係的設計。

很明顯,這兩張設計的區別就在於token實際上是需要服務器存儲,每次驗權需要查詢數據庫。jwt不需要服務器存儲,信息本身就存儲於jwt本身,這種模式無需使用數據庫。

但是這種流行的jwt有一個設計上的缺陷,他通過密文傳輸用戶信息,那麼服務器在這種基礎結構下是無法做到關閉用戶登陸授權的操作,如果用戶的jwt密文被偷竊,那麼黑客就能以用戶身份登陸,並且即使知道密文丟失,也無法關閉被偷竊的jwt密文。為了應對這一問題,可以使用jwt內部驗證有效期和jwt黑名單模式,但是有效期始終無法做到及時停止jwt授權,這是一個治標不治本的方法。而jwt黑名單模式,則需要數據庫或內存存儲黑名單,那麼,這實際上違背了jwt的免數據庫設計原則。

因此,如果嚴格按照兩種模式設計,jwt更適合低安全級別的服務器設計,如普通的博客、閱讀器等等,這種服務允許不嚴格的登陸授權,即使密文丟失也不會造成用戶的嚴重損失,卻能獲得較高的服務性能。

token模式,必須配合數據庫進行存儲和查詢,因此性能較低,但token模式卻能做到及時的授權關閉,已經登陸授權可見可查,每一次token都會有對應的記錄。因此token模式適合較高安全度和用戶登陸等信息分析的系統,如政府系統,支付系統等不可能允許高權限的token被偷竊卻不能及時關閉授權。

jwt,適合輕量的系統和權限不嚴格系統。

token,適合重量系統和權限有嚴格要求的系統。


謝謝大家的閱讀和頭條的推薦,我再來詳細的和大家討論下這兩者在實現上的區別,這樣大家可能更方便的理解這兩個不同的概念。

我們討論的這兩種方式只限於規範實現,如果有其他優化或者衍生設計模式則不在討論之內。

token:

普通的token方式採用的是:登錄-->生成隨機字符串(token)-->服務器保存token與用戶信息的對應關係

對應用戶利用token校驗的流程是 token-->查詢token對應用戶信息-->各系統根據用戶信息進行業務處理。


很明顯可以看出,token模式下的字符串實際上不需要和用戶信息有任何關聯,生成的token字符串的要求就是唯一,不能被其他用戶佔有,否則就會出現用戶登錄後實際上是以其他人身份進行業務處理。如果字符串是隨機生成,那麼黑客就無法猜測token的生成規律,也無法從token直接猜測到用戶相關信息。


jwt:

jwt採用的生成:登錄-->生成帶有用戶數據的加密字符串(該字符串服務器並不存儲,直接下發給客戶端)

校驗:客戶端將存儲的jwt密文帶上-->服務器解密密文,獲取到用戶信息


可以看出,jwt的憑證不僅要求唯一,還要求密文本身實際上是帶有了用戶信息,當然這塊可以是非敏感信息,這只是實現上的細節區別,和結構本身沒有特別大的關聯。服務器本身並沒有存儲這次jwt密文,每次服務器的處理都是直接解密jwt密文。這樣做的好處就是服務架構內直接拋棄了登錄相關的傳統token系統,並且服務器不再管理登錄狀態,token有效狀態等問題。

而jwt帶來的問題,憑證實際上的一串密文,更多的用戶信息或session信息需要更大的密文來存儲,進而每次請求都帶上jwt就會使網絡傳輸的內容變大,加大了網絡開銷;憑證是一串密文,那麼如果黑客破解了服務器的加密方式,那麼密文實際上就是用戶信息在網絡上傳輸,黑客可以直接偽造jwt登錄或通過jwt密文獲取到用戶信息;jwt本身不管理jwt的有效性,一旦密文被偷竊,無法做到關閉掉黑客的授權。


兩性教育科普


jwt是生成和校驗解密token的工具,redis是緩存,他們之間並不衝突,加起來一起用效果更好,僅僅用token是不夠的,因為一但設置token意味著其登錄過期時間也就確定了。就無法讓其在有效期內失效,這樣不合理的。。所以可以通過redis記錄token,控制其的有效性,和記錄一些信息。所以 token加redis才是正確的選擇。


半寸灰1


都可以,通常情況下正式點我會用shiro+redis實現權限session認證管理,免去了自己實現session認證的過程,並且它還提供了一些進階的功能。簡陋點的話,redis+token就可以了,要自己去設計實現,通常配合攔截器實現session認證。


Java高級工程師小宇


Jwt是帶有簽名的客戶身份令牌。安全性還是比較高的。但是需要正確使用。它本身主要是證明客戶身份,並不包含機密信息。如果需要避免重複使用,可以提供時間戳,可以一次性使用。這樣很多安全問題就都解決了。現在很多服務都使用jwt認證。


分享到:


相關文章: