我已经在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,则会看到以下内容:
我认为设置没有前面加点的cookie域是无效的。 Django为什么不使用 .example.com ?
如果Cookie域是 example.com ,是否基本相同,因为它会产生与前面的点相同的行为?
3。)我是否正确理解,如果我在 example.com (不带www)上设置cookie,则该cookie也将在所有子域中可用,并且当前无法仅在子域上不可用的主域上设置cookie。
答案 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在主域上,而在子域上不可用。
对。