为什么我的"Set-Cookie"响应标头没有被翻译成实际的cookie?

Dav*_*ave 8 java cookies spring response setcookie

我正在使用Java 8,Wildfly 11,Spring 4和Apache 2.4.我有这个Java代码来设置会话cookie

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);
Run Code Online (Sandbox Code Playgroud)

我在浏览器中注意到这个cookie没有被创建.然后我看了Postman,注意到没有创建cookie,虽然我看到这些响应标题......

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
Run Code Online (Sandbox Code Playgroud)

看起来,当没有创建cookie时,响应头仍然包含这个Set-Cookie头.我不知道这有什么错上述任一的,不过,这将阻止cookie正越来越创建.任何见解都表示赞赏,

Gro*_*ify 7

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

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

要设置Cookie,您需要将Cookie域设置为私有域,Google称之为"有效顶级域名加1"(eTLD + 1),这意味着您的有效顶级域名加上一个子域名,例如您的全部域名 - 此实例中的限定主机名 - ec2-27-123-206-78.compute-1.amazonaws.com.Microsoft使用术语"Public Suffix plus one"(PS + 1)来满足相同的要求.

Mozilla基金会推断排除eTLD /公共后缀

  • 避免为高级域名后缀设置破坏隐私的"超级英雄"
  • 突出显示用户界面中域名最重要的部分
  • 按站点准确排序历史记录条目

Microsoft排除eTLD /公共后缀的推理

设置cookie时,网站可以使用domain属性指定cookie应发送到哪些主机.浏览器必须阻止尝试设置cookie,其中domain属性不以当前页面的私有域结束.不这样做会导致隐私和安全问题.

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

Google Chromium/Chrome行为

谷歌表示Chromium(以及Chrome)在其CookieMonster类的描述中使用"eTLD + 1"存储cookie.

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

域名列表,包括amazonaws.com

您可以在Mozilla的PublicSuffix.org上发布的源代码中看到Firefox使用的有效顶级域名列表.Google CookieMonster页面也引用了PublicSuffix.org.此列表包括许多AWS域,包括您尝试用于EC2的域,由Amazon提交.

// 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
Run Code Online (Sandbox Code Playgroud)

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


ego*_*nko 5

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

从另一方面来说,没有任何意义,因为这个公共地址:"ec2-27-123-206-78.compute-1.amazonaws.com/context/login"是动态的,并不适合你.它是DNS代理,目前为您保留.如果要从EC2实例设置cookie,则应设置自己的主机名的域名,这些域名位于EC2实例的前面.

request.getServerName()

这将为您提供EC2的当前服务器名称.但是,举例来说,如果你的nginx代理请求,你应该得到"主机"头(1,2).


sau*_*mar 3

如果响应头包含set-cookie,则说明 cookie 已经创建。尝试删除 set-domain,让它默认。还可以尝试设置最大年龄。

  • 不是公共域,而是公共后缀。我的错。无论如何:请点击链接:[https://publicsuffix.org](https://publicsuffix.org/) 和实际列表:[https://github.com/publicsuffix/list/blob/master/public_suffix_list。 dat](https://github.com/publicsuffix/list/blob/master/public_suffix_list.dat)。不幸的是,您无法以编程方式解决它。它是由 mozilla 维护的列表。 (3认同)
  • 好吧。您无法为“.compute-1.amazonaws.com”设置 cookie,它是公共域。如果您碰巧在“compute-1.amazon.com”上浏览两个以上网站,您将始终覆盖彼此的会话。您应该将 cookie 域设置为“ec2-27-123-206-78.compute-1.amazonaws.com”。您的用例是什么,为什么不能让域默认或使用服务器名称作为域。 (2认同)