こんにちは、エンジニアの仁木です。
最近のWebアプリケーションでは、WebSocketと呼ばれる通信プロトコルが多く利用されています。
このWebSocketとは何か、またWebで広く利用されているHTTPとは何が違うのかをご紹介したいと思います。
WebSocketとは通信プロトコルの1つで、クライアント⇔サーバー間の双方向でデータを通信する規格です。
今回はクライアントはGoogle ChromeやEdgeなど、Webページにアクセスする際に使用するブラウザを指すので、以降は「ブラウザ」で表記します。
現在ではSNSの通知や、協力して遊ぶオンラインゲーム、チャットしながら参加するライブストリーミングなど、多種多様なインタラクティブなコンテンツがブラウザ上で利用できるようになっています。
これらのリアルタイム性が重要なインタラクティブコンテンツを実現するためにWebSocketが利用されています。
先に触れたリアルタイム性が重要でない多くのWebサイトは、WebSocketは利用せずHTTP(HTTPS)プロトコルのみが利用されています。
WebSocketもHTTPもどちらも通信プロトコルであり、Web上でブラウザ⇔サーバー間でデータ通信するための規格です。
HTTPとWebSocketの大きな違いというのは、クライアント⇔サーバーの双方向で通信ができるかどうかにあります。
URLでみると、以下のように先頭のプロトコルの指定が変わります。
HTTP | http://~~~ |
WebSocket | ws://~~~ |
HTTPでは、ブラウザからサーバーにリクエストが来た時のみデータを返すことができます。逆に言うと、ブラウザからリクエストが来ない限りサーバーから勝手にデータを配信することはできません。
そのため、Webページを表示しつづけていてもブラウザ側でページを更新しなければ新しいデータは取得できません。
(例えば、SNSやチャットなどで新しいメッセージが届いていても、ブラウザを更新しないと確認できないといった状態です)
HTTPでリアルタイム性のある通信を実現するためには、一定間隔でブラウザからサーバーにリクエストをしなければならず、リクエストが増えることによるサーバー側の負荷が問題となります。
またブラウザ⇔サーバー間は、リクエストを受けてデータを返すという1往復で接続は終了し、新しくリクエストが来れば新しい接続を開始します。
WebSocketでは、ブラウザとサーバーが接続(コネクション)を一度確立できれば、以降のデータのやり取りはコネクションを通じて行われます。
ブラウザとサーバーの間で接続が確立された状態なので、サーバー側でイベントが発生すれば、そのタイミングでブラウザ側にデータを配信することができます。
これには以下のメリットがあります。
ユーザーにとって便利な機能を開発できるWebSocketですが、導入時に気をつけておきたいこともあります。
WebSocketを利用するWebアプリケーションは、リアルタイム性が重要なため、データのやり取りが多く発生することが考えられます。
多くの通信を捌けるようにサーバー側のリソース設計を十分に検討する必要がありそうです。
WebSocketの通信はWSS (WebSocket over SSL/TLS) と呼ばれる、HTTPにおけるHTTPSのように暗号化通信のプロトコルを利用するのが推奨されます。
また、通常のHTTPと同じ用にXSS(クロスサイトスクリプティング)やクロスサイトリクエストフォージェリ(CSRF)攻撃の対策も行う必要があります。
WebSocketの通信が強制的に終了してしまった場合や、意図しない操作で接続が終了してしまった場合の再接続処理やエラー通知の仕組みを実装しておく必要があります。
今はデスクトップアプリに負けないWebアプリケーションが増えてきていますが、WebSocketのような技術規格が開発されることで様々なサービスを利用できるようになったのだなと思います。
今後も様々なサービスの要望に応えられるよう技術力をあげていきたいと思います。