Как заставить Chrome отправлять куки с запросом рукопожатия WebSocket? - PullRequest
1 голос
/ 27 марта 2019

Мне нужно отправить файл cookie с запросом рукопожатия websocket, чтобы гарантировать, что балансировщик нагрузки направляет запрос к определенному бэкэнду. Это отлично работает в Firefox, Safari и в веб-сокете, но я не могу заставить Chrome отправлять куки-файлы с запросом рукопожатия в веб-сокете.

Я включил липкие сессии в своем балансировщике нагрузки (Traefik), и он «просто работал» в Firefox и Safari с моим существующим кодом SockJS.

В первом запросе нет файла cookie, и балансировщик нагрузки устанавливает его в ответ на запрос подтверждения связи (101 протокол переключения). Последующие запросы рукопожатия веб-сокета отправляют файл cookie, и получающееся в результате соединение веб-сокета устанавливается на правильный сервер.

В моем клиенте с поддержкой веб-сокетов я явно устанавливаю куки-файл перед открытием соединения, и он работает как положено.

Chrome никогда не отправляет файлы cookie с запросами на рукопожатие. Я пробовал существующий SockJS, с файлами cookie, установленными балансировщиком нагрузки для других запросов или явно установленными в документе, отправляющем запрос websocket непосредственно перед отправкой запроса.

Я пробовал простые key=val файлы cookie и файлы cookie с различными другими комбинациями параметров, например, path, domain, max-age, secure, samesite и т. Д.

В консоли инструментов Chrome dev на любом сайте (например, https://www.google.com), выполнить:

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

Обратите внимание, что схема должна быть wss при просмотре страницы более https или ws при просмотре страницы более http. Кроме того, домен и порт идентичны на просматриваемой странице и в 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 не отправляет куки с запросом на рукопожатие:

Мне не удалось найти официальную документацию или изменения в Chrome для объяснения наблюдаемого поведения.

1 Ответ

0 голосов
/ 29 марта 2019

Обновление 2: я скопирую то, что обнаружил с помощью отчета об ошибке:

Использование интерфейса пользователя для блокировки файлов 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, поэтому мне все равно, но, возможно, те, кто это делает, могут сделать что-то вроде профилей в Firefox и создать проект для разработки с включенной этой опцией и просто никогда не переходить наFacebook.

Если быть точным, в моей версии Chrome он находится в очень узком меню гамбургеров -> Настройки -> Дополнительно -> Настройки контента ... -> Файлы cookie -> Первый вариант переключения (переключается между «Разрешить»).Сайты для сохранения и чтения данных cookie (рекомендуется) и «Заблокировано»).Или щелкните значок cookie в адресной строке и нажмите «Управление».

Я использую Linux-версию Chrome 73.0.3683.86 (Официальная сборка) (64-разрядная версия) в Debian 9. Похоже, вы 'Вы используете Mac OS, так что, возможно, это вам тоже поможет, если эти версии связаны между собой.Эта проблема, по-видимому, не возникает в версии для Windows, но тогда я не тот, кто ее использует или тестирует сам, и она может быть старше (я могу редактировать позже, когда узнаю).Он также работает в Android (версия 73.0.3683.90), но у него, похоже, нет возможности заблокировать куки-файлы.

Я также попробовал все виды настроек, и я не уверенмодификатора словоподобного слова для проверки вещей 14000 раз, но уже много дней пытались это выяснить.Я снова и снова анализировал заголовки и код и думал, что это может быть домен cookie / путь / срок действия / httponly / secure / samesite, несоответствующие домены, проблемы с сертификатами, настройки сервера и т. Д., И т. Д., И т. Д., Но нет,это один глупый флажок.По крайней мере, я могу продолжать и не нужно ждать, пока Google исправит это ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...