详解Flask中Session和Cookie

一、基本概念区分

概念 本质 存储位置 特点
Cookie 一小段字符串 浏览器​ 每次请求自动携带
Session 服务器端"会话数据"的抽象 **服务器端(默认在 Cookie 中加密存储)**​ Flask 中 Session 本质是一个加密后的 Cookie

✅ 核心结论(非常重要)

Flask 的 Session 默认是基于 Cookie 实现的,而不是服务器端存储。

二、Cookie 在 Flask 中的工作机制

Cookie 是服务器通过 Set-Cookie 响应头交给浏览器保存的数据

浏览器在后续请求中通过 Cookie 请求头自动回传

典型用途:

登录状态

用户偏好

跟踪标识

设置 Cookie

复制代码
from flask import Flask, make_response

app = Flask(__name__)

@app.route("/set")
def set_cookie():
    resp = make_response("set cookie")
    resp.set_cookie("username", "zhangsan", max_age=3600)
    return resp

读取 Cookie

复制代码
from flask import request

@app.route("/get")
def get_cookie():
    username = request.cookies.get("username")
    return username

删除 Cookie

复制代码
resp.delete_cookie("username")

Cookie 常见参数

复制代码
resp.set_cookie(
    key="token",
    value="abc123",
    max_age=3600,          # 存活时间(秒)
    expires=None,          # 过期时间
    path="/",              # 生效路径
    domain=None,           # 生效域名
    secure=True,           # 仅 HTTPS
    httponly=True,         # JS 无法读取(防 XSS)
    samesite="Lax"         # 防 CSRF
)

三、Flask 中的 Session(重点)

1️⃣ Flask Session 的本质

Flask 的 session 对象:

复制代码
from flask import session

是一个 字典对象

实际存储在 浏览器 Cookie 中

Cookie 内容是:

✅ 加密

✅ 签名

❌ 不存储在服务器

结构示意:

复制代码
session_data = {
    "user_id": 1,
    "is_login": True
}

cookie_value = encrypt_and_sign(session_data)

2️⃣ Session 为什么需要密钥?

复制代码
app.secret_key = "super-secret-key"

作用:

对 Session 数据进行 签名

防止客户端篡改 Session 内容

⚠️ 如果 secret_key 泄露:

攻击者可伪造任意 Session

直接登录任意用户

3️⃣ Session 的基本使用

设置 Session

复制代码
from flask import session

@app.route("/login")
def login():
    session["user_id"] = 1
    session["username"] = "zhangsan"
    return "login success"

读取 Session

复制代码
@app.route("/profile")
def profile():
    if "user_id" not in session:
        return "not login"
    return session["username"]

删除 Session

复制代码
session.pop("user_id", None)
# 或
session.clear()

4️⃣ Session 的生命周期

默认:

浏览器关闭即失效

可配置为永久 Session:

复制代码
from datetime import timedelta

app.config["PERMANENT_SESSION_LIFETIME"] = timedelta(days=7)

session.permanent = True
复制代码
┌────────────┐
│   Browser  │
│ Cookie:    │
│ session=   │──────┐
│ (加密数据) │      │
└────────────┘      │
                    ▼
          ┌──────────────────┐
          │ Flask Server      │
          │ decrypt + verify │
          │ → session dict   │
          └──────────────────┘

✅ 服务器不保存 Session

✅ 每次请求自动解析 Cookie

五、Flask Session 的优缺点

✅ 优点

无需数据库 / Redis

横向扩展友好

使用简单

❌ 缺点

Cookie 大小限制(通常 4KB)

无法主动让某个 Session 失效

不适合存储敏感数据

性能随数据量增大下降

六、服务器端 Session(进阶)

当 Cookie Session 不够用时,可使用:

1️⃣ Flask-Session

支持存储后端:

Redis ✅(最常用)

Memcached

SQLAlchemy

Filesystem

示例(Redis):

复制代码
from flask_session import Session

app.config["SESSION_TYPE"] = "redis"
app.config["SESSION_REDIS"] = Redis(host="localhost", port=6379)

Session(app)

此时:

Cookie 中只存 session_id

数据存在服务器

七、安全注意事项

✅ 必须做

设置 secret_key

使用 HttpOnly

使用 Secure

使用 SameSite

❌ 不要做

在 Session 中存密码

使用弱密钥

在前端 JS 中直接操作 Session Cookie

八、易错点

Q1:Flask Session 存在哪里?

✅ 默认存在客户端 Cookie 中(加密)

Q2:Cookie 和 Session 的区别?

✅ Cookie 在客户端,Session 在服务端(Flask 默认是加密 Cookie)

Q3:为什么 Flask Session 不需要数据库?

✅ 因为数据直接存在 Cookie 里

Q4:如何主动让 Session 失效?

❌ Cookie Session 很难

✅ 使用服务器端 Session(Redis)

九、一句话总结

Cookie 是浏览器存储,Session 是 Flask 对会话数据的抽象;Flask 默认把 Session 加密后存在 Cookie 里。

相关推荐
威哥爱编程1 小时前
模拟面试智能体开发实战 04:面试聊到哪算哪?用状态机把整场面试编排起来
python·agent·harmonyos
威哥爱编程1 小时前
模拟面试智能体开发实战 03:AI 面试官太客气?人设 Prompt 让它像个真考官
python·agent·harmonyos
量化分析码农1 小时前
股票数据接口返回字段逐项解析:从在线验证到 Python 数据校验
python
Dmz丶2 小时前
前端转 AI 100 天 Day 42:跨模型对比实战——用数据选模型,不靠“听说”
python
路溪非溪2 小时前
python标准库使用总结
开发语言·python
青少儿编程课堂3 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:折半搜索优化子集枚举(Meet in the Middle)解析
c++·python·算法·bfs·信息学竞赛
用户956256254293 小时前
五分钟用 E2B SDK 打通沙箱:环境变量只改三行
python·api
用户95179422510294 小时前
最小循环:让 Agent 跑起来(I1)
python·agent
沉默小管4 小时前
上班鼓励器_桌宠版
python