WebSocket
サーバとブラウザが 1 本の接続を保ったまま双方向にメッセージを送り合う仕組みです。HTTP ポーリングとの違いとリアルタイム用途を整理します。
- 1.WebSocket は接続を張りっぱなしにして、サーバとブラウザが双方向にメッセージを送れる仕組み。
- 2.HTTP ポーリングのような「定期的に問い合わせる無駄」が無く、サーバ起点の通知を即座に届けられる。
- 3.チャット・通知・同時編集・ライブ更新など、低遅延の双方向通信が要る用途に向く。
WebSocket とは
通常の HTTP は「ブラウザが聞いて、サーバが答える」一方向のリクエスト駆動です。サーバから自発的に「新着が来たよ」と伝える手段がありません。
WebSocket は、最初に HTTP で接続を確立した後、その接続を双方向の通信路に昇格させます。一度つながれば、サーバからもブラウザからも、いつでもメッセージを送れます。
- 1 本の接続を開いたまま維持する(張りっぱなし)。
- どちらからでも送れる全二重(双方向)。
- テキストでもバイナリでも送れる。
HTTP ポーリングとの違い
WebSocket 以前は、HTTP で「定期的に問い合わせる」ことで擬似的なリアルタイムを実現していました。代表的な手法と比べると、無駄の差が見えてきます。
| 方式 | 仕組み | 弱点 |
|---|---|---|
| ポーリング | 数秒おきに「更新ある?」と HTTP で聞き続ける | 更新が無くても通信が走り、遅延も粒度任せ |
| ロングポーリング | 更新が来るまでサーバが応答を保留する | 接続のたびに HTTP の往復コストがかかる |
| WebSocket | 接続を保ったまま双方向に送り合う | 接続維持のリソース・対応インフラが必要 |
ポーリングは「更新が無いのに何度も聞く」空振りが避けられず、間隔を詰めるほど負荷が増え、広げるほど遅延が増えます。WebSocket はサーバ起点で即座に届くため、この板挟みから解放されます。
更新頻度が低い、数秒の遅延が許容できる、といった用途なら、素直な HTTP ポーリングや後述の SSE で十分なことも多いです。WebSocket は接続維持やスケールの考慮が増えるため、「本当に双方向・低遅延が要るか」を先に見極めましょう。
接続の流れ(ハンドシェイク)
WebSocket は最初だけ HTTPを使います。ブラウザが Upgrade ヘッダ付きでリクエストし、サーバが 101 Switching Protocols で応じると、以後はその接続が WebSocket になります。URL のスキームは ws://(暗号化は wss://)です。
const socket = new WebSocket("wss://example.com/chat");
socket.addEventListener("open", () => {
socket.send(JSON.stringify({ type: "hello" }));
});
socket.addEventListener("message", (event) => {
const data = JSON.parse(event.data);
console.log("received", data);
});
socket.addEventListener("close", () => {
console.log("disconnected"); // 再接続処理を入れることが多い
});
ブラウザ標準の WebSocket API はシンプルですが、実務では再接続や部屋(ルーム)管理などをライブラリ(例: Socket.IO)に任せることもよくあります。
主な用途
低遅延の双方向通信が活きる場面で使われます。
- チャット / メッセージング:相手の発言を即座に表示する。
- 通知・アラート:サーバ起点でプッシュ的に届ける。
- 同時編集 / 共同作業:他人のカーソルや変更をリアルタイム反映する。
- ライブ更新:株価・スポーツのスコア・ダッシュボードなど刻々変わる値。
- オンラインゲーム:操作と状態の高速なやり取り。
逆に、サーバ → ブラウザの一方向の通知だけで足りるなら、HTTP の延長で扱える **SSE(Server-Sent Events)**の方が手軽な選択肢になります。
| 観点 | WebSocket | SSE |
|---|---|---|
| 方向 | 双方向 | サーバ → ブラウザの一方向 |
| プロトコル | 専用(ws / wss) | 通常の HTTP(テキストストリーム) |
| 自動再接続 | 自前で実装 | 標準で備わる |
| 向く用途 | チャット・同時編集・ゲーム | 通知・フィード・進捗表示 |
注意点
接続を維持し続ける性質ゆえの留意点があります。
- スケール:多数の同時接続を扱うサーバ設計や、複数台に分散したときのメッセージ配信(Pub/Sub など)が課題になる。
- 切断と再接続:モバイル回線などでは切れる前提で、再接続とメッセージの取りこぼし対策を用意する。
- 認証:接続確立時にトークンなどで認証する。途中で権限を失効させたい場合の扱いも検討する。
本番では暗号化された wss:// を使います。また WebSocket には CORS のようなブラウザの自動防御が効かないため、接続時の認証・オリジン検証を自分で実装する必要があります。「つながれば誰でも送れる」状態にしないよう注意してください。
土台となる HTTP の理解があると、ハンドシェイクや wss の位置づけが掴みやすくなります。
Web/フロントエンド Article
WebSocketを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
WebSocket
比較で見る軸
難易度: intermediate / カテゴリ: Web/フロントエンド / タグ数: 4
導入後に効く点
HTTP ポーリングのような「定期的に問い合わせる無駄」が無く、サーバ起点の通知を即座に届けられる。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- intermediate
- カテゴリ
- Web/フロントエンド
- タグ数
- 4
判断チェックリスト
- 自社の用途が「WebSocket / リアルタイム」に近いか確認する。
- 強みである「WebSocket は接続を張りっぱなしにして、サーバとブラウザが双方向にメッセージを送れる仕組み。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。