Безопасность, SSE/WebRTC и типичные ошибки

Закрываем курс безопасностью, обзором альтернатив и разбором типичных ошибок.

Проверка Origin — серверная проверка заголовка Origin при рукопожатии, чтобы отсечь подключения с чужих сайтов.

Безопасность WebSocket

Три базовых правила:

  • Только wss:// на проде. Незащищённый ws:// передаёт данные открытым текстом — токены и сообщения видны в сети.
  • Проверяйте Origin. WebSocket не подчиняется обычной CORS-политике, как fetch. Любой сайт может попытаться открыть сокет к вашему серверу (атака «cross-site WebSocket hijacking»). Сервер должен проверять заголовок Origin и пускать только свои домены.
  • Ставьте лимиты. Ограничивайте размер сообщения, частоту отправки (rate limit) и число соединений с одного IP — иначе один клиент способен залить сервер.

SSE против WebSocket: когда что

НужноБерите
Только сервер → клиент (лента, нотификации)SSE — проще, авто-реконнект встроен
Двусторонний обмен (чат, игры)WebSocket
Бинарные данныеWebSocket

WebRTC: когда нужен P2P

WebRTC — отдельная технология для прямой связи браузер-браузер (peer-to-peer), без прохода всех данных через сервер. Применяют для видеозвонков и голоса: видеопоток между двумя людьми незачем гонять через сервер. Но WebRTC сложнее, и даже ему нужен сервер на старте — для «знакомства» сторон (signaling), которое часто делают как раз по WebSocket. Для большинства задач (чат, нотификации) WebRTC избыточен.

Как работает под капотом

Опасность cross-site hijacking в том, что при рукопожатии браузер автоматически прикладывает cookie вашего домена. Если злоумышленник заманил пользователя на свой сайт и тот открыл сокет к вашему серверу, рукопожатие пройдёт с валидной cookie — поэтому защищаются проверкой Origin и токенами, не завязанными только на cookie. Лимиты же защищают от исчерпания ресурсов: каждое соединение занимает память, а необработанный поток мелких сообщений легко перегружает цикл событий.

Типичные ошибки (итог курса)

  • Утечка соединений. Не удаляете клиентов при close и не чистите комнаты — память течёт, рассылка бьёт в мертвецов.
  • Нет реконнекта. Сеть моргнула — приложение «онемело» навсегда; всегда переподключайтесь с backoff.
  • Отправка в закрытый канал. Без проверки readyState сообщения теряются или летят ошибки.
  • Доверие клиенту. Сервер обязан валидировать данные, проверять права на комнату и не верить присланному user.
  • Нет heartbeat. «Мёртвые» соединения копятся и съедают ресурсы.

Итоги

  • На проде — только wss://, обязательная проверка Origin и лимиты на размер/частоту/число соединений.
  • SSE — для одностороннего потока, WebSocket — для двустороннего, WebRTC — для P2P-медиа.
  • WebSocket не защищён CORS автоматически — отсюда риск cross-site hijacking.
  • Главные грабли: утечки соединений, отсутствие реконнекта и heartbeat, доверие клиенту.
Проверьте себя
1. Почему важно проверять заголовок Origin на WebSocket-сервере?
AДля ускорения рукопожатия
BWebSocket не защищён CORS автоматически — чужой сайт может открыть сокет (cross-site hijacking)
CЧтобы поддержать кириллицу
DOrigin задаёт комнату
2. Когда уместнее WebRTC, а не WebSocket?
AДля обычного текстового чата
BДля прямой P2P-передачи медиа (видео/голос) между браузерами
CДля серверных нотификаций
DДля тикера цен
3. Какая из ошибок ведёт к утечке ресурсов на сервере?
AИспользование wss вместо ws
BНе удалять клиентов из списка при close и не чистить пустые комнаты
CПроверка readyState перед send
DНумерация сообщений