メニュー

おすすめコラム

2020年2月20日
常識を疑え!ハッカー視点のセキュリティ
株式会社トライコーダ 上野宣

第23回 TLSによる暗号化通信が必須!? すでに来ている HTTP/2 の世界

Webの通信で使われているプロトコルがHTTPだというのは知られているとは思いますが、多くの人はHTTPのバージョンまでは気にしていないのではないでしょうか。
HTTP/2ではTLSという暗号化通信が必須になるなど、従来のHTTPからさまざまな変化を遂げています。 HTTP/2は何が変わったのかを見ていきましょう。

HTTP/2 はなぜ登場したのか

Webによるインターネット黎明期を支えてきたHTTPというプロトコルは、1997年に登場したHTTP/1.1というバージョンのものが長らく使われていました。HTTP/1.1は2014年にも一度大きく改定されて、現在も主力のWebプロトコルとして使用されていますが、基本的な設計思想は20年以上前の古いものとなっています。
現在のWebは20年前に比べると、ブラウザの進化やJavaScriptやCSSなどの進化もあり、かなり多くの機能を提供しています。それに伴って、各リソースのサイズは大きくなり、一度に読み込むコンテンツの量も増大の一途を辿っています。

HTTP/2が登場したのは、HTTP/1.1でできるパフォーマンスの改善が限界に来ており、プロトコルを根本的に変えることでしかこれ以上の改善が見込めないところまで来ていたためです。
HTTP/2はまったく新しいプロトコルという訳ではありません。HTTP/1.1で使用しているHTTPメッセージというデータ構造の意味をそのままに、それを効率よく転送するためのプロトコルなのです。つまり、従来のHTTP/1.1向けに作ったWebアプリケーションやJavaScriptなどはHTTP/2でもそのまま動作します。

もしWebサーバーとしてNginxまたはAWS(Amazon Web Service)でALB(Application Load Balancer)を使っていると、知らない間にWebサイトがHTTP/2対応している可能性があります。
このHTTP/2は2015年に登場し、執筆している現在(2019年12月)で40%以上[^1] の普及率があるとの調査結果があります。
[^1]: https://w3techs.com/technologies/details/ce-http2

HTTP/2 の特徴

HTTP/2 は効率よくコンテンツを転送するために以下のような特徴を持っています。

  • * バイナリ形式のHTTPフレーム
  • * HTTPヘッダーの圧縮
  • * ストリームと多重化
  • * ストリームの優先度
  • * サーバープッシュ
  • * TLS機能

* バイナリ形式のHTTPフレーム

HTTP/1.1ではテキスト形式だったHTTPメッセージですが、HTTP/2からは「フレーム」というバイナリ形式のデータ構造で表現されるようになりました。フレームには目的別にDATAやHEADERSなど10種類のタイプが存在します。
形式は変化しましたが、HTTPリクエストとレスポンスをやり取りするという仕組みは変わりません。

* HTTPヘッダーの圧縮

HTTP/1.1ではリクエストとレスポンスのやり取りのたびに同じようなヘッダーフィールドを何度も送受信していましたが、HTTP/2ではヘッダーの圧縮にHPACKという仕組みにより、大幅に少ないデータ量でヘッダーフィールドを表すことができるようになりました。
HPACKはハフマン符号化と、ヘッダーフィールド名と対応したインデックステーブルという辞書のような仕組みを使うことでデータ量を削減しています。

* ストリームと多重化

HTTP/1.1では並列にコンテンツを取得したい場合、TCPコネクションを複数使うことでしか実現できませんでしたが、HTTP/2では「ストリーム」という仕組みを用いることで並列に送受信できるようになりました。
HTTP/2ではこの「ストリーム」が1度の通信の単位になります。このストリーム単位ごとにリクエストとレスポンスが「フレーム」という形式でやり取りされています。

* ストリームの優先度

HTTP/1.1にはなかった機能として、クライアントがリクエストを送る際に優先度を設定できる仕組みがあります。たとえば、CSSなど画面構成に必要な要素は先に読み込み、画像などは後にするといった処理が可能になります。ただし、サーバー側はこの優先度に必ずしも従う必要はありません。

* サーバープッシュ

HTTP/1.1では必ず1つのリクエストに対してレスポンスを返すという仕組みでしたが、HTTP/2ではクライアントからリクエストが来る前にレスポンスを返す「サーバープッシュ」という仕組みがあります。
たとえば、HTMLファイルの内容で画像やCSSファイルが指定されている場合、クライアントが次にそれらのリクエストを送ってくることが予測できます。そこでリクエストが来る前に投機的にレスポンスを送信する仕組みが「サーバープッシュ」です。

* TLSを使用

HTTP/1.1ではSSL/TLSの使用は任意でしたが、HTTP/2ではTLS1.2以上の使用が必須となります。平文でHTTPの通信をしていると、盗聴、改ざん、なりすましの脅威を防ぐことはできませんが、TLSによる暗号化通信が必須になることでそれを防ぐことができるようになります。
以前であれば証明書にコストが掛かると不満もあったようですが、現在ではLet's EncryptやAWSのような無料の証明書もありますのでほとんど問題にはならないでしょう。

他にもフロー制御や機能拡張など、HTTP/2にはさまざまな機能が備わっています。これらの仕様の詳細については、RFC7540 Hypertext Transfer Protocol Version 2 (HTTP/2) や、RFC7541 HPACK: Header Compression for HTTP/2 などを参照してください。

Copyright © NEC Fielding, Ltd, 2020. All rights reserved.