我很好奇Flask会话是如何工作的,特别是它如何在服务器重启之间存储信息(如果我错了,请引用我)。我知道你必须设置一个唯一的app.secret_key
,这样人们就无法解密会话并以任何方式修改cookie。因为会话的cookie只是随机生成的字母和数字,这是否意味着id与服务器端的id配对,并且服务器存储会话?如果是这样,Flask将如何记住重启之间的会话?如果没有,Flask如何知道解密会话cookie?
答案 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"}
)eyJ1c2VybmFtZSI6IkVuZGVuRHJhZ29uIn0=
) 进行编码。这对于电子邮件验证链接等用例来说是安全的,它可能会附加在链接的末尾。响应中的值为 sent to the browser as a Cookie。
最终用户可以读取会话中的值(以及通过不安全的连接)。服务器可以验证它收到的 cookie 未被篡改,而无需在其端存储任何内容。它只是从会话值的会话 + 时间戳部分重新计算签名,并确保它与会话值末尾的签名匹配。
包含时间戳使 Flask 除了 permanent
sessions 之外,还可以在服务器端强制执行 setting an expiration date on the client side 的到期日期。
附录
用户可以通过解码会话值的第一部分来轻松读取会话中的值。转到开发人员工具中的“存储”或“应用程序”选项卡,查找 "session"
cookie,将值复制到第一个句点,然后在控制台中运行 btoa(<session-part>)
。