HTTP Cookie端口是特定的吗?
我有两台HTTP服务在一台机器上运行。 我只是想知道他们是否共享他们的cookies或浏览器是否区分两个服务器插座。
当前的cookie规范是RFC 6265 ,它取代了RFC 2109和RFC 2965 (这两个RFC现在都被标记为“历史”),并且形式化了cookie的实际使用情况。 它明确指出:
- 介绍
…
由于历史原因,Cookie包含一些安全和隐私不足之处。 例如,服务器可以指示给定的cookie旨在用于“安全”连接,但是安全属性在存在活动网络攻击者的情况下不提供完整性。 同样,即使Web浏览器使用通常的“相同来源策略”隔离通过不同端口检索到的内容,给定主机的Cookie也会在该主机的所有端口之间共享。
并且:
8.5。 机密性较弱
Cookies不提供端口隔离 。 如果一个cookie可以被一个端口上运行的服务读取,那么这个cookie也可以被在同一个服务器的另一个端口上运行的服务读取。 如果一个cookie可以被一个端口上的服务写入,那么这个cookie也可以被在同一个服务器的另一个端口上运行的服务写入。 因此,服务器不应该在同一主机的不同端口上运行互不信任的服务,并使用cookie来存储安全敏感信息。
根据RFC2965 3.3.1(可能不会被浏览器跟踪),除非端口通过Set-Cookie
头的port
参数明确指定,否则cookie可能会或可能不会被发送到任何端口。
Google的浏览器安全手册说: 默认情况下,cookie作用域限于当前主机名上的所有URL,并且不绑定到端口或协议信息。 以及稍后的某些行无法将Cookie限制为单个DNS名称,同样,也无法将其限制到特定的端口。 (另外,请记住,IE并没有将端口号码归入其同源策略。)
所以在这里依靠任何明确定义的行为似乎并不安全。
这是一个非常古老的问题,但我想我会添加一个我使用的解决方法。
我有两个服务在笔记本上运行(一个在端口3000上,另一个在4000上)。 当我在( http://localhost:3000
和http://localhost:4000
)之间跳转时,Chrome会传入相同的cookie,每个服务都无法理解cookie并生成一个新的cookie。
我发现如果我访问http://localhost:3000
和http://127.0.0.1:4000
,问题就消失了,因为Chrome为本地主机保留了一个cookie,一个为127.0.0.1。
再次,没有人可以在这一点上,但是这对我的情况很容易和有帮助。
这是Cookie SOP(同源策略)中的一个大灰色区域。
从理论上说,您可以指定域中的端口号,并且不会共享cookie。 实际上,这不适用于多个浏览器,您将遇到其他问题。 所以这只有在您的网站不是针对公众的情况下才可行,而且您可以控制使用哪些浏览器。
更好的方法是为相同的IP获取2个域名,而不是依靠cookie的端口号。
解决问题的另一种方法是使会话cookie的名称与端口相关。 例如:
- 运行在端口8080上的服务器的mysession8080
- 在端口8000上运行的服务器mysession8000
您的代码可以访问Web服务器配置,找出您的服务器使用哪个端口,并相应地命名该cookie。
请记住,您的应用程序将收到这两个cookie,并且您需要请求对应于您的端口的那个。
在cookie名称中不需要确切的端口号,但是这样更方便。
一般来说,cookie名称可以编码特定于您使用的服务器实例的任何其他参数,因此可以通过正确的上下文进行解码。
在IE 8中,cookie(仅针对本地主机验证)在端口之间共享。 在FF 10中,他们不是。
我已经发布了这个答案,以便读者至少有一个具体的选项来测试每个场景。
我在同一台机器上运行(并试图调试)两个不同的Django应用程序时遇到类似的问题。
我用这些命令运行它们:
./manage.py runserver 8000 ./manage.py runserver 8001
当我在第一个登录,然后在第二个登录时,我总是注销第一个,反之亦然。
我在/ etc / hosts上添加了这个
127.0.0.1 app1 127.0.0.1 app2
然后我用这些命令启动了两个应用程序:
./manage.py runserver app1:8000 ./manage.py runserver app2:8001
问题解决了 :)
这是可选的。
端口可以被指定,以便cookie可以是端口特定的。 这是没有必要的,网络服务器/应用程序必须关心这一点。
资料来源: 德文维基百科文章 , RFC2109 ,第4.3.1章