首页 > 编程问答 >Starlette SessionMiddleware 将会话数据存储在服务器上还是客户端上?

Starlette SessionMiddleware 将会话数据存储在服务器上还是客户端上?

时间:2024-07-27 13:25:57浏览次数:6  
标签:python fastapi stateless starlette

我正在开发一个无状态 FastAPI 应用程序。身份验证通过 Google OAuth( openid 电子邮件配置文件范围)进行处理。我正在使用 Authlib ,它使用 SessionMiddleware ( request.session ) 来存储临时代码和状态。现在,我想使用令牌限制对某些端点的访问。为此,我使用从 Google 获得的 id 令牌中的用户电子邮件创建 JWT,将其存储在客户端的 cookie 中,并在每次向受保护端点发出请求时验证它。它正是我想要的。

自从我使用 SessionMiddleware 无论如何我想到了一种不同的方法。我可以将用户电子邮件存储在来自 SessionMiddleware 的会话中。它会自动创建一个会话 cookie 并将其存储在客户端。为了限制访问,我可以从会话中获取用户。 Starlette 在后台自动验证 cookie。我已经测试过它,它也工作得很好,并为我节省了很多 JWT 代码。

我的问题是 :是否 SessionMiddleware 将会话数据存储在客户端的 cookie 中,或者只是对 ID 进行编码并会话数据保存在服务器上?

根据我的研究和自己的实现,我得到了不同的答案。如果我重新启动应用程序,我仍然可以使用令牌访问会话数据。这暗示整个过程是无状态的。如果我检查 Starlette 的源代码,我还认为会话数据直接编码在会话 cookie 中。但我在其他地方都看到人们说 SessionMiddleware 有状态运行。


Starlette 的 SessionMiddleware 默认将会话数据存储在 客户端 的 cookie 中。

让我们来分解一下它的工作原理:

  1. 客户端发起请求: 当客户端首次向服务器发起请求时, SessionMiddleware 会生成一个唯一的会话 ID 并将其与一个空的会话字典关联。
  2. 数据加密和存储: SessionMiddleware 使用你提供的密钥对这个会话字典进行加密和签名,然后将其存储在名为 session 的 cookie 中,并将其发送给客户端。
  3. 后续请求: 客户端在后续请求中会自动带上这个 session cookie。
  4. 服务器端解密和验证: SessionMiddleware 收到请求后,会从 cookie 中提取会话数据,使用密钥进行解密和验证,并将解密后的数据存储在 request.session 中。
  5. 修改和保存: 你可以通过 request.session 对会话数据进行修改, SessionMiddleware 会在响应结束时自动将更新后的会话数据加密并存储回 cookie 中。

关于你观察到的现象:

  • 重启应用后仍可访问: 这是因为会话数据存储在客户端的 cookie 中,而不是服务器内存中。只要 cookie 没有过期或被删除,客户端就可以继续使用它访问会话数据。
  • Starlette 源码: Starlette 的源代码确实显示会话数据直接编码在 cookie 中。

关于“有状态”的误解:

有些人可能认为 SessionMiddleware 是“有状态”的,因为他们将“会话”的概念与服务器端的状态联系在一起。实际上, SessionMiddleware 本身是无状态的,因为它不依赖服务器存储任何会话数据。所有会话数据都存储在客户端,服务器只是负责加密、解密和验证。

总结:

SessionMiddleware 提供了一种简单易用的方式来管理客户端会话,它默认使用 cookie 来存储会话数据,因此你的应用程序仍然是无状态的。 但是,需要注意的是,将敏感信息存储在 cookie 中存在安全风险,因此建议仅存储非敏感数据,并使用 HTTPS 来保护 cookie 的传输安全。

标签:python,fastapi,stateless,starlette
From: 78799027

相关文章

  • 我没有 python 但我有 python3
    我最近格式化了我的笔记本电脑并安装了Ubuntu操作系统。我没有明确安装Python。为了检查它是否已预安装,我在终端中运行python--version并得到了这个:$python--versionCommand'python'notfound,butcanbeinstalledwith:sudoaptinstallpython3......
  • 基于YOLOv9的停车场空闲车位检测【python源码+UI界面+数据集+模型+语音报警+安装说明
    往期精品导航基于YOLOv9的脑肿瘤区域检测智慧课堂基于YOLOv8的学生上课行为检测基于YOLOv9+pyside的安检仪x光危险物物品检测(有ui)基于YOLOv9的PCB板缺陷检测基于YOLOv9的线路绝缘子缺陷检测【python源码+UI界面+数据集+模型+语音报警+安装说明】基于YOLOv9的道路状况检测【......
  • 1-python的数据类型与变量
    一、交互模式与脚本模式交互模式:就相当于一种问答模式,关闭即消失无法保存重用比如python自带的编译器脚本模式:可以将代码长期保存以及重复使用如何创建脚本模式:idle——file——newfile[快捷方式:idle——ctrl+n]保存:ctrl+s运行:F5二、变量(Variable)变量:会变化......
  • 2-Python数据类型——序列
    Python数据类型——序列一、序列序列是一个可以存放多个值的容器。有序序列:在序列中每个值都有对应的下标下标:就相当于酒店的房间号,方便客人的查找与酒店的管理在编程中下标的起始值与日常生活中的计数有所不同:下标的计数从0开始计数,从左往右计数:下标从0开始往右递......
  • crontab 运行 .sh 文件调用 python 脚本
    我有一个pythonselenium脚本,可以打开chrome并为我运行一些自动化任务。在crontab中直接调用python可以使用下面的行。:10.0是我运行echo$DISPLAY时得到的值。我使用的是Ubuntu22.04.4LTS5823**2DISPLAY=:10.0/usr/bin/python3/home/user/Script......
  • Pythonanywhere - ping:套接字:不允许操作
    请帮忙。我有一个Telegram机器人,当我从Bash控制台启动他时,它每60秒ping一次静态IP-它工作正常,但每天停止工作一次。我尝试使用“始终开启任务”,但在日志文件中收到“ping:套接字:不允许操作”。我有5美元帐户,我能做什么?从Bash控制台运行时我看到的内容:---17......
  • python+flask计算机毕业设计社区疫情防控物资调配平台(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景近年来,全球公共卫生事件的频发,尤其是新冠疫情的爆发,对社区治理与应急响应能力提出了前所未有的挑战。社区作为疫情防控的第一线,其物资调配......
  • python+flask计算机毕业设计四川工商学院疫情防控系统的设计与实现(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在全球新冠疫情持续蔓延的背景下,高校作为人员密集、流动性大的特殊场所,其疫情防控工作显得尤为重要。四川工商学院作为一所集教学、科研、......
  • python+flask计算机毕业设计企业人事管理系统(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着企业规模的不断扩大与业务复杂度的提升,传统的人事管理方式已难以满足现代企业对高效、精准、自动化管理的需求。企业人事管理涉及员工......
  • python+flask计算机毕业设计外卖食品安全监管微信小程序(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着移动互联网技术的飞速发展,外卖行业作为“互联网+餐饮”的典范,近年来呈现出井喷式增长态势,极大地便利了人们的日常生活。然而,外卖食品......