近年、新しい技術として、HTTP2を採用しているAPIがどんどん増えています。本文では、HTTP/2という技術の基本情報を紹介した上、HTTP/2リクエストを実装する方法を詳しく解説していきたいと思います。
また、HTTP/2 に完璧に対応可能なAPIテストツールのApidogを使用して、簡単にHTTP/2リクエストを実装する方法をも一緒に紹介します。
HTTP/2リクエストとは
HTTP2リクエストは、このHTTP2の機能を使って送信されるリクエストのことを指します。HTTP/2は、ヘッダ圧縮やストリーム転送により、HTTP1.1のリクエストよりも高速で効率的に行うことができます。
HTTP/2リクエストへの理解を深めるために、HTTP/2というプロトコルをまず知っておく必要がありますので、次はHTTP/2プロトコルについても紹介します。
HTTP/2プロトコルについて
HTTP/2 は、HTTPネットワークプロトコルの2番目のメジャーバージョンとして、HTTP 1.1の後継として知られていることが多くなります。HTTP/2はInternet Engineering Task Force (IETF) によって開発され、2015 年 5 月に承認されました。HTTP/2 の主な目的は、待ち時間を短縮し、クライアントとサーバー間のデータ送信方法を最適化することで、Web サイトと Web アプリケーションのパフォーマンスを向上させることです。この目標を踏まえて、HTTP2は次のような特徴があります。

- マルチプレクシング: 1つのTCPコネクションで複数のリクエストを同時に処理できる
- ヘッダー圧縮: ヘッダ情報を圧縮して転送量を削減
- サーバープッシュ: クライアントが必要とするリソースをサーバーが予めプッシュ
- ストリームプライオリティ: ストリームに優先度をつけて重要な通信を優先
- バイナリプロトコル: テキスト形式からバイナリ形式に変更し効率化
このように、HTTP/2では接続効率、転送効率、優先制御などが向上し、通信速度が大幅に高速化されています。Webアプリケーションの高速化に有効な新しいプロトコルといえます。
HTTP/2のストリームについて
HTTP/2は、Googleのアプリケーションレイヤープロトコル「SPDY」をベースとするプロトコルで、複雑なWebサイトでもWebブラウザが画像やテキストを高速に表示できるようリクエストを行えるようにします。また、HTTP/1.1ではリクエストは1つずつ処理するが、HTTP/2は単一の接続で複数のストリームを同時に処理できるようになります。

