mrm*_*ine 8 cookies google-chrome websocket
我需要发送带有 websocket 握手请求的 cookie,以确保负载均衡器将请求路由到特定后端。这在 Firefox、Safari 和 websocket-sharp 中工作正常,但我无法让 Chrome 使用 websocket 握手请求发送 cookie。
我在我的负载均衡器 (Traefik) 中启用了粘性会话,它在 Firefox 和 Safari 上使用我现有的 SockJS 代码“正常工作”。
第一个请求没有 cookie,负载均衡器在握手响应(101 交换协议)上设置一个。后续的 websocket 握手请求发送 cookie,生成的 websocket 连接建立到正确的后端。
在我的 websocket-sharp 客户端中,我在打开连接之前显式设置了 cookie,它按预期工作。
Chrome 从不发送带有 websocket 握手请求的 cookie。我尝试了现有的 SockJS,在其他请求上由负载均衡器设置 cookie,或者在发送请求之前立即在发出 websocket 请求的文档中明确设置。
我想简单的key=val
饼干,并与选项设置,例如各种其它组合饼干path
,domain
,max-age
,secure
,samesite
,等。
在任何站点(例如https://www.google.com)的 Chrome 开发工具控制台中,执行:
document.cookie = 'key=val'
new WebSocket('wss://www.google.com')
Run Code Online (Sandbox Code Playgroud)
请注意,该方案必须是wss
在查看页面时https
或ws
查看页面时http
。此外,所查看的页面中的域和端口以及 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
Run Code Online (Sandbox Code Playgroud)
在 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
Run Code Online (Sandbox Code Playgroud)
和 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
Run Code Online (Sandbox Code Playgroud)
我希望生成的请求包含浏览器已知的匹配源的所有文档 cookie。
我在网上找到了一些参考资料,似乎表明“现代浏览器,包括 Chrome”应该是这种情况:
我发现一个参考文献似乎表明 Chrome 没有通过握手请求发送 cookie:
我在 Chrome 中找不到任何官方文档或更改来解释观察到的行为。
小智 1
更新 2:我将复制我通过错误报告发现的内容:
使用 UI 阻止 cookie 并编辑我的域的白名单例外(与禁用 cookie 的选项位于同一位置),我发现以下内容:
wss://example.com 是“不是有效的网址”,无法添加。
输入 *:// 作为方案或输入 :* 作为端口是可能的,但会从字符串中删除,从而导致:
*://[*.]example.com:443 -> [*.]example.com:443 - 不起作用
*://[*.]example.com:* -> [*.]example.com - 有效
*://example.com:* -> example.com - 有效
更新1:我提交了一份错误报告并已得到确认:
https://bugs.chromium.org/p/chromium/issues/detail?id=947413
对我有用的是在设置中全局允许 cookie。
是的,这是一个非常可行的解决方法,因为我永远不会认为允许每个 cookie 进入浏览器是一个可接受的解决方案,但我相当确定这是一个错误。我知道不久前它曾经通过 cookie 阻止+白名单来工作,但是当我将其单独放置 x 周时,某些版本破坏了它。抱歉,不知道哪一个...我不使用 Chrome,所以我不太关心,但也许那些使用 Chrome 的人可以执行类似 Firefox 中的配置文件之类的操作,并创建一个启用此选项的开发版本,并且永远不会去Facebook。
具体来说,在我的 Chrome 版本中,它位于非常狭窄的汉堡菜单 -> 设置 -> 高级 -> 内容设置... -> Cookie -> 第一个切换选项(在“允许网站保存和读取 cookie 数据”之间切换(推荐)”和“已阻止”)。或者单击地址栏中的 cookie 图标,然后单击“管理”。
我在 Debian 9 中使用 Linux 版本的 Chrome 版本 73.0.3683.86(官方版本)(64 位)。看起来您使用的是 Mac OS,所以如果这些版本有些相关,也许这也会对您有所帮助。这个问题在 Windows 版本中似乎不会出现,但我不是使用它或自己测试它的人,它可能更旧(我可以稍后发现时进行编辑)。它也适用于 Android(版本 73.0.3683.90),但该版本似乎一开始就没有阻止 cookie 的选项。
我也尝试了各种设置,但我不确定是否可以使用类似五元组的单词修饰符来检查 14000 次,但我已经花了很多天试图弄清楚这一点。我一遍又一遍地分析了两端的标头和代码,认为可能是 cookie 域/path/expiry/httponly/secure/samesite、不匹配的域、证书问题、服务器设置等等,但不是,这是一个愚蠢的复选框。至少我可以继续,而不必等待谷歌修复它......
归档时间: |
|
查看次数: |
5833 次 |
最近记录: |