據我所知,JWT刷新令牌的典型(和簡化的)用法如下:如何使用JWT刷新令牌和短期訪問令牌不是大規模不安全?
- 用戶登錄到系統。用戶被授予刷新令牌和短暫(例如:10分鐘到期)的訪問令牌。刷新令牌存儲在「驗證服務器」的數據庫中以用於撤銷目的。任何對應用程序(「資源服務器」)的請求都將使用短期訪問令牌。
- 當用戶10分鐘啓動時,客戶端將使用刷新令牌向auth服務器發送新訪問令牌的請求。
- 當用戶更改其密碼或取消特定登錄的訪問權限(如遇盜竊,丟失設備等),刷新令牌將從auth服務器數據庫中刪除並呈現無效狀態。
因此,當用戶意外泄漏密碼或丟失設備時,他可以簡單地更改自己的密碼,這將導致所有先前發出的刷新令牌失效。
但是,這裏顯而易見的安全漏洞是短期訪問令牌在接下來的10分鐘內仍然完全有效。而10分鐘,無論多麼短的時間,仍然有足夠的時間讓惡意用戶造成一些損害。
唯一可能的解決方案,我能想到的是:
保持訪問令牌的黑名單白名單或。這使得刷新令牌的使用看起來非常多餘。如果我們打算在每個請求上點擊數據庫 或保留一個黑名單 訪問令牌的緩存列表,那麼刷新令牌有什麼意義?
使訪問令牌的期滿更短(例如:每1分鐘而不是每10分鐘)。這並不能解決問題,它只是做了一些傷害控制,因爲它縮短了惡意用戶不得不造成傷害的時間窗口。每分鐘打一個新的 訪問令牌的數據庫似乎並不比在每個請求上打 數據庫好得多。
對不起,對於遲到的回覆,但如果我理解這個權利,你基本上會在所有需要訪問它的應用程序服務器上覆制內存數據庫/緩存。我從來沒有真正使用像Redis這樣的內存數據庫,但是我會猜測他們能夠輕鬆地在不同的自身實例之間進行同步。 – aetheus
Redis和其他內存提供者與我習慣的編程範例不同。每個實例都知道如何相互通信,但它們需要進行配置才能完成。這就是說,他們得到了很好的支持,並且我認爲不難想出。大多數圖書館都會向你展示如何與他們互動。 Redis至少有幾個關於如何保護他們在生產中的教程。 – blur0224