(https://www.itmedia.co.jp/news/articles/2310/11/news082.htmlより参照)
HTTP2でのストリームは、次のような特徴を有しています:
- HTTP/2では1つのTCPコネクション上で複数のストリームを多重化できる
- ストリームは論理的な通信チャネルで、リクエストとレスポンスが対になって送受信される
- 送受信はフレームという単位で行われ、複数のストリームがインターリーブされて転送される
- ストリームには優先度を設定でき、重要な通信を優先的に処理できる
- サーバーはクライアントが必要としそうなデータをストリームとしてプッシュできる
- ストリームは一方向の通信チャネルのため、全二重通信が可能になる
- ストリーム単位での流量制御が行われ、ふくそう制御が容易になる
- ただし、ストリームの競合によりオーバーヘッドが発生することもある

このように、HTTP/2のストリームは効率的な通信と柔軟な制御を実現するためのコアとなる技術です。
HTTP/2の脆弱性
HTTP/2は、従来のプロトコルより効率的な通信と柔軟な制御を実現していますが、いくつかの脆弱性も存在しています。次は、多くの業者に多く取り上げられる脆弱性を皆さんに紹介します。
HPACK圧縮アルゴリズムの脆弱性
- HPACKはHTTP/2で採用されたヘッダ圧縮形式です。
- 圧縮アルゴリズムに欠陥があることが判明し、攻撃者に悪用される可能性がある。
サーバープッシュの悪用
- サーバーがクライアントにリソースをプッシュできる機能です。
- 攻撃者が不要なデータをプッシュすることでDoS攻撃を仕掛けることが可能。
ストリームの優先制御
- ストリームに優先度をつけられる機能です。
- 攻撃者が意図的に優先度の高いストリームを生成し、通信を妨害できる。
同一コネクションのストリーム競合
- 1つのコネクションで複数のストリームが転送されます。
- ストリーム間の競合が発生しパフォーマンスが低下することがある。
TLSに対する依存度が高い
- HTTP/2はTLSに強く依存したプロトコルとなっている。
- TLSの脆弱性がHTTP/2のセキュリティにも影響を及ぼす。
これらの脆弱性により、サーバー攻撃を受ける可能性があります。ITmediaのニュースによりますと、米Google、米Cloudflare、米Amazonは10月10日(現地時間)、新たに発見された「HTTP/2」プロトコルに関連する脆弱性により、8月に最大規模のDDoS(分散型サービス妨害)攻撃を検知していたと発表しました。
ApidogでHTTP/2リクエストを実装する方法
上記の情報から、プロトコルを選択する際に、サービス内容と要件に応じて、HTTP1.1とHTTP2のどちらにするかを決める必要があります。しかも現在、HTTP2は主流のプロトコルとは言えませんので、PostmanなどのAPIテストツールもHTTP2プロトコルをサポートしていないこともあります。それでは、もしHTTP2を採用しているAPIをテストするために、どうしたらいいですか?次は、Apidogというツールを使ってHTTP/2リクエストを簡単に実装する方法を紹介します。
Apidogは、APIの設計、仕様書生成と共有、テスト及びAPIモックにも対応可能なAPIライフサイクリ管理ツールです。Apidogは、HTTP1へのサポートはもちろん、最新バージョンではHTTP2プロトコルへのサポートが開始されました。これにより、Apidogを使用して、いつものようにHTTP2リクエストを実装することが可能です。
ステップ⒈Apidogを開き、リクエストを新規に作成します。
ステップ⒉Apple Push Notification Service(Appleプッシュ通知サービス)の「https://api.sandbox.push.apple.com/」をエンドポイントのURLを送信すると、エラーが発生されずレスポンスを成功に取得できます。

また、「設定タブ」に切り替えて、HTTP2に対応するかどうかを指定するために、HTTPとHTTPSの接続方式を選択することも可能です。

HTTPS接続方式の選択
HTTP/1.1
従来のようにHTTP/1.1という接続方式を選択すると、Apidogは、HTTP1.1及びそれ以前のプロトコルを採用するサーバーからレスポンスを取得できます。
HTTP/2 ALPN
HTTP/2 ALPNに切り替えると、ApidogはHTTP/2 ALPN(Application-Layer Protocol Negotiation)を使用して接続を確立します。まずはHTTP/2を使用して接続しますが、サーバーがHTTP/2をサポートしないことを検出した場合は、自動的にHTTP/1.1を使用します。こういう流れのおかげで、ApidogはAPIが利用しているHTTPプロトコルを自動的に判断できるので、いつものようにそうすれば、HTTP/2のAPIをテストしたりすることができます。
HTTP接続方式の選択
HTTP/1.1
HTTP接続方式をHTTP/1.1を指定すると、Apidogは、HTTP/1.1のみからレスポンスを取得できます。
HTTP/2 Prior Knowledge
HTTP接続はプレーンなTCP接続で行われるため、TLSハンドシェイク時に行われるALPNによるプロトコルネゴシエーションは利用できません。そこで、HTTP接続方式でHTTP/2を選択すると、Apidogは、HTTP/2を直接使用してh2c接続を確立します。サーバーがHTTP/2をサポートしていない場合は接続失敗になります。 HTTP/1.1は使用されません。
まとめ
この記事では、最近注目されているHTTP/2プロトコルについて解説しています。HTTP/2はHTTP/1.1の高速化を目的としており、マルチプレクシング、ヘッダ圧縮などの機能を持っています。HTTP/2では1つのTCPコネクション上で複数のストリームを使って通信することができ、ストリームは効率的な通信と制御を実現する論理的な通信チャネルです。ただし、HTTP/2にはいくつかの脆弱性もあるため、攻撃に悪用される可能性に注意が必要です。
また、HTTP/2リクエストを実装する方法として、Apidogなどのツールを利用することで実現することができます。Apidogは、HTTP1.1と2にも完璧に互換できるので、簡単にHTTP/2のAPIをテストすることができます。