IT・技術研修ならCTC教育サービス

サイト内検索 企業情報 サイトマップ

研修コース検索

コラム

Ruby & Rails

CTC 教育サービス

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes 

第12回 WebSocketでサーバプッシュ (松永紘) 2014年3月

 2/18にRails3.2.17、4.0.3、及び4.1.0.beta2(*1)がリリースされました(*2)。これらは前回のアップデート同様、DoS攻撃やXSSの脆弱性に対する緊急度の高いセキュリティフィックスのようですので、できるだけ早くアップデートすることをお勧めいたします。

 さて話は変わりますが、1/25~26にかけて開催された「SECCON 2013 CTF オンライン予選(*3)」に参加してみました。この予選は『IT技術やセキュリティに関する5つのジャンル「フォレンジックス」「プログラミング・暗号」「バイナリ」「ネットワーク・Web」「その他・トリビア」から計25問の問題を出題し、チームでの合計点を競う(*4)もので、上位10位に入ると3/1~2に行われるCTF決勝に進むことができます(*5)。
 そんなCTFオンライン予選の問題の一つにWebSocketを使った問題がありました。名前は聞いたことがあるもののどんなものかよく分かっていなかったWebSocketですが、折角の機会と思い調べたり、触ってみたりしたので今回はWebSocketについて書いてみたいと思います。

WebSocketとは

 現在Webで用いられているHTTPはクライアントからのリクエストに基づきサーバがレスポンスを返すという、良くも悪くもシンプルなプロトコルでした(*6)。

fig01

 ですがこのプロトコルは、その仕組み上サーバからクライアントへのPush通知(サーバプッシュ)を実現することができません。そのためサーバプッシュをHTTP上で実現する方策として、Ajaxを用いたポーリングやCometと呼ばれる方法が考案されてきました。

fig02

 これらの方法はある程度支持を得たものの、結局のところHTTP上の制約を受けてしまうため無駄な通信が多い、リアルタイム性に欠ける(遅延がどうしても発生する)などの問題が残っています。そのような問題を根本的に解決し、サーバからクライアントへのリアルタイムなサーバプッシュを実現する仕組みとして、WebSocketが登場しました(*7)。
 WebSocketではHTTPではない独自のプロトコル(WebSocketプロトコル)を用います。このプロトコルは通信の確立後、サーバとクライアント間に双方向通信が可能なコネクションを張り続けることでHTTPの問題を解決しています。

fig03

WebSocketの規格

 WebSocketの規格は、通信プロトコルとなるWebSocket プロトコルとそのプロトコルをWeb上で利用するためのWebSocket APIとに分かれ、プロトコルはIETFが、APIはW3Cがそれぞれ策定にあたっています。
 WebSocketプロトコルはTCP上で動作するプロトコルで、既存のWeb技術との親和性を意識して作られています(*8)。そのためWebサーバやブラウザがWebSocketに対応していれば、ネットワーク構成などを変更することなく利用することができます(*9)。
 そのWebSocketプロトコルをブラウザ上で制御するために利用するのが、WebSocket APIです。WebSocket APIは非常に分かりやすいAPIで、コネクション確立後サーバにメッセージを送信するにはsendメソッドを、サーバプッシュされたメッセージを受け取るにはmessageイベントを購読します。

fig04

 以下にWebSocket APIで定義されているメソッドやイベントなどの一覧を示します(*10)。

コンストラクタ
new WebSocket(url, protocols) WebSocketオブジェクトを生成し、WebSocket接続を行う。
[url]
 接続先のURLを指定
 スキームはws://(TSL使用時はwss://)
[protocols]
 WebSocket上で使用するサブプロトコルがある場合に指定(省略可能)
メソッド
send(data) 接続先へ引数dataを送信する。
[data]
 接続先へ送信するデータを指定
close() WebSocket接続を終了する。
イベント
close WebSocket接続が終了したときに発火する
error WebSocket接続においてエラーが発生したときに発火する
message 接続先よりサーバプッシュされたときに発火する
open WebSocket接続が正常に確立したときに発火する

 以下のサイトではWebSocketによる接続のテストができます。自作のHTMLファイルでもテストできるようですので、お試しください。

fig05

 WebSocket.org | Echo Test(http://www.websocket.org/echo.html

まとめ

 駆け足になりましたが、WebSocketの概要をまとめてみました。次回はWebSocketをRubyやRailsで使ってみたいと思います。

 それでは、Enjoy Ruby!

注釈

*1:Rails4.1系はその後4.1.0.rc1がリリースされていますので、そちらの使用をお勧めします。

*2http://weblog.rubyonrails.org/2014/2/18/Rails_3_2_17_4_0_3_and_4_1_0_beta2_have_been_released/

*3http://2013.seccon.jp/blog/2014/02/seccon-2013-ctf-online-result.html

*4:注釈*3のページより引用。

*5:ちなみに筆者たちのチームは87位でした。

*6:このHTTPを見直そうという動きも、近年活発になっています。GoogleのSPDYに代表されるような、HTTP2.0策定の動きにも注目ですね。

*7:ここではサーバプッシュに主眼を置いているためこのような表現をしていますが、「単一コネクションでクライアントとサーバの双方向通信を実現するための仕組み」という方がより正しい表現です。

*8:コネクションを確立する前段階ではまずHTTPを用いる、デフォルトのポートはHTTPと同じく80番である、など。

*9:正確には「利用できる可能性が高い」となります。リバースプロキシを設置していたりすると、接続を確立できないケースもあるようです。

*10:参考 http://www.w3.org/TR/websockets/

 


 

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes