TakéWS, WebSocket APIPokročilý
Definice
WebSocket je síťový protokol pro dlouhodobé obousměrné spojení mezi klientem a serverem, nejčastěji v prohlížeči nad TCP a TLS. Po úvodním HTTP handshake může obě strany posílat zprávy kdykoli, bez opakovaného zakládání požadavků, takže se hodí pro chaty, živé dashboardy, hry nebo notifikace.
Proč WebSocket začíná jako HTTP požadavek
Prohlížeč obvykle naváže WebSocket přes běžnou HTTP infrastrukturu. Klient pošle požadavek s hlavičkami pro změnu protokolu a server odpoví potvrzením, že spojení přepíná z HTTP na WebSocket. Díky tomu může komunikace projít přes stejné domény, TLS certifikáty, reverzní proxy a bezpečnostní pravidla jako zbytek webu.
Po úspěšném přepnutí už komunikace nepokračuje jako série nezávislých HTTP požadavků. Otevřené TCP spojení zůstává živé a obě strany mohou posílat zprávy nezávisle na sobě. Pro bezpečný provoz se v prohlížeči používá varianta wss://, která běží nad TLS podobně jako HTTPS.
Rámce místo opakovaných odpovědí
WebSocket neposílá každou zprávu jako nový HTTP request s kompletní sadou hlaviček. Data jsou rozdělena do rámců, které mohou nést text, binární obsah nebo řídicí informace. Aplikace proto pracuje se zprávami, ne s celými dokumenty jako u klasického načtení stránky.
Prohlížečové API vystavuje události open, message, error a close. Serverová strana závisí na použité platformě, například Node.js, Go, Python nebo Java. Samotný protokol neurčuje formát aplikačních dat, takže zprávy mohou být JSON, MessagePack, vlastní binární protokol nebo obyčejný text.
Životnost spojení mění provozní náklady
Dlouhé spojení šetří režii tam, kde proudí mnoho malých událostí. Současně ale spotřebovává paměť, sockety a stav na serveru i v síťových prvcích. Aplikace s tisíci klientů musí řešit limity procesu, horizontální škálování, sticky sessions nebo sdílený pub-sub mezi instancemi.
WebSocket také vyžaduje práci s výpadky. Mobilní síť, spánek notebooku nebo restart proxy mohou spojení přerušit bez elegantního ukončení. Praktická implementace proto počítá s opětovným připojením, potvrzováním důležitých zpráv, frontou neodeslaných dat a mechanismem zpětného tlaku, aby rychlý producent nezahltíl pomalého příjemce.
Kde WebSocket přináší skutečnou hodnotu
WebSocket se hodí pro chat, kolaborativní editory, multiplayer, dispečerské mapy, notifikace, živé metriky nebo obchodní terminály. Společným znakem je potřeba doručovat události okamžitě oběma směry. Server může klientovi poslat změnu bez čekání na další dotaz.
Jednoduché CRUD API WebSocket obvykle nevylepší. Pokud klient jen občas načte seznam produktů nebo uloží formulář, HTTP endpoint bývá čitelnější, snáze cacheovatelný a jednodušší na ladění. Pro jednosměrný proud událostí ze serveru může stačit Server-Sent Events, protože používá obyčejnější model nad HTTP.
Bezpečnost WebSocketu není automatická
WebSocket nepřináší vlastní uživatelskou autentizaci. Přihlášení se typicky řeší cookie, tokenem v prvním aplikačním sdělení nebo krátkodobým podpisem v URL, podle bezpečnostního modelu aplikace. Server by měl kontrolovat původ požadavku, oprávnění po připojení a maximální velikost zpráv.
Šifrované wss:// chrání přenos před odposlechem a úpravou po cestě, ale neověří, zda klient smí odebírat konkrétní kanál. Stejně důležité je ošetřit ukončení spojení, rate limiting, validaci dat a logování událostí, protože otevřené spojení může být zneužito k dlouhodobému vyčerpávání prostředků.
Příklady z praxe
Chat zákaznické podpory
Zákazník otevře chat v e-shopu a prohlížeč naváže WebSocket na server podpory. Operátorova odpověď dorazí okamžitě jako událost, bez opakovaného dotazování klienta. Při výpadku sítě aplikace zobrazí stav odpojeno a po obnovení spojení může znovu přihlásit uživatele do stejné konverzace.
const socket = new WebSocket("wss://support.example.com/chat"); socket.addEventListener("open", () => { socket.send(JSON.stringify({ type: "message", text: "Dobrý den, potřebuji pomoc." })); }); socket.addEventListener("message", event => { const data = JSON.parse(event.data); console.log("Operátor:", data.text); });Živý přehled objednávek
Administrace skladu zobrazuje tabulku objednávek, které se mění podle práce expedice. Server po každé změně stavu odešle malou zprávu všem připojeným dispečerům. Operátor tak vidí přechod z „zabaleno“ na „předáno dopravci“ bez ručního obnovování stránky.
const socket = new WebSocket("wss://admin.example.com/orders"); socket.addEventListener("message", event => { const update = JSON.parse(event.data); if (update.type === "order.updated") { updateOrderRow(update.orderId, update.status); } });
Časté omyly
- MýtusWebSocket je jen rychlejší HTTP.
- Ve skutečnostiWebSocket začíná přes HTTP handshake, ale po přepnutí má jiný komunikační model. Hlavní rozdíl není pouze rychlost, nýbrž dlouhodobé obousměrné spojení a zprávy posílané kdykoli oběma stranami.
- MýtusKdyž používám wss://, nemusím řešit autorizaci zpráv.
- Ve skutečnostiŠifrovaný přenos chrání kanál, ale neurčuje, co smí konkrétní uživatel číst nebo posílat. Server musí ověřovat identitu, oprávnění ke kanálům a validitu každé důležité zprávy.
Časté dotazy
- Proč WebSocket používá adresy ws:// a wss://?
- Schéma wss:// označuje WebSocket chráněný pomocí TLS, podobně jako HTTPS chrání běžné webové požadavky. Šifrovaná varianta je v produkčních webových aplikacích prakticky nutná, protože brání odposlechu a úpravě dat po cestě. Prohlížeče navíc na stránkách načtených přes HTTPS typicky blokují nezabezpečené ws:// spojení jako smíšený obsah.
- Musí WebSocket běžet na samostatném portu?
- WebSocket nemusí běžet na samostatném portu, protože handshake začíná jako HTTP požadavek a často používá stejný port jako web, tedy 80 nebo 443. Reverzní proxy nebo load balancer ale musí umět přepnutí protokolu propustit. Oddělený port může dávat smysl z provozních důvodů, není však požadavkem samotného protokolu.
- Proč se u WebSocketu řeší ping a pong?
- WebSocket používá řídicí zprávy ping a pong k ověření, že druhá strana spojení stále žije. Dlouhé TCP spojení může zůstat z pohledu aplikace zdánlivě otevřené i po výpadku mobilní sítě nebo po zavření mezilehlého zařízení. Pravidelný heartbeat pomáhá rychleji zjistit mrtvé spojení a uvolnit zdroje na serveru.
- Kdy WebSocket zbytečně komplikuje jednoduché serverové události?
- WebSocket zbytečně komplikuje situace, kde server jen posílá klientovi jednosměrné události a klient nepotřebuje aktivně komunikovat stejným kanálem zpět. Server-Sent Events bývá pro takový scénář jednodušší, protože používá model bližší běžnému HTTP streamu. WebSocket má větší přínos, když klient i server posílají krátké zprávy v obou směrech a latence je důležitá.
Zdroje
- The WebSocket Protocol(otevře se v novém okně)
- WebSockets(otevře se v novém okně)
- WebSocket(otevře se v novém okně)
- WebSocket Protocol Registries(otevře se v novém okně)