Flask.session生成的Cookie被识别为第三方Cookie无法读取如何解决?
Flask默认的session是基于Cookie实现的,会把加密后的session数据存储在用户本地Cookie中。当你的Flask应用属于第三方站点(比如被其他域名的页面用iframe内嵌、作为跨站接口被调用)时,Chrome、Brave、Chromium的第三方Cookie禁用规则会阻止浏览器存储、发送你站点域名下的Cookie,导致后续请求中Flask无法读取到对应Cookie解析session,最终session.get()返回None。
如果你的应用是用户直接访问的第一方站点也出现该问题,通常是你手动配置了SESSION_COOKIE_SAMESITE = None,该配置下Cookie会被浏览器判定为跨站可用的第三方Cookie,被禁用规则命中。
方案1:调整Cookie SameSite属性(仅适用第一方站点误触发的场景)
将Flask session Cookie的SameSite属性改为Lax或Strict,即可让浏览器判定为第一方Cookie,不会被第三方禁用规则拦截,配置示例:# 生产环境如果用HTTPS可以同时开启SESSION_COOKIE_SECURE app.config['SESSION_COOKIE_SAMESITE'] = 'Lax' app.config['SESSION_COOKIE_SECURE'] = False # 本地HTTP开发环境关闭该配置方案2:改用服务端存储session(适用确实是第三方嵌入的场景)
放弃默认的Cookie存储session逻辑,改用服务端存储(Redis、数据库均可),session id通过请求参数、自定义请求头传递,完全绕开Cookie限制。可以通过flask-session扩展快速实现:- 安装依赖:
pip install flask-session redis - 配置示例:
import redis from flask_session import Session app.config['SESSION_TYPE'] = 'redis' app.config['SESSION_REDIS'] = redis.Redis(host='127.0.0.1', port=6379)后续请求时前端将获取到的session id放在自定义请求头(比如
X-Session-Id)或接口参数中传递,后端拦截请求读取对应值后从服务端存储中拉取session数据即可。- 安装依赖:
方案3:可引导用户将你的站点加入浏览器的Cookie允许白名单,该方案需要用户手动操作,优先级低于上述技术方案。
内容的提问来源于stack exchange,提问作者étale-cohomology

