2016-08-04 55 views
1

我最近發現JWT用於令牌認證+授權。 我認爲在令牌中包含用戶信息是非常有用的,所以我試圖在Java/Spring Web項目中使用它。REST安全與JWT

起初,我的印象是:如果我有令牌中的所有用戶數據,我不需要將它存儲在應用程序數據庫中,也不需要爲每個服務請求檢索用戶+會話信息。這太棒了,可以有效提高服務訪問性能。

但現在我對我的使用案例JWT「限制」有一些疑問。例如:如果用戶被服務管理員禁用並且最後生成的令牌尚未過期,該怎麼辦?用戶可以訪問該服務,即使它實際上未經授權...

這是JWT的限制還是我錯過了什麼?你能澄清我的疑問嗎?

回答

1

JWT是自包含的。其中一個優點是它不需要服務器會話存儲,因爲數字簽名可以保護內容。

有幾個理由在其過期時間之前使JWT令牌失效:帳戶被刪除/阻止/暫停,密碼被更改,權限被更改,用戶由管理員註銷。看看Invalidating JSON Web Tokens

它是一種常見的需要,有幾種技術應用或根據你的使用情況

  1. 結合刪除客戶端令牌

  2. 令牌黑名單 :存儲在註銷&到期時間之間的標記,標記已過期並在每個請求中檢查它。您需要服務器存儲。您可以只包含該ID,或使用issued_at並檢查最後更新到用戶配置文件

  3. 過期時間縮短並旋轉它們。每隔幾個要求就發一個新的。問題是保持用戶登錄時,有沒有請求(例如關閉瀏覽器)

其他常用技術:

  • 允許更改用戶唯一的ID,如果帳戶與新的用戶&密碼泄露登錄
  • 包含上次登錄日期以刪除舊令牌
  • 要在用戶更改密碼時使令牌失效,請使用密碼的散列對令牌進行簽名。如果密碼更改,則以前的令牌將自動無法驗證。將此機制與其他感興趣的領域擴展簽署。缺點是它需要訪問數據庫
+0

在我看來,每個需要訪問數據庫的選項使JWT無效,所以我認爲第三個選項可能是我的用例的實際解決方案......謝謝 – davioooh

+0

我同意避免使用數據庫。如果您不希望有太多的令牌被撤銷,您也可以使用內存中的黑名單。您只需在更新用戶和'currentTime - maxExpiryTime last_modified'(不再發送未過期的令牌)時,該條目可以被放棄。 – pedrofb