【问题标题】:How does Flask Sessions work?Flask 会话如何工作?
【发布时间】:2016-11-20 13:00:15
【问题描述】:

我很好奇 Flask 会话是如何工作的,尤其是它如何在服务器重启之间存储信息(如果我错了,请引用我的话)。我知道您必须设置一个唯一的app.secret_key,这样人们就无法解密会话并以任何方式修改 cookie。因为会话的 cookie 只是随机生成的字母和数字,这是否意味着 id 与服务器端的 id 配对,并且服务器存储会话?如果是这样,Flask 将如何记住重启之间的会话?如果不是,Flask 是如何知道解密会话 cookie 的?

【问题讨论】:

    标签: session flask


    【解决方案1】:

    Flask 使用其姊妹项目It's Dangerous 生成会话cookie。项目页面对 It's Dangerous 的工作原理进行了很好的概述,但在高层次上:

    • 会话中的数据(由 session["username"] = "EndenDragon" 设置)被序列化为 JSON 字符串 ({"username":"EndenDragon"})
    • 该字符串使用 base64 编码 (eyJ1c2VybmFtZSI6IkVuZGVuRHJhZ29uIn0=) 进行编码。这对于电子邮件验证链接等用例来说是安全的,它可能会附加在链接的末尾。
    • base64 编码数据有一个“.”附加到它。创建会话时的时间戳是 base64 编码并附加到它。
    • 使用您的密钥为会话 + 时间戳生成加密签名。 “。”之后的会话值的签名。也一样。

    那么响应中的值就是sent to the browser as a Cookie。

    最终用户(以及通过不安全的连接)可以读取会话中的值。服务器可以验证它收到的 cookie 没有被篡改,而无需在其端存储任何内容。它只是从会话值的会话+时间戳部分重新计算签名,并确保它与会话值结束时的签名匹配。

    除了 setting an expiration date on the client side 之外,包含时间戳使 Flask 在服务器端强制执行 permanent sessions 的到期日期。

    附录

    用户可以通过解码会话值的第一部分来轻松读取会话中的值。转到开发者工具中的“存储”或“应用程序”选项卡,查找"session" cookie,将值复制到第一个句点,然后在控制台中运行btoa(<session-part>)。

    【讨论】:

      【解决方案2】:

      默认会话是使用安全 cookie 实现的。 Cookie 由客户端的浏览器保存,Flask 在这方面没有做任何事情。每个客户端都有一个唯一的会话 cookie,它会随每个请求发送到 Flask 服务器。

      cookie 是安全而不是加密,它不会阻止任何拥有 cookie 的人查看数据,只会阻止对其进行修改。 Flask 在发送数据时使用应用程序的密钥对数据进行签名,并在读取数据时使用相同的密钥对其进行取消签名。

      Flask 不会向会话中添加任何内容。没有 session id,浏览器只是在每次请求时发送 session cookie,Flask 会读取它。

      您可以编写自己的session interface 来更改会话的工作方式。查看Flask-Session等扩展名

      【讨论】:

        猜你喜欢
        • 2020-11-02
        • 1970-01-01
        • 2011-02-26
        • 2016-11-17
        • 1970-01-01
        • 2012-01-15
        • 2011-12-16
        相关资源
        最近更新 更多