RESTをとるか、WebSocketをとるか

どうせWebアプリケーションを作るのなら、できるだけRESTfulに作りたい、と僕は今でも思っている。

とはいっても、セッションIDをcookieに保存する例のように、あえてRESTのスタイルを崩すべき場合もあろう。

非同期処理についても、RESTにこだわってジョブリソースを云々するより、WebSocketを使って完了をクライアントに伝えるほうが簡単だ。だから、スタイルを崩してWebSocketを使ってよい。

本当にそれでよいのだろうか。気になったので、RESTの提唱者であるRoy T. Fielding氏がWebSocketをどう評価しているのか調べてみた。理解に誤りがあればご指摘いただきたい。

Re: [hybi] WebSockets (2009-03-30)
なぜWebページからのプッシュが必要なのか、またなぜそれがHTTP越しでなければならないのか、という根本的な疑問が提示されている。
rest-discuss : Message: Re: [rest-discuss] Re: Restful Approaches to some Enterprise Integration Problems (2010-07-08)
まるでDoS攻撃のような接続の張りっぱなしを避けられるようRESTは設計されているのだ、という話。
blocking Upgrade
Upgradeヘッダを無効にできる設定項目を、Apache HTTP サーバの開発メーリングリストで提案している。
後続のメールでは「I am not planning to implement websockets -- I just want to protect the rest of the server from kids playing with toys.」とまで言っている。
Re: [hybi] Last Call: <draft-ietf-hybi-thewebsocketprotocol-10.txt> (The WebSocket protocol) to Proposed Standard (2011-09-01)
ここでもDoS攻撃との類似性が指摘されている。

ご覧のとおり、REST (HTTP) とWebSocketの性質の違いは明らかだ。RESTの利点をWebSocketが殺してしまうのだから、cookieほど簡単には採用するわけにはいかない。

逆にいえば、WebSocketを使いたくなるようなアプリケーションならば無理にRESTfulにする必要はないし、そもそも「Web」アプリケーションにすべきなのかどうかも検討したほうがよいということだろう。


ちなみに、WebSocketが80番と443番のポートを使うことになったのは、IANAにそうしろと言われたからだそうだ。

IANA told me to use ports 80 and 443 for WebSocket. See IANA ticket
#257455. (I had originally requested new ports, ideally 81 and 815.)

「サニタイズ」の方針を考える

徳丸浩の日記: 処理開始後の例外処理では「サニタイズ」が有効な場合もある」を読んで、以前、奥さんに同様のご指摘をいただいたことを思い出した。

そのときは考えを深められなかったので、あらためて考えてみたい。

まず、徳丸さんが例に挙げられている「異常なデータを含むツイート」については、そもそもそのようなツイートを許さないようバリデーションすれば済む話といえる。それでも、保険的に「サニタイズ」したいケースはあるだろうし、しておいて困ることはないだろう。

実は、もっと積極的にサニタイズすべき場合がある。ブログのサイドバーに外部サイトのフィードを表示したり、Amazonの売れ筋ランキングを表示したりするケースだ。出どころが外部サイトである場合、いつ異常なデータを含むようになるか分からない。そのたびにブログがサービス不能になってしまってはいけない。

さらに考えると、サニタイズのタイミングはHTTPレスポンスの構築時が適切とはかぎらないだろう。外部サイトのデータを自アプリケーションのデータベースに保存しなければならない場合、バリデーションで保存をやめるより、サニタイズしてでも保存したほうがよいこともありうる。

結論として:

  • 自アプリケーションへのHTTPリクエストは即座にバリデーション
  • 外部サイトのデータは取得直後にサニタイズ
  • 保険をかけておきたければHTTPレスポンス構築時にサニタイズ

という方針が分かりやすいのではないだろうか。

追記(2012-04-03)
徳丸さんが補足記事「徳丸浩の日記: 悪いサニタイズ、良い(?)サニタイズ、そして例外処理」を書かれた。「サニタイズ」という表現を用いるべきでないという結論であり、異論はない。
私が「サニタイズ」で念頭に置いていたのは、徳丸さんが「許容例2:表示できない文字を扱う場合」で挙げている「表示できない文字を代替文字に置き換える処理」のことだった。これは何と呼べばよいのだろうか。
記事検索
Twitter