簡體   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