当前位置: 首页 > 知识库问答 >
问题:

我如何使Chrome发送带有WebSocket握手请求的cookie?

韩麒
2023-03-14

我需要发送一个带有websocket握手请求的cookie,以确保负载均衡器将请求路由到特定的后端。这在Firefox、Safari和websocket-sharp中运行良好,但我无法让Chrome发送带有websocket握手请求的cookie。

我在我的负载均衡器(Traefik)中启用了粘性会话,它在Firefox和Safari上用我现有的SockJS代码“刚刚工作”。

第一个请求没有cookie,负载均衡器在握手响应(101个交换协议)上设置一个。随后的websocket握手请求发送cookie,并将得到的websocket连接建立到正确的后端。

在我的websocket-sharp客户端中,我在打开连接之前显式地设置了cookie,它按照预期工作。

Chrome从不发送带有websocket握手请求的cookie。我尝试了现有的sockj,通过负载均衡器在其他请求上设置cookie,或者在发送请求之前立即在发出websocket请求的文档中显式设置cookie。

我尝试了简单的key=valcookie,以及设置了各种其他选项组合的cookie,例如pathdomainmax-agesecuresameSite等。

在任何站点(例如https://www.google.com)的Chrome dev tools控制台中,执行

document.cookie = 'key=val'
new WebSocket('wss://www.google.com')

请注意,如果通过https查看页面,则方案必须为wss;如果通过http查看页面,则方案必须为ws。此外,所查看的页面和websocket的URL中的域和端口是相同的,如生成的请求中的origin头所述。

检查结果请求(400个坏请求--我只关心为该测试生成的请求,而不是结果),结果显示:

GET wss://www.google.com/ HTTP/1.1
Host: www.google.com
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Origin: https://www.google.com
Sec-WebSocket-Version: 13
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Sec-WebSocket-Key: HrtpryMAlu5yjGCNgxzcpw==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits

在Firefox中执行相同的操作,cookie将与握手请求一起发送:

Host: www.google.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:65.0) Gecko/20100101 Firefox/65.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Sec-WebSocket-Version: 13
Origin: https://www.google.com
Sec-WebSocket-Extensions: permessage-deflate
Sec-WebSocket-Key: QvNsHgLE5znjaUG04RFdPA==
DNT: 1
Connection: keep-alive, Upgrade
Cookie: <SNIPPED>; key=val
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket

和Safari:

Connection: Upgrade
Host: www.google.com
Origin: https://www.google.com
Cookie: key=val; <SNIPPED>
Pragma: no-cache
Cache-Control: no-cache
Sec-WebSocket-Key: zQEpYp+yzf5EQmQSb71B6g==
Sec-WebSocket-Version: 13
Sec-WebSocket-Extensions: x-webkit-deflate-frame
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0.3 Safari/605.1.15

我希望生成的请求包括浏览器已知的匹配源的所有文档cookie。

我在网上找到了一些参考资料,似乎表明“现代浏览器,包括Chrome”应该是这样的:

  • https://github.com/crossbario/autobahn-js/issues/88#issuecomment-61367897
  • https://stackoverflow.com/A/43238378/2829685

我发现了一个参考,似乎表明Chrome没有将cookie与握手请求一起发送:

  • https://stackoverflow.com/A/51468160/2829685

我找不到任何官方文件或Chrome的变化来解释观察到的行为。

共有1个答案

闻人树
2023-03-14

很可能cookie实际上是在WebSocket请求头中发送的,只是没有显示在dev-tool中。可以通过Chrome Netlog进行跟踪。从他们在这次铬问题上的建议来看:

Cookie是有意从devtools中显示的头中筛选出来的。这是因为它们是通过呈现器传递的,而呈现器不应该有访问HttpOnly cookie的权限。

 类似资料:
  • 我正在制作一个有游戏的网站。对于游戏,我需要发送数据。加载页面时一切正常,但我无法让握手生效。 socketReq变量存在是因为我不希望任何人直接从浏览器连接到localhost:25580。我的发送和接收功能在不同的线程中,它们将在握手后启动。 JS中新WebSocket(ws://localhost:25580)的结果是 到“ws://localhost:25580/”的WebSocket连接

  • 这个问题让我感到困惑,而我的客户端应用程序和外部服务器之间的相互SSL故障。 当我的应用程序尝试连接到外部服务器的rest API时,我们调用它https://www.server.com/api/resolve-我希望与服务器hello一起发送“证书请求”握手元素。就我和服务器之间所有通信量的tcpdump所知,它没有被发送。只发送“服务器Hello,证书,证书状态,服务器密钥交换,服务器Hel

  • 问题内容: 我想在我正在使用的Web应用程序上测试一些URL。为此,我想手动创建HTTP POST请求(这意味着我可以添加我喜欢的任何参数)。 我缺少Chrome和/或Firefox中的任何扩展程序或功能吗? 问题答案: 我一直在为这种类型的东西制作一个名为Postman的Chrome应用。所有其他扩展似乎都过时了,所以我自己做了。它还具有许多其他功能,这些功能有助于在此处记录我们自己的API。

  • 问题内容: 如何在python中发送带有请求的请求?我了解如何发送文件,但是通过这种方法如何发送表单数据尚不清楚。 问题答案: 基本上,如果你指定参数(字典),则将发送m而不是。你不限于在该词典中使用实际文件,但是: 可以让你知道你发布了哪些标题;在我们有: 更好的是,你可以通过使用元组而不是单个字符串或字节对象来进一步控制每个部分的文件名,内容类型和其他标题。该元组应该包含2到4个元素;文件名,

  • websocket请求头中如何带上cookie?