首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的"Set-Cookie“响应头没有转换成实际的cookie?

问为什么我的"Set-Cookie“响应头没有转换成实际的cookie?
EN

Stack Overflow用户
提问于 2018-05-12 04:54:45
回答 3查看 1.4K关注 0票数 10

我使用的是Java 8、Wildfly 11、Spring4和Apache2.4。我有这段Java代码来设置会话cookie

代码语言:javascript
复制
cookie = new Cookie(SESSION_ID_KEY, sessionId);
...
final String domain = request.getServerName().indexOf(".") == -1 ? request.getServerName() : request.getServerName().substring(request.getServerName().indexOf(".") + 1, request.getServerName().length());
if (!StringUtils.equals(domain, "localhost") && !isIpAddress)
{
            cookie.setDomain(domain.indexOf('.') > -1 ? "." + domain : domain);
}   // if
final String contextPath = request.getContextPath() != null && request.getContextPath().endsWith("/") ? request.getContextPath().substring(0, request.getContextPath().length() - 1): request.getContextPath();
cookie.setPath(contextPath);
System.out.println("setting domain " + domain + " and context path:" + contextPath);
response.addCookie(cookie);

我注意到在我的浏览器中没有创建这个cookie。然后我查看了Postman,注意到cookies没有被创建,尽管我看到了这些响应头……

代码语言:javascript
复制
Set-Cookie →MY.SESSION.ID=10c25010534c4dd3900851ec1dfaebeb; path=/context; domain=.compute-1.amazonaws.com
Set-Cookie →closeTrialNoteDialog=""; Max-Age=0; Expires=Thu, 01-Jan-1970 00:00:00 GMT

似乎在没有创建cookie时,响应标头仍然包含此Set-Cookie标头。但是,我不能断定以上两种方法都有什么问题,这会阻止cookie的创建。任何洞察力都值得欣赏,

EN

回答 3

Stack Overflow用户

发布于 2018-05-20 04:54:18

Cookie域必须是特定于您的组织的私有域,而不是许多组织使用的公共域。

在这种情况下,您正在使用的AWS域.compute-1.amazonaws.com未被设置,因为浏览器将其视为公共域,特别是称为“有效顶级域(eTLD)”、“扩展顶级域”和“公共后缀”。常见的顶级域(TLD)包括像.com、.net和.org这样的“通用TLD”(gTLD)和像.us和.uk这样的“国家代码TLD”(ccTLD)。有了公有云,浏览器现在也认为流行的共享云域是“有效的TLD”,包括来自AWS的许多域名,例如您正在尝试使用的域名。

要设置cookie,您需要将Cookie域设置为一个私有域,即谷歌所说的“有效顶级域名加一”(eTLD+1),这意味着您的有效顶级域名加一个子域,例如您的整个完全限定的主机名- ec2-27-123-206-78.compute-1.amazonaws.com。微软使用术语“公共后缀加一”(PS+1)来表示同样的要求。

排除eTLD /公共后缀的Mozilla基础推理

site suffixes

  • Highlight避免为高级域名设置破坏隐私的"supercookies“高级域名是域名中最重要的部分,请按站点历史记录条目排序历史记录条目interface

  • Accurately

基础参考:https://publicsuffix.org/ (Mozilla

  • )

微软排除eTLD /公共后缀的理由

设置cookie时,网站可以使用域属性指定应将cookie发送到哪些主机。浏览器必须阻止在域属性不以当前页的私有域结尾的情况下设置cookie的尝试。如果不这样做,会导致隐私和安全问题。

  • 隐私:允许不相关的域共享cookie可能会导致“超级cookie”--cookie被发送到多个碰巧共享公共Suffix.
  • Security:会话固定攻击的不相关组织,其中一个好站点和一个邪恶站点共享一个公共后缀,而邪恶站点在公共后缀上设置一个恶意cookie,以便向好站点发送邪恶cookie。

https://blogs.msdn.microsoft.com/ieinternals/2009/09/18/understanding-domain-names-in-internet-explorer/

  • 参考

谷歌铬/铬行为

谷歌指出,Chromium (因此Chrome)在其CookieMonster类的描述中使用"eTLD+1“来存储cookie。

cookies的核心数据结构是CookieMonster成员,它是从一个域到一组cookies_的多映射(允许单个键使用多个值)。每个cookie都由一个CanonicalCookie()表示,它包含可以在cookie中指定的所有信息(请参见图表和RFC2695)。设置后,cookies被放入此数据结构中,检索涉及到搜索此数据结构。此数据结构的关键字是Cookie域的最具包容性的域(最短的点分隔后缀),该Cookie域没有命名域名注册商(即"google.com“或"bbc.co.uk",但不是"co.uk”或"com")。这也称为有效的顶级域加一,简称为eTLD+1。

https://www.chromium.org/developers/design-documents/network-stack/cookiemonster

  • 参考

包括amazonaws.com在内的域列表

你可以在Mozilla的PublicSuffix.org上发布的源代码中看到火狐使用的有效顶级域名的列表。谷歌CookieMonster页面也引用了PublicSuffix.org。此列表包括许多AWS域名,其中包括您尝试用于EC2的域名,由亚马逊提交。

代码语言:javascript
复制
// Amazon Elastic Compute Cloud : https://aws.amazon.com/ec2/
// Submitted by Luke Wells <psl-maintainers@amazon.com>
*.compute.amazonaws.com
*.compute-1.amazonaws.com
*.compute.amazonaws.com.cn
us-east-1.amazonaws.com

https://publicsuffix.org/list/effective_tld_names.dat

  • 参考

注意:我刚刚注意到saurav kumar在评论中发布了Mozilla链接。

票数 8
EN

Stack Overflow用户

发布于 2018-05-18 19:36:33

您尝试为亚马逊EC2实例设置Cookie的问题。从一方面来说,这是不可能的,因为它是公共后缀的一部分,如前所述,出于安全原因,您不能这样做。

从另一个角度来看,这是没有意义的,因为这个公共地址:"ec2-27-123-206-78.compute-1.amazonaws.com/context/login“是动态的,并且它不是为您固定的。它是DNS代理,当前为您保留。如果您想从EC2实例设置cookie,您应该设置您自己的主机名的域名,该域名位于EC2实例前面。

request.getServerName()

这将为您提供当前服务器名称EC2。但是,例如,如果你用nginx代理请求,你应该得到'Host‘头(1,2)。

票数 6
EN

Stack Overflow用户

发布于 2018-05-14 22:03:09

如果响应头包含set-cookie,则必须已创建cookie。尝试删除set-domain,将其设为默认值。也可以尝试设置最大年龄。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50300127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档