Session Redis作为会话存储,使用户的所有会话无效
我将redis用作会话存储 像这样存储会话Session Redis作为会话存储,使用户的所有会话无效,session,redis,reset-password,Session,Redis,Reset Password,我将redis用作会话存储 像这样存储会话 [NameSpace]:[UniqueId] -> [email_id] [NameSpace]:[UniqueId]-[email_id] -> [email_id] 问题是, 当用户重置密码时,如何使该用户的所有会话无效 以下是我提出的解决方案 将电子邮件id存储为UID的一部分 像这样存储会话 [NameSpace]:[UniqueId] -> [email_id] [NameSpace]:[UniqueId]-[emai
[NameSpace]:[UniqueId] -> [email_id]
[NameSpace]:[UniqueId]-[email_id] -> [email_id]
问题是,
当用户重置密码时,如何使该用户的所有会话无效
以下是我提出的解决方案
将电子邮件id存储为UID的一部分
像这样存储会话
[NameSpace]:[UniqueId] -> [email_id]
[NameSpace]:[UniqueId]-[email_id] -> [email_id]
然后,当用户重置密码时,我可以使用SCAN MATCH
删除所有密钥
维护UID列表
存储会话后,如
[NameSpace]:[UniqueId] -> [email_id]
保留一份单独的清单
[NameSpace2]:[email_id] -> [ "[UniqueId]", "[UniqueId]" ]
并使用列表使会话无效。(我可以使用redis
namespace pubsub来维护上述列表的有效性)
我的问题是
[UniqueId]-[email\u id]
是否存在任何安全问题李>
PS:我知道有一个类似的问题,但我觉得这个问题很吵,而且是针对express.js的,而不是针对redis和用户会话的。
()Re。1-由于活动用户会话的数量远低于(大概)数据库中会话总数,因此我会选择手动管理每个用户的活动会话,而不是
SCAN
ning。但是,我会使用一个针对每个用户的集合来存储活动会话密钥标识符,而不是一个列表,因为您希望能够有效地在其中添加和删除活动会话。如果用户有大量需要批量失效的活动会话,则可以使用SSCAN
而不是SMEMBERS
Re。2-如果有人进入你的应用程序/db服务器,会有很多安全问题:)维护一组所有用户会话
[NameSpace]:[email\u id]->{}
每个会话标识符都是集合中的一个值。如果要存储会话属性,请使用映射sessionIdentifier1->sessionProperties1
(查找和删除成本相同)
[NameSpace]:[email_id]->{sessionIdentifier1,sessionIdentifier2}
批量会话无效-密钥[名称空间]:[email\u id]
。成本O(1)
查找sessionIdentifier-sessionIdentifier 1
项的[名称空间]:[email\u id]
。成本O(1)
像这样存储会话id是否存在任何安全问题
cookie中的[UniqueId]-[email_id]吗
视情况而定。如果cookie不是
HttpOnly
,它将允许恶意JS通过XSS漏洞读取cookie。你可能会让自己受到网络钓鱼攻击。您可以使用用户的内部UUID
。根据您的示例,您似乎将会话存储为键-->单值对,并且用户可以有多个会话。有几种方法可以解决这个问题
我建议每个用户使用一次会话,并自由使用expiration 还有更多细节:谢谢你的回答,我将在这里与我的团队讨论。关于你的第二个答案,如果有人进入了app/db服务器,他们无论如何都可以读取密钥和值。所以我想这不应该是个问题。