Библиотека STOMP.js поддерживает работу поверх WebSocket и Secure
WebSocket. В обычной конфигурации соединение устанавливается через
ws://, а при использовании TLS-шифрования применяется
wss://.
Пример адреса подключения:
const client = new Client({
brokerURL: 'wss://broker.example.com/ws'
});
Протокол WSS представляет собой WebSocket поверх TLS. По аналогии с HTTPS он обеспечивает:
Для STOMP.js использование WSS особенно важно при работе:
Обычный WebSocket без шифрования.
ws://example.com/socket
Особенности:
Защищённый WebSocket.
wss://example.com/socket
Особенности:
Современные браузеры блокируют небезопасные WebSocket-соединения на HTTPS-страницах.
Например:
https://app.example.com
не сможет открыть:
ws://broker.example.com/ws
Браузер выдаст ошибку Mixed Content.
Корректный вариант:
wss://broker.example.com/ws
Это правило безопасности действует в:
import { Client } from '@stomp/stompjs';
const client = new Client({
brokerURL: 'wss://broker.example.com/ws',
reconnectDelay: 5000,
heartbeatIncoming: 4000,
heartbeatOutgoing: 4000
});
client.activate();
При WSS часто используются токены авторизации.
const client = new Client({
brokerURL: 'wss://broker.example.com/ws',
connectHeaders: {
Authorization: 'Bearer TOKEN_VALUE'
}
});
Часто применяются:
| Заголовок | Назначение |
|---|---|
| Authorization | JWT или Bearer Token |
| login | Имя пользователя |
| passcode | Пароль |
| tenant-id | Идентификатор арендатора |
| x-api-key | API-ключ |
При установке WSS-соединения выполняется TLS Handshake.
Этапы:
Шифруется весь WebSocket-трафик:
Например, такой пакет:
SEND
destination:/topic/chat
Hello
в сети передаётся в зашифрованном виде.
SockJS также поддерживает защищённые соединения.
import SockJS from 'sockjs-client';
import { Client } from '@stomp/stompjs';
const socket = new SockJS('https://broker.example.com/stomp');
const client = new Client({
webSocketFactory: () => socket
});
SockJS самостоятельно использует HTTPS и безопасные транспорты.
SockJS может переключаться между:
Если основной транспорт работает через HTTPS, соединение также остаётся защищённым.
Для работы WSS сервер должен иметь TLS-сертификат.
Наиболее распространённые варианты:
| Тип | Описание |
|---|---|
| Let’s Encrypt | Бесплатный сертификат |
| Wildcard | Для поддоменов |
| EV SSL | Расширенная проверка |
| Self-Signed | Самоподписанный сертификат |
Браузеры обычно блокируют self-signed сертификаты.
Типичная ошибка:
WebSocket connection failed
или:
NET::ERR_CERT_AUTHORITY_INVALID
В production self-signed сертификаты использовать не рекомендуется.
Вкладка:
Network → WS
позволяет увидеть:
В браузере можно проверить:
Часто WSS завершается на reverse proxy:
После этого трафик передаётся брокеру.
Схема:
Browser
↓
WSS
↓
Nginx
↓
WS
↓
RabbitMQ / ActiveMQ
Пример proxy-конфигурации:
server {
listen 443 ssl;
server_name broker.example.com;
ssl_certificate /etc/ssl/fullchain.pem;
ssl_certificate_key /etc/ssl/private.key;
location /ws {
proxy_pass http://localhost:15674/ws;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
}
}
Для WebSocket необходим HTTP Upgrade.
Ключевые заголовки:
Upgrade: websocket
Connection: Upgrade
Без них WebSocket не установится.
Стандартный порт:
443
Также могут использоваться:
| Порт | Назначение |
|---|---|
| 443 | HTTPS/WSS |
| 8443 | Альтернативный TLS |
| 15671 | RabbitMQ TLS |
| 61614 | ActiveMQ SSL |
Heartbeat работает поверх защищённого канала.
const client = new Client({
brokerURL: 'wss://broker.example.com/ws',
heartbeatIncoming: 10000,
heartbeatOutgoing: 10000
});
Heartbeat-пакеты также шифруются TLS.
Автоматический reconnect полностью поддерживается.
const client = new Client({
brokerURL: 'wss://broker.example.com/ws',
reconnectDelay: 5000
});
При временной потере сети клиент создаёт новое TLS-соединение.
Ошибка:
ERR_CERT_COMMON_NAME_INVALID
Причина:
Ошибка:
ERR_CERT_DATE_INVALID
Причина:
Ошибка:
Mixed Content: The page was loaded over HTTPS...
Причина:
ws://.Ошибка:
Unexpected response code: 400
Причины:
Причины:
Очень распространённая схема:
const client = new Client({
brokerURL: 'wss://broker.example.com/ws',
connectHeaders: {
Authorization: `Bearer ${token}`
}
});
Поскольку WSS шифрует канал, токен защищён от перехвата.
Cookie также могут использоваться для аутентификации.
Особенно важны флаги:
Secure
HttpOnly
SameSite
Secure требует HTTPS/WSS.
TLS добавляет накладные расходы:
Однако в современных системах влияние обычно минимально.
TLS поддерживает повторное использование сессий.
Это уменьшает:
WebSocket не использует HTTP/2 напрямую.
Обычно схема выглядит так:
HTTPS → HTTP/2
WSS → HTTP/1.1 Upgrade
Это нормальное поведение.
При работе WSS часто используются:
Важно поддерживать:
Reverse proxy может закрывать соединения.
Типичные параметры:
proxy_read_timeout 3600;
proxy_send_timeout 3600;
Без увеличения timeout соединения будут неожиданно разрываться.
Cloudflare поддерживает WebSocket Proxying.
Особенности:
Даже при использовании WSS необходимо:
WSS защищает транспорт, но не бизнес-логику.
Пример серверных ограничений:
Это защищает систему от:
Для браузерных WebSocket важны origin-политики.
Сервер может проверять:
Origin: https://app.example.com
И отклонять чужие домены.
Content Security Policy может блокировать WebSocket.
Пример разрешения:
connect-src 'self' wss://broker.example.com;
Типичная production-схема:
Frontend SPA
↓
WSS
↓
Nginx / Load Balancer
↓
RabbitMQ / ActiveMQ / Spring Broker
RabbitMQ Web STOMP поддерживает WSS.
Пример URL:
wss://rabbit.example.com/ws
Часто используется плагин:
rabbitmq_web_stomp
Spring WebSocket также поддерживает TLS.
Конфигурация endpoint:
registry.addEndpoint("/ws")
.setAllowedOriginPatterns("*");
После настройки HTTPS endpoint автоматически становится доступным через WSS.
ActiveMQ поддерживает SSL Transport Connector.
Пример:
<transportConnector
name="secure-stomp"
uri="stomp+ssl://0.0.0.0:61614"/>
Полезные инструменты:
| Инструмент | Назначение |
|---|---|
| Chrome DevTools | Анализ WebSocket |
| openssl | Проверка TLS |
| wscat | Тестирование WebSocket |
| Wireshark | Анализ трафика |
| ss/netstat | Проверка сокетов |
Пример подключения:
wscat -c wss://broker.example.com/ws
Для диагностики:
const client = new Client({
brokerURL: 'wss://broker.example.com/ws',
debug(str) {
console.log(str);
}
});
Логируются:
Нежелательно жёстко кодировать адреса:
brokerURL: 'wss://prod.example.com/ws'
Обычно используются:
Часто применяются разные endpoint:
| Окружение | URL |
|---|---|
| Development | ws://localhost:8080/ws |
| Staging | wss://staging.example.com/ws |
| Production | wss://api.example.com/ws |
Критически важные практики: