一、基本概念区分
| 概念 | 本质 | 存储位置 | 特点 |
|---|---|---|---|
| Cookie | 一小段字符串 | 浏览器 | 每次请求自动携带 |
| Session | 服务器端"会话数据"的抽象 | **服务器端(默认在 Cookie 中加密存储)** | Flask 中 Session 本质是一个加密后的 Cookie |
✅ 核心结论(非常重要)
Flask 的 Session 默认是基于 Cookie 实现的,而不是服务器端存储。
二、Cookie 在 Flask 中的工作机制
1️⃣ Cookie 是什么?
Cookie 是服务器通过 Set-Cookie 响应头交给浏览器保存的数据
浏览器在后续请求中通过 Cookie 请求头自动回传
典型用途:
登录状态
用户偏好
跟踪标识
2️⃣ Flask 中操作 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
四、Session 与 Cookie 的关系(图解理解)
┌────────────┐
│ 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 里。