
本文详解如何通过正确配置 session_cookie_domain 避免 django 应用在多子域名环境下意外共享会话 cookie,并支持动态、精准的域名绑定策略。
本文详解如何通过正确配置 session_cookie_domain 避免 django 应用在多子域名环境下意外共享会话 cookie,并支持动态、精准的域名绑定策略。
在多子域名部署场景中(如 app.dev.fox.com、abc.dev.fox.com),开发者常误用带前导点号(.dev.fox.com)的 Cookie 域名,导致浏览器将 Cookie 发送给所有匹配的子域名——这不仅破坏了应用隔离性,更可能引发安全风险(如跨子域会话劫持)。根本原因在于:RFC 6265 规定,以点开头的域名(如 .dev.fox.com)表示“匹配该域名及其所有子域名”;而不带前导点号的域名(如 dev.fox.com 或 app.dev.fox.com)则仅精确匹配该主机名。
✅ 正确做法:移除前导点号,显式指定精确域名
Django 中控制会话 Cookie 域名的核心配置是 SESSION_COOKIE_DOMAIN(注意:DJANGO_COOKIE_DOMAIN 并非标准设置项,应使用 SESSION_COOKIE_DOMAIN)。只需去掉域名前的点号,即可实现严格匹配:
# ❌ 错误:通配所有子域名(.dev.fox.com → 匹配 app.dev.fox.com, abc.dev.fox.com 等) SESSION_COOKIE_DOMAIN = '.dev.fox.com' # ✅ 正确:仅作用于指定主机(精确匹配) SESSION_COOKIE_DOMAIN = 'app.dev.fox.com' # 仅 app.dev.fox.com 可读写 # 或 SESSION_COOKIE_DOMAIN = 'abc.dev.fox.com' # 仅 abc.dev.fox.com 可读写
此时,用户在 app.dev.fox.com 登录后,Cookie 将仅被浏览器发送至该完整主机名,不会泄露给 abc.dev.fox.com 或 dev.fox.com,真正实现会话隔离。
? 动态设置 Cookie 域名(按请求 Host 自动适配)
若需支持多个独立子域名(如 app.dev.fox.com、admin.dev.fox.com、api.dev.fox.com)各自维护独立会话,可结合中间件或自定义认证逻辑动态设置 SESSION_COOKIE_DOMAIN:
# settings.py
SESSION_COOKIE_DOMAIN = None # 先设为 None,交由运行时决定
# middleware.py
from django.utils.deprecation import MiddlewareMixin
class DynamicSessionDomainMiddleware(MiddlewareMixin):
def process_request(self, request):
host = request.get_host().split(':')[0] # 忽略端口
# 白名单校验,防止 Host 头注入
allowed_domains = {
'app.dev.fox.com',
'admin.dev.fox.com',
'api.dev.fox.com'
}
if host in allowed_domains:
request.session.cookie_domain = host
⚠️ 重要安全提示:动态设置必须配合严格的 Host 白名单校验。切勿直接信任客户端传入的 Host 头,否则可能被利用进行 Cookie 域名污染攻击。
? 补充说明与最佳实践
- Firebase Token 场景适配:你提到 Token 来自 Firebase Authentication。此时 Cookie 域名设置与 Token 验证逻辑无关,但务必确保前端在调用 Firebase SDK 时使用的 authDomain 与后端 Cookie 域名策略一致(例如,若后端只接受 app.dev.fox.com 的 Cookie,则前端登录页也应托管于该域名下)。
-
其他相关 Cookie 配置:为强化安全性,建议同步配置:
SESSION_COOKIE_SECURE = True # 仅 HTTPS 传输 SESSION_COOKIE_HTTPONLY = True # 禁止 JavaScript 访问 SESSION_COOKIE_SAMESITE = 'Lax' # 防 CSRF(推荐 Lax 或 Strict)
- 测试验证方法:使用浏览器开发者工具 → Application → Cookies,检查 sessionid Cookie 的 Domain 字段是否与预期完全一致(如显示 app.dev.fox.com 而非 .dev.fox.com)。
通过精确控制 SESSION_COOKIE_DOMAIN,你不仅能解决子域名 Cookie 泄露问题,更能构建符合零信任原则的多租户/多环境隔离架构。记住:最小权限原则同样适用于 Cookie 域名——永远只赋予其必需的作用范围。











