如何阻止子域名间Cookie共享?Django+Firebase动态配置方案
核心逻辑
要实现子域名Cookie完全隔离,核心就是放弃通配符Cookie域配置,给每个请求的精确子域名单独绑定Cookie的domain属性——这样Cookie只会被当前访问的子域名读取,不会扩散到其他同后缀子域名。
步骤1:移除全局通配符Cookie设置
先把settings.py里的DJANGO_COOKIE_DOMAIN = '.dev.fox.com'删掉或注释掉,全局通配符是跨子域名共享的根源。
步骤2:Django端动态设置Cookie Domain
在登录视图里,从请求对象中获取当前访问的精确域名,把它作为Cookie的domain参数传入,实现动态绑定。
示例代码:
from django.http import HttpResponse from firebase_admin import auth def login_view(request): # 处理Firebase认证逻辑,获取id_token id_token = request.POST.get('id_token') decoded_token = auth.verify_id_token(id_token) uid = decoded_token['uid'] # 获取当前请求的精确域名(如app.dev.fox.com) current_domain = request.get_host() # 设置会话Cookie,绑定到当前精确域名 response = HttpResponse("登录成功") response.set_cookie( 'session_token', value=id_token, domain=current_domain, httponly=True, secure=True, # 生产环境强制开启 samesite='Lax' ) return response
这样用户在app.dev.fox.com登录时,Cookie的domain就是app.dev.fox.com;在abc.dev.fox.com登录时,domain自动切换为abc.dev.fox.com,天然实现子域名隔离。
步骤3:处理Firebase自动生成的认证Cookie
如果Firebase SDK自动帮你设置认证Cookie,需要在前端初始化时指定动态域名,避免Firebase用通配符设置Cookie:
import { initializeApp } from "firebase/app"; import { getAuth, setPersistence, browserCookiePersistence } from "firebase/auth"; const firebaseConfig = { // 你的Firebase配置信息 }; const app = initializeApp(firebaseConfig); const auth = getAuth(app); // 配置Firebase认证Cookie绑定到当前域名 setPersistence(auth, browserCookiePersistence({ cookieDomain: window.location.hostname }));
额外注意点
- 开发环境用
localhost测试时,直接把domain设为localhost即可,不要加通配符,否则浏览器可能不识别。 - 生产环境必须开启
secure=True,且域名必须是HTTPS协议,否则浏览器会拒绝设置Cookie。 SameSite建议设为Lax或Strict,既防CSRF攻击,又能避免跨域场景下的Cookie丢失。
内容的提问来源于stack exchange,提问作者MR WHO
相关产品推荐
相关产品推荐

