Django 中的 Cookie 行为

Cookie behavior in Django

我研究 Django 中的 cookie 已有一段时间了。

但是,我不明白下面的内容。

django 中 SESSION_COOKIE_DOMAIN 的默认设置是 None,因此域属性将为空。

Django 在 session middleware:

中设置 session cookie
response.set_cookie(
    # ...
    domain=settings.SESSION_COOKIE_DOMAIN,
) 

响应 object 中的 set_cookie 函数具有以下 relevant part 如果域是 None 这是 Django 中的默认设置:

if domain is not None:
    self.cookies[key]['domain'] = domain

因此,我假设 cookie header 中的域被省略了。

我读过这个great article about cookies and user2864740 made a nice conclusion about it:

"当 cookie 中没有设置域时,cookie 应该只匹配请求的确切主机名。 没有子域,没有部分匹配。

这意味着不包括域属性——设置空域属性是无效的。"

1.) 如果将域属性留空无效或者我在这里误解了什么,为什么 cookie 仍然有效?

2.) 假设我拥有域 example.com

我没有修改 django 的默认设置,所以 SESSION_COOKIE_DOMAINNone

如果我检查域 example.com 的 cookie,我会看到以下内容:

我认为设置没有前导点的 cookie 域是无效的。为什么 Django 不使用 .example.com?

如果 cookie 域是 example.com 是否基本相同,因为它会产生与前面的点相同的行为?

3.) 我是否理解正确,如果我在 example.com (没有 www) 上设置 cookie cookie 也将在所有子域上可用,目前无法仅在主域上设置在子域上不可用的 cookie。

1.) 如果将域属性留空无效或者我在这里误解了什么,为什么 cookie 仍然有效?

您刚才指向的代码清楚地表明响应中没有设置任何域;根本不包括钥匙。无效的(更准确地说,"undefined")将包括键 Domain 但遗漏属性值。 Django 不会那样做。

2.) 我认为设置没有前导点的 cookie 域是无效的。为什么 Django 不使用 .example.com?

首先,你把它倒过来了。 RFC 6265 说前导点 "is not permitted"(尽管如果它存在,它会被忽略)。

其次,您显示的 cookie 详细信息不包含 Domain 键。 “主机”不是 cookie 属性;这大概只是 Chrome 告诉你 cookie 来自哪里。

3.) 我是否理解正确,如果我在 example.com(没有 www)上设置 cookie,该 cookie 也将在所有子域上可用,并且它是目前无法仅在主域上设置在子域上不可用的 cookie。

没错。