Django中的Cookie行为

时间:2018-11-17 09:35:48

标签: django cookies session-cookies

我已经在Django中对cookie进行了一些研究。

但是,我不理解以下内容。

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

Django在session middleware中设置会话cookie:

response.set_cookie(
    # ...
    domain=settings.SESSION_COOKIE_DOMAIN,
) 

如果域为None(这是Django中的默认设置),则响应对象的set_cookie函数具有以下relevant part

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

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

我已经读过great article about cookies,而user2864740做得很好conclusion about it

”如果在cookie中未设置任何域,则cookie应该仅与请求的确切主机名匹配。 没有子域,没有部分匹配。

这意味着根本不包括domain属性-设置空的domain属性无效。”

1。)如果将domain属性保留为空无效还是我在这里误解了某些内容,为什么cookie仍然可以工作?

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

我不修改Django的默认设置,因此 SESSION_COOKIE_DOMAIN None

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

  • 名称:sessionid
  • 值:XXXXXX
  • 主机:example.com

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

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

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

1 个答案:

答案 0 :(得分:1)

1。)为什么如果将domain属性保留为空无效或我在这里误解了某些内容,cookie仍然可以工作?

您刚刚指向的代码清楚地表明,响应中未设置任何域。根本不包含密钥。无效的(更确切地说是"undefined")将包括键Domain,但没有属性值。 Django不会这么做。

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

首先,您要倒退。 RFC 6265表示前导点"is not permitted"(尽管如果有,将被忽略)。

第二,您显示的Cookie详细信息不包含Domain键。 “主机”不是cookie属性;大概只是Chrome告诉您Cookie的来源。

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

对。