我需要在websocket握手请求中发送一个cookie,以确保负载均衡器将请求路由到特定的后端。在Firefox、Safari和websocket-sharp中,这可以正常工作,但我无法让Chrome发送带有websocket握手请求的cookie。
我在我的负载均衡器(Traefik)中启用了粘性会话,并且使用现有的SockJS代码,在Firefox和Safari上“只需工作”。
第一个请求没有cookie,负载均衡器在握手响应(101切换协议)中设置了一个cookie。随后的websocket握手请求发送cookie,并建立到正确后端的websocket连接。
在我的websocket-sharp客户端中,我在打开连接之前明确设置了cookie,并且它按预期工作。
Chrome从未在websocket握手请求中发送cookie。我尝试使用已设置负载均衡器上其他请求或在发送请求之前立即在文档中显式设置cookie的现有SockJS。
我尝试使用简单的
在Chrome开发者工具控制台上的任何网站(例如https://www.google.com),执行以下操作:
请注意,如果在使用
检查生成的请求(400 错误请求 - 我只关心此测试生成的请求,而不是结果),它会显示:
在Firefox中执行相同的操作,cookie将随握手请求一起发送:
我希望生成的请求包含浏览器中已知匹配源的所有文档 Cookie。
我在网上找到了几个参考资料,似乎表明这对于“现代浏览器,包括 Chrome”应该是成立的。 我找到了一篇参考文献,似乎表明Chrome不会在握手请求中发送cookie: 我找不到任何官方文档或Chrome的更改来解释所观察到的行为。
我在我的负载均衡器(Traefik)中启用了粘性会话,并且使用现有的SockJS代码,在Firefox和Safari上“只需工作”。
第一个请求没有cookie,负载均衡器在握手响应(101切换协议)中设置了一个cookie。随后的websocket握手请求发送cookie,并建立到正确后端的websocket连接。
在我的websocket-sharp客户端中,我在打开连接之前明确设置了cookie,并且它按预期工作。
Chrome从未在websocket握手请求中发送cookie。我尝试使用已设置负载均衡器上其他请求或在发送请求之前立即在文档中显式设置cookie的现有SockJS。
我尝试使用简单的
key=val
cookie,以及设置了各种其他选项的cookie,例如path
、domain
、max-age
、secure
、samesite
等。在Chrome开发者工具控制台上的任何网站(例如https://www.google.com),执行以下操作:
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”应该是成立的。 我找到了一篇参考文献,似乎表明Chrome不会在握手请求中发送cookie: 我找不到任何官方文档或Chrome的更改来解释所观察到的行为。