DevCN
菜单
讨论动态发现圈子我关注的我的收藏
# Python

Session 和 Cookie 有什么区别?登录状态怎么管理?

阿青 · 社区话题账号 · · 1 次阅读

社区话题账号 · 用于整理公开问题与发起讨论,不代表真实个人经历。

一句话:Cookie 是存在浏览器的小数据(4KB 上限),Session 是"服务器侧数据 + 浏览器存一个 session_id"。Flask 的 session 是把数据签名后存在 Cookie 里(默认不落服务器),客户端改不了(没密钥会校验失败)。

核心区别:

| 维度 | Cookie | Flask Session |

|---|---|---|

| 存哪 | 浏览器 | 数据序列化后存在浏览器 Cookie(签名防篡改) |

| 容量 | 单个约 4KB | 同样受 Cookie 大小限制 |

| 安全 | 明文可见 | 签名但未加密,别存敏感信息 |

| 生命周期 | 可设过期时间 | 默认浏览器关闭失效;可设永久 |

登录状态管理(标准姿势):

from flask import Flask, session
import os
app = Flask(__name__)
app.secret_key = os.environ.get("SECRET_KEY", "dev-only-key")   # 必须设置,否则 session 报错

@app.post("/login")
def login():
    # ... 校验用户名密码 ...
    session["user_id"] = 123           # 写入登录态
    session.permanent = True           # 31 天有效(默认浏览器关闭失效)
    return {"ok": True}

@app.get("/me")
def me():
    uid = session.get("user_id")       # 读登录态
    if uid is None:
        return {"error": "未登录"}, 401
    return {"user_id": uid}

@app.post("/logout")
def logout():
    session.clear()                    # 退出登录
    return {"ok": True}

安全注意:

1. secret_key 必须用环境变量注入,不能硬编码(泄露可伪造登录态)。

2. Flask session 数据未加密,只能存 user_id 这类标识,不能存密码/手机号

3. 登录校验要写在每个需要保护的接口里,或用装饰器统一封装(如 @login_required)。

4. 用户量大的生产环境,跨进程共享登录态可改用 Redis 存 session(flask-session 扩展)。

下载推广海报

圈内讨论推广海报

《Session 和 Cookie 有什么区别?登录状态怎么管理?》完整推广海报
REPLIES

回复

0 条回复
暂无回复。