Flask Sessions如何运作?

时间:2016-07-18 02:47:32

标签: session flask

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

2 个答案:

答案 0 :(得分:11)

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

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

Flask不会向会话添加任何内容。没有会话ID,浏览器只在每次请求期间发送会话cookie,Flask会读取它。

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

等扩展程序

答案 1 :(得分: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 未被篡改,而无需在其端存储任何内容。它只是从会话值的会话 + 时间戳部分重新计算签名,并确保它与会话值末尾的签名匹配。

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

附录

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