使用SignedCookieSessionFactory
时,文档说明使用了sha512 HMAC摘要算法。因此,一旦会话数据被序列化,它就会被签名并在session
cookie下发送给用户的客户端。
在Pyramid的文档中没有提到会话也在服务器端缓存(在此SessionFactory下)。
这提出了一个矛盾,并且当与SessionAuthenticationPolicy
配对时也导致认证混乱。如果无法从客户端的session
cookie中检索会话数据(因为它是单向散列),那么以下哪些是可能的呢?
Request.authenticated_userid
不会返回None。session
cookie复制到剪贴板。forget(request)
的标头。session
cookie。我知道简单地删除cookie客户端不足以使会话完全无效(没有列入黑名单),但这会产生以下问题:
session
cookie实际上是用于在内存中查找会话的密钥/会话ID吗?由于它是单向签名,这肯定是唯一的解释?headers=forget(request)
模式更强大一点?最终,我想答案是这样的:“使用pyramid_redis_sessions
这样的包括维护服务器端会话”
任何解释将不胜感激。
cookie包含所有数据。会话内容本身存储在cookie中,以及该内容的hmac签名。这意味着客户端可以查看内容,如果他们足够努力,但他们无法更改内容,因为他们无法在没有服务器端密钥的情况下创建可信签名。
除非用户最近发布的每个会话cookie以某种方式被记住并列入黑名单/无效,否则如何使用浏览器范围的会话保持安全?
这取决于您使用会话的内容 - 在将数据放入会话对象之前需要考虑这些问题。
是否有可能使服务器端的会话无效,比仅仅为headers = forget(请求)模式更强大一些?
除非你在会话中存储某种id,然后是黑名单ID的服务器端表。如果您这样做,那么您可以编写自己的包装器会话工厂,打开会话,检查ID,如果它被列入黑名单,则返回一个空的。当然,您可能只想使用服务器端会话库,如pyramid_redis_sessions或pyramid_beaker,以及其服务器端存储后端之一。