繁体   English   中英

Flask Sessions 是如何工作的?

[英]How does Flask Sessions work?

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

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

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

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

您可以编写自己的会话界面来更改会话的工作方式。 查看扩展,例如Flask-Session

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

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

然后将该值作为响应中的 Cookie 发送到浏览器

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

除了在客户端设置到期日期之外,时间戳的包含使 Flask 能够在服务器端强制执行permanent会话的到期日期

附录

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM