在不同端口之间共享 Cookie

Posted

技术标签:

【中文标题】在不同端口之间共享 Cookie【英文标题】:Sharing Cookie between different ports 【发布时间】:2018-01-04 18:59:36 【问题描述】:

我有一个托管在端口:80 上的应用程序 1(C#)和托管在端口:3030 上的应用程序 2(nodejs)。两者都在本地主机上。

请求流程如下:

浏览器向应用程序 1 发送请求 应用程序 1 发回 cookie 的数量 稍后浏览器将请求发送到应用程序 2 ^ 问题在最后一步,cookie 没有包含在请求中。

我尝试过/理解的事情:

我了解这是同源策略限制,并且由于端口号不同,浏览器会将它们视为不同的域。

在应用程序 1(它使用 System.Web.HttpCookie)中,我尝试将域设置为特定于端口的域(“127.0.0.1:3030”),但似乎浏览器不接受或忽略它。

//c# code
var testCookie1 = new HttpCookie("Test", "testValue");
testCookie1.Domain = "127.0.0.1:3030";
testCookie1.Path = "/";
testCookie1.Expires = DateTime.Now.AddDays(1);
Response.SetCookie(testCookie1);

var testCookie2 = new HttpCookie("Test2", "testValue2");
testCookie2.Domain = "127.0.0.1";
testCookie2.Path = "/";
testCookie2.Expires = DateTime.Now.AddDays(1);
Response.SetCookie(testCookie2);

服务器发回一个带有端口号的 cookie,但浏览器似乎忽略了它。

这是我的 ajax 调用:

   var request = $.ajax(
        url: 'http://127.0.0.1:3030/SomeTask',
        type: 'POST',
        crossDomain: true,
    );

【问题讨论】:

两台服务器正在相互通信,在舞台/生产级别这将很容易实现,因为它们将具有相同的域和相同的端口 (80),但我正试图让它在本地主机上工作以获取开发环境。 @CodeCaster 你是如何让它工作的? 【参考方案1】:

在这种情况下,您的域是相同的 localhost,所以应该没有任何问题。

另一件事是:端口是 URI 的一部分,而不是域的一部分,域也是 URI 的一部分,所以你是在混合苹果和水果......

请参考这个another question in SO

rfc 明确说明

简介

由于历史原因,cookie 包含许多安全和隐私方面的缺陷。例如,服务器可以指示给定的 cookie 用于“安全”连接,但 Secure 属性在存在活动网络攻击者的情况下不提供完整性。 同样,给定主机的 cookie 在该主机上的所有端口之间共享,即使网络浏览器使用的通常“同源策略”会隔离通过不同端口检索的内容。

我自己没试过。

在我的工作中,我们必须在子域(而不是端口)之间共享 cookie,并在域前面设置一个点

var testCookie1 = new HttpCookie("Test", "testValue"); testCookie1.Domain = "." + mydomain;

这样 x.mydomain 和 y.mydomain 将共享 cookie。

所以,尽量不要在 cookie 中设置端口,而是使用名称 localhost 而不是解析的 ipaddress。

您可以在主机文件中模拟生产设置,例如:

127.0.0.1   myawesomesubdomain.thisdomainnotexist.com.tr

然后将 cookie 设置为没有端口的域

【讨论】:

【参考方案2】:

您可以尝试以下两种不同的解决方案:

    运行 Apache 服务器并将请求路由到任一服务器 在浏览器中禁用安全性(即同源策略)。

【讨论】:

【参考方案3】:

为了共享 cookie,您的两个应用程序应该在同一个域中,例如 app1.myapp.comapp2.myapp.com,这样它们都可以访问 myapp.com cookie。

你可以在本地模拟这个,通过设置:

127.0.0.1 app1.myapp.com
127.0.0.1 app2.myapp.com

在位于C:\Windows\System32\drivers\etc/etc/hosts 的主机文件中

【讨论】:

请解释这在生产中是如何工作的。您确定不希望访问者编辑他们的主机文件吗? 在生产中,您将在 DNS 中注册 app1.myapp.comapp2.myapp.com 我按照您的示例进行操作,我理解两个应用程序需要位于同一域下才能共享 cookie 的概念,但我没有看到指向同一 IP 的两个不同域会有什么帮助。我的 app2 位于 127.0.0.1:3030。我确实尝试使用 fidler 设置 HOST 脚本以将 app2 域转发到 127.0.0.1:3030 所以我最终有 2 个具有域的应用程序:app1.myapp.com 和 app2.myapp.com 但似乎 cookie 仍然没有被发送到 app2。 当你设置cookie时,你应该把它的域设置为myapp.com,这样它就可以在所有子域之间共享。详情请见here。

以上是关于在不同端口之间共享 Cookie的主要内容,如果未能解决你的问题,请参考以下文章

cookie在不同端口号可以共享吗

同ip不同端口的tomcat设置cookie

同ip不同端口的tomcat设置cookie

在两个烧瓶服务器之间共享会话

从不同端口删除 cookie [重复]

HTTP cookie 端口是特定的吗?