QUICでのHTTP通信の高速化

HTTPの高速化に関わる仕組み」でHTTP/2までの高速化についてまとめてみたのですが、QUICについても書いておこうと思います。QUIC(Quick Udp Internet Connectionsのこと、クイックと読みます)はGoogleが開発したプロトコルでHTTP通信をUDP上で行うものです。UDPはTCPと違い通信の信頼性を保証しないためTCPが持つ機能の一部(再送制御など)をQUICが担います。また暗号化に関わる機能もQUICは持っています。

そもそもGoogleがTCPではなくUDP上でHTTP通信をやろうと思った理由の1つに、TCP/TLSの接続時のオーバーヘッドを抑えることで更なる高速化が期待できると考えたからだと思います。TCPの接続時のコネクション確立には3ウェイハンドシェイクで3回のやりとり、TLSでのネゴシエーションでは7回のやりとりが行われたあとにデータ送信が始まります。

これがQUICの場合だとクライアントとサーバー間を1往復するだけでデータ送信が開始できます。接続のやりとりが1往復のみなので「1-RTT」と呼ばれています(RTTはラウンドトリップタイム、往復時間という意味です)。

2回目以降のデータ送信については②で得たトークンを使い、いきなりデータをサーバーに送ります。接続時のやりとりがないため「0-RTT」と呼ばれています。

なお、③、④のデータは暗号化されています。

UDPを使うもう一つのメリットは、ヘッドオブラインブロッキング(※)がTCPに比べ緩和されることではないでしょうか。HTTP/2でも非同期通信ができますので前のリクエストを待たずに後続のリクエストを送ることができるわけですが、パケットをロストした場合においてはTCPは再送制御が働き、後続のリクエストに「待ち」が発生します。QUICはこの再送制御を独自で実装しているためTCPに比べ効率的な方法で(もしくは「待ち」が発生しない方法で)ヘッドオブラインブロッキングを取り除いているのではないかと思います。

(※)ヘッドオブラインブロッキング・・・前のリクエストが処理されるまで次のリクエストが待たされてしまう(ブロックされてしまう)ことをいいます。

他にもQUICの利点はあるのかもしれませんが、ここでは接続時のオーバヘッドとヘッドオブラインブロッキングについて書いてみました。なお、QUICは今後TLS1.3と同等の機能を持つ(TLS1.3の仕様を取り込み同様の機能を持つ)ことになるようです。

■2019年2月24日 「HTTP/3」について追記
2015年6月にGoogleがIETFにQUICのドラフトを提出し、2016年末にIETFの中でワーキンググループが設置され標準化の検討が始まりました。

上に書いていたことは、Googleが開発を行ったときにQUICをWeb利用のものとして考えていたものです。IETFの標準化の中ではWeb利用に限らないトランスポート層のプロトコルとしてQUICを位置づけています。IETFではQUICを利用するHTTPを「HTTP over QUIC」と呼んでいたのですが、2018年の11月に「HTTP/3」という名称で呼ぶことにかえました。

GoogleもIETFの標準化作業がまとまればそれを踏襲する意思を示しています。IETFでは2019年7月にQUICの標準化仕様の公開を予定しているようです。

■2022年7月14日 「HTTP/3」について追記
2022年6月にIETFはHTTP/3を正式に勧告しました。これにより今後は脱TCPの流れになっていくかもしれません。なお、2022年6月時点でHTTP/3に対応しているWEBサイトは全体の25%程度とのことです。

リダイレクトを利用した詐欺サイトの手口について

ショッピングサイトを装って金銭を搾取する詐欺サイトが増えているようです。攻撃者は正規のサイトを改ざんして詐欺サイトに顧客を誘導します。顧客は詐欺サイトを本物のサイトと思っているので商品を購入(クレジットカード番号の入力等)をしてしまいます。

  1. 顧客が検索サイトで欲しい商品を検索して検索結果が表示される。気に入ったサイトのリンクをクリックする。
  2. 攻撃者によって改ざんされた正規のサイトにリンクがいくが、すぐに詐欺サイトにリダイレクトされる。
  3. 顧客のブラウザに詐欺サイトが表示されてしまう。

正規サイトの改ざん方法

正規のサイトから詐欺サイトにリダイレクトさせる方法ですが、以下のやり方があります。

①HTTPリダイレクト
②HTMLリダイレクト
③JavaScriptによるリダイレクト

①については前回の記事を見てみてください。WEBサーバ(Apache)の httpd.conf、もしくは、.htaccess の書き換えでリダイレクトさせます。

②についてはHTMLのmetaタグを利用する方法です。具体的には以下のコードを正規のサイトに書き加えます。書き加える場所はHTMLのヘッダ部(<head>〜</head>の間)です。

③についてもJavaScriptのコードを正規のサイトに書き加えます。具体的には以下のコードです。

JavaScriptのリダイレクトでは「location.href = “リダイレクト先URL”;」という書き方もあるのですが、この書き方だとブラウザの履歴に残るため詐欺サイト上でブラウザの「戻る」ボタンを押下した際に正規のサイトに戻ります。そうすると、詐欺サイトにまたリダイレクトされいつまでたっても戻れない状態になってしまいます。location.replace の書き方はブラウザの履歴に残らないため「戻る」ボタンを押下した際の戻り先は検索サイトの結果表示画面となります。
なお、②のmetaタグを使用した場合もブラウザの履歴に残るため location.href の場合と同様の動きになります。

リダイレクトの方法は①〜③のやり方があるのですが、攻撃者は比較的簡単な改ざんでリダイレクトできる③のやり方を用いているのではないかと推測します。ちなみに、ブラウザが実行するリダイレクトの優先順位ですが①、②、③の順(HTTPリダイレクトを最優先する、JavaScriptによるリダイレクトは最後)となります。

SEOポイズニング

ここまで正規サイトの改ざん方法について書いてみましたが、攻撃者はもう一つ重要な仕込みを行います。SEOポイズニングと呼ばれるもので改ざんされたサイトが検索結果の上位に表示されるような仕込みです。検索サイトの表示順のアルゴリズムは非公開であるため容易ではないのですが、SEO対策としていろいろな方法が取り沙汰されているため、それらを利用(悪用?)しているものと思われます。検索結果を上位にさせる具体的な方法はちょっと不明です。

対策はどうしたらいいか?

ただサイトを見ているだけなら特に意識する必要はないかと思いますが、金銭の支払いを伴う場合は注意が必要です。詐欺サイトは巧妙に作られているためそれを正規のサイトかどうか見分けるのは難しいかもしれません。少しでもへんな日本語があったりしたら疑ったほうが良いでしょう。少なくとも、TLD(トップレベルドメイン)の確認はしたいところです。