我在一台机器上运行两个HTTP服务。我只是想知道它们是否共享cookie,或者浏览器是否区分这两个服务器套接字。
当前回答
根据RFC2965 3.3.1(浏览器可能遵循也可能不遵循),除非通过Set-Cookie报头的port参数显式指定端口,否则cookie可能会或可能不会被发送到任何端口。
谷歌的浏览器安全手册说:默认情况下,cookie范围仅限于当前主机名上的所有url,而不绑定端口或协议信息。没有办法将cookie限制为单个DNS名称[…]同样,也没有办法将它们限制在特定的端口上。(另外,请记住,IE根本不会将端口号考虑到其同源策略中。)
因此,在这里依赖任何定义良好的行为似乎都不安全。
其他回答
根据RFC2965 3.3.1(浏览器可能遵循也可能不遵循),除非通过Set-Cookie报头的port参数显式指定端口,否则cookie可能会或可能不会被发送到任何端口。
谷歌的浏览器安全手册说:默认情况下,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为localhost保留了一个cookie,为127.0.0.1保留了一个cookie。
再说一次,没有人会在意这一点,但这对我的情况来说很简单,也很有帮助。
解决这个问题的另一种方法是使会话cookie的名称与端口相关。例如:
Mysession8080用于运行在端口8080上的服务器 Mysession8000用于运行在端口8000上的服务器
您的代码可以访问webserver配置,以找出您的服务器使用哪个端口,并相应地命名cookie。
请记住,您的应用程序将接收这两个cookie,您需要请求与您的端口对应的那个cookie。
在cookie名称中不需要有确切的端口号,但这样更方便。
通常,cookie名称可以编码特定于您使用的服务器实例的任何其他参数,因此可以通过正确的上下文对其进行解码。
这是cookie SOP(同源策略)中的一个很大的灰色区域。
理论上,可以在域中指定端口号,cookie不会被共享。实际上,这在几种浏览器中都不起作用,您还会遇到其他问题。因此,只有当你的网站不是面向大众的,并且你可以控制使用什么浏览器时,这才可行。
更好的方法是为相同的IP获取2个域名,并且不依赖端口号进行cookie。
它是可选的。
可以指定端口,因此cookie可以是特定于端口的。这是不必要的,web服务器/应用程序必须关心这个。
来源:德文维基百科文章,RFC2109,第4.3.1章
推荐文章
- HTTP POST返回错误:417“期望失败。”
- 令牌身份验证vs. cookie
- 如何为其他域设置cookie
- JWT vs cookie用于基于令牌的身份验证
- 什么是HTTP中的“406-不可接受的响应”?
- 最好的轻量级web服务器(只有静态内容)的Windows
- HTTP POST在Java中使用JSON
- 在php中生成一个随机密码
- java.util.Random和java.security. securerrandom的区别
- Docker和安全密码
- 哪些HTTP方法与哪些CRUD方法相匹配?
- 使用HTML形式的PUT方法
- 如何转义哈希字符在URL
- 准备好的语句如何防止SQL注入攻击?
- 有没有办法在python中做HTTP PUT