2015-02-06 81 views
2

我使用的Redis作爲會話存儲,的Redis作爲會話存儲,無效的用戶的所有會話

存儲會話像這樣

[NameSpace]:[UniqueId] -> [email_id] 

這是問題所在,

時用戶重置密碼,我如何使該用戶的所有會話無效?

這裏是解決方案我想出了,

存儲電子郵件ID爲

存儲會話像這樣

[NameSpace]:[UniqueId]-[email_id] -> [email_id] 

UID的一部分,那麼我可以用SCAN MATCH刪除所有當用戶重置密碼時使用密鑰。

維護的UID

的列表存儲會話後像

[NameSpace]:[UniqueId] -> [email_id] 

保持與

[NameSpace2]:[email_id] -> [ "[UniqueId]", "[UniqueId]" ] 

一個單獨的列表,並使用無效列表中的會話。 (我可以用redis命名空間發佈訂閱來維持上述名單的有效性)

我的問題是

  1. 什麼是推薦的方式做批量會話無效在Redis的?
  2. 在cookie中存儲像[UniqueId]-[email_id]這樣的會話標識是否存在安全問題?

PS:我知道有類似的問題,但我覺得它很嘈雜,面向express.js,而不是通用的redis和用戶會話。 (Invalidating all of a single user's sessions in express.js

回答

1

Re。 1 - 因爲活動用戶會話的數量遠遠低於(大概)數據庫中的會話總數,所以我會去手動管理每個用戶的活動會話而不是SCAN ning。但是,我會使用每個用戶的集合來存儲活動會話密鑰標識符而不是列表,因爲您希望能夠有效地添加和刪除活動會話。如果用戶有一個批次需要批量失效的活動會話,則可以使用SSCAN而不是SMEMBERS

Re。 2 - 如果有人鑽進你的應用/數據庫服務器有很多的安全問題:)

+0

此外還有一些更多細節在這裏:https://groups.google.com/d/msg/redis-db/Vm7c4gvXgl8/vdRw-z1YuxgJ – 2015-02-06 15:49:57

+1

感謝您的答案,我會與我的團隊在這裏討論。 關於你的第二個答案,如果有人進入app/db服務器,我們無論如何都完成了,他們無論如何都可以讀取鍵和值。所以這不應該是我想的問題。 – Gautam 2015-02-06 15:59:39

1

維護一組的所有用戶會話

[NameSpace]:[email_id] -> {}

每個會話標識符是集合的值。如果你想存儲會話屬性使用地圖sessionIdentifier1 -> sessionProperties1(查找和刪除成本是相同的)

[NameSpace]:[email_id] -> {sessionIdentifier1 , sessionIdentifier2}

散裝會話失效 - Delete關鍵[NameSpace]:[email_id]。成本O(1)。

展望了sessionIdentifier - 關鍵[NameSpace]:[email_id]SISMEMBERsessionIdentifier1。成本O(1)。

在Cookie中存儲會話ID像 [UniqueId] - [email_id]是否存在任何安全問題?

這取決於。如果cookie不是HttpOnly,它將允許惡意JS通過XSS漏洞讀取該cookie。您可以開放自己的網絡釣魚攻擊。您可以改用用戶的內部UUID

1

根據您的示例,看起來您將會話存儲爲鍵 - >單個值對,並且用戶可以有多個會話。有幾種方法可以解決這個問題。

  1. 在頁面加載時使用非常短的到期和刷新。作爲密碼更改代碼的一部分,您從用戶會話中提取會話ID並將其刪除。短期到期確保刪除舊會話。

  2. 使用散列或一組散列。根據用戶數量,您可以使用單個散列,如果「小」用戶羣,或將它們散列到存儲桶中。然後,您可以存儲名稱空間:會話[用戶ID] - >電子郵件。此時您可以輕鬆刪除單個用戶會話,並且您沒有重複的會話。您確實失去了自動過期會話的能力。

  3. 使用散列值,排序集和清理的計劃任務。在此方法中,您使用會話ID作爲具有會話密鑰及其值的散列的密鑰。其中兩名成員是創作人,最後一次看到時間戳。然後,您可以爲將sessionid映射到上次看到的時間戳的每個用戶使用另一個散列。有了這個功能,您可以從選項1中更新頁面上的更新,但您可以輕鬆獲取每個用戶的會話列表。但是,這不會修剪舊時段。您可以過期散列,但是您必須同時過期並更新頁面視圖或我們的計劃任務。

爲此,您可以使用以會員ID作爲成員和時間戳記作爲分數的有序集合。現在,您可以使用標準的排序集查詢(如zrangebyscore)將比特定時間戳更早的所有會話都列入列表,然後刪除這些鍵和成員。

您可以通過讓會話創建代碼檢查用戶的會話散列是否存在並使用過期或讓會話創建代碼檢查上次更新在活動會話條件中並重新使用它來阻止多個會話使用此選項或從中清除臨時成員。因爲您可以有單個會話,或者可以輕鬆地提取列表,並希望到期和/或計劃任務可以刪除舊會話,管理會話變得更加容易 - 而且無需掃描或密鑰。

我建議每個用戶使用單一會話並自由使用到期。