Безопасность, 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, доверие клиенту.