Для решения вопроса "Почему?" Частично причина, по которой браузеры не применяют политику одного и того же происхождения (из которой CORS является ослаблением) для WebSockets, в отличие от вызовов AJAX, заключается в том, что WebSockets были введены после того, как значение запросов между источниками было установлено, и потому что они ' Если SOP изначально не распространяется, историческая причина проверок на стороне клиента CORS неприменима.
Для AJAX, во времена общей политики единого происхождения, серверы никогда не ожидали, что аутентифицированный браузер отправит запрос из другого домена 1 , и поэтому не нужно было гарантировать, что запрос поступает из надежного места 2 , просто проверьте файл cookie сеанса. Более поздние ослабления, такие как CORS, должны были иметь проверки на стороне клиента, чтобы избежать злоупотребления существующими приложениями , нарушая это предположение (эффективно выполняя CSRF-атаку ).
Если бы Интернет изобрели сегодня, зная то, что мы знаем сейчас, для AJAX не потребовались бы ни SOP, ни CORS, и возможно, что вся проверка была бы оставлена на сервере.
WebSockets, являясь более новой технологией, с самого начала предназначены для поддержки междоменных сценариев. Любой, кто пишет серверную логику, должен знать о возможности запросов из разных источников и выполнять необходимую проверку без необходимости жестких мер предосторожности на стороне браузера, как CORS.
1 Это упрощение. Запросы GET между источниками для ресурсов (включая теги <img>, <link> и <script>) и запросы POST на отправку форм всегда разрешались как фундаментальная функция Интернета. В настоящее время также разрешены вызовы AJAX с разными источниками, запросы которых имеют одинаковые свойства, и их называют простыми запросами с перекрестными источниками . Однако доступ к возвращенным данным из таких запросов в коде не разрешен, если явно не разрешено заголовками CORS сервера. Кроме того, именно эти «простые» запросы POST являются основной причиной того, почему для серверов необходимы токены защиты от CSRF для защиты от вредоносных веб-сайтов.
2 На самом деле, безопасный способ проверки источника запроса даже не был доступен, поскольку Referer
заголовок может быть подделан, например, с помощью уязвимости открытого перенаправления. Это также показывает, насколько плохо тогда были изучены уязвимости CSRF.