新しいHTTP QUERYメソッド:リクエストボディを持つGETリクエスト

新しいHTTP QUERYメソッド:リクエストボディを持つGETリクエスト

26年の時を経て、HTTPがついに複雑な検索向けに構築されたメソッドを獲得 — APIデザインのすべてが変わる

HTTPは1996年以来、Webのバックボーンとなってきました。ほぼ30年の間、コアとなるメソッド群 — GET、POST、PUT、DELETE、PATCH — はほとんど変わりませんでした。開発者はそれらの上に巨大なREST APIの帝国を築き上げました。そして、ほとんどのユースケースにおいて、それらは問題なく機能しています。

しかし、ギャップが存在していました。あらゆるAPI開発者が一度は直面したことのある、構造的で煩わしく、時には危険なギャップです。データを検索する必要があり、その検索自体が複雑な場合、どうすればよいのでしょうか?

2026年7月17日、そのギャップについに公式な回答が出されました。2026年6月15日に標準化され、RFC 9148で正式に定義されたQUERY HTTPメソッドは、非常に久しぶりにHTTPメソッドファミリーに追加された新機能です。そして、GETやPOSTでは決してスマートに処理できなかった現実の問題を解決します。

問題点:GETは複雑な検索を処理できない

GETはデータ取得の主力です。URLにアクセスすれば、サーバーがデータを返します。シンプルでクリーン、キャッシュも可能です。「ユーザー42を取得する」や「公開済みの全記事を一覧表示する」といった単純な照会には、GETが最適です。

しかし、現代のアプリケーションが要求するのは単純な問い合わせばかりではありません。

分析ダッシュボードを構築しているところを想像してみてください。ユーザーは12種類のパラメータ(日付範囲、ネストされた地理的地域、特定の製品カテゴリー、ブール論理を用いたユーザーセグメント、フリーテキスト検索クエリなど)でフィルタリングしたいと考えています。そのフィルターセットは簡単に1,000バイトを超えてしまいます。

ここでGETが破綻します。GETリクエスト内のすべての情報はURLに含まれます。そしてURLには実用上の長さ制限があります。ブラウザは上限を設け、プロキシは切り詰め、サーバーは拒否します。RFC 2616ではサーバーが少なくとも8,000バイトを処理することを推奨していますが、現実の多くの運用環境ではそれよりはるかに手前で限界を迎えます。

さらに悪いことに、これらのURLパラメータはいたるところにログとして記録されます。ブラウザの履歴はフルURLを記録します。プロキシサーバーはそれをキャッシュします。サーバーのアクセスログはそれを保存します。検索条件に機密データ(患者ID、社会保障番号の一部、内部アカウント参照など)が含まれている場合、その情報は自分が管理していない複数のシステムにプレーンテキストで残ることになります。

これは机上の空論ではありません。現実のコンプライアンス上の大きな問題なのです。

問題点:POSTを使うのは偽りである

そのため開発者はいつものように回避策を取ります。コードレビューで誰かが「POSTを使えばいい」と言います。「POSTリクエストならJSONボディを含めることができるし、ボディがURLに残ることもない」と。

技術的には正しいですが、意味論的には誤りです。

POSTはデータを変更するために設計されています。サーバーに対して「何かを送信します — リソースを作成し、プロセスをトリガーし、状態を変更してください」と伝えます。それがHTTP仕様の規定であり、Webアプリケーションファイアウォールが期待する動作であり、サーバーフレームワークが前提としていることです。

データの検索にPOSTを使用することは、スタックのすべてのレイヤーに対して嘘をついていることになります。

これは単なる哲学的な純粋性の問題ではありません。現実の悪影響を及ぼします:

  • キャッシュが機能しなくなる。 ほとんどのHTTPキャッシュ(CDN、リバースプロキシ、ブラウザキャッシュ)はデフォルトでPOSTレスポンスをキャッシュしません。POSTは(サーバー状態が変更されるため)毎回異なるレスポンスになる可能性があることを意味するからです。
  • 意図しない副作用。 一部のサーバーフレームワークやミドルウェアはPOSTを異なる方法で処理します。「検索」エンドポイントが「作成」エンドポイントのように見えるというだけの理由で、監査ログへの書き込み、Webhookのトリガー、あるいは異なるレート制限ルールの適用が行われる可能性があります。
  • CSRFリスクの増大。 POSTエンドポイントはクロスオリジンセキュリティのセマンティクスが異なります。POSTを使用する検索エンドポイントには、GETエンドポイントでは不要なCSRF保護が必要になります。
  • リトライが危険になる。 リクエストがタイムアウトした場合、クライアントはGETを安全にリトライできます(べき等であるため)。しかし、POSTのリトライは重複レコードを作成する可能性があります — 本来、「検索」エンドポイントは何も作成すべきではありません。

この不整合は、長年にわたりバグ、セキュリティ上の脆弱性、そしてアーキテクチャ上の扱いづらさの原因となってきました。GraphQLは多くの強みを持つものの、この問題をさらに一般的なものにしました — ほとんどのGraphQL実装はクエリをPOSTリクエストとして送信するため、GraphQL APIでのすべての読み取り操作が書き込み操作というセマンティックな荷物を背負うことになります。

QUERYの登場:目的に最適なツール

QUERYメソッドはまさにその名の通り、ボディをサポートするGETリクエストです。

主な違いは以下の通りです:

安全かつ読み取り専用である。 QUERYメソッドは安全でべき等な操作として定義されています。同じQUERYリクエストを10回連続で送信しても、サーバーに副作用を一切与えずに同じ結果が返されます。データの作成も状態の変更も行われず、監査トレイルが誤ってトリガーされることもありません。

リクエストボディをサポートしている。 POSTと同様に、リクエストボディに構造化データ(JSON、XMLなど、APIが使用するもの)を含めることができます。複雑な検索フィルター、ネストされたオブジェクト、複数キロバイトのペイロードを完全にURLから排除できます。

明確な意図を示す。 サーバーがQUERYリクエストを受け取った際、クライアントが何を求めているかに曖昧さはありません。データを読み取りたい、ただそれだけです。このPOSTが検索なのか作成操作なのかをサーバーが推測する必要はありません。

ネイティブでキャッシュ可能である。 POSTによる回避策とは異なり、QUERYは適切なキャッシュセマンティクスを備えたHTTPプロトコルレイヤーで動作します。このメソッドはサーバー状態を変更しないことを明示的に宣言しているため、キャッシュやCDNはQUERYレスポンスをキャッシュできます — これはPOSTでは決して保証できないことです。

この最後の点は強調する価値があります。GraphQLは複雑なフィルタリングを見事に処理しますが、それはアプリケーションレイヤーで機能します。ほとんどのGraphQLクエリはPOSTリクエストとして送信され、サーバーは通常POSTレスポンスをネイティブにキャッシュしません。QUERYメソッドはトランスポートレイヤーで動作するため、特別なアプリケーションレベルの設定を行うことなく、HTTPインフラストラクチャ(プロキシ、CDN、ロードバランサー)がキャッシュに参加できます。

QUERYリクエストの例

HTTPリクエストを書いたことがあるなら、これは見覚えがあるはずです:

QUERY /api/analytics/events HTTP/1.1
Host: api.example.com
Content-Type: application/json
Accept: application/json

{
  "dateRange": {
    "start": "2026-01-01",
    "end": "2026-06-30"
  },
  "filters": {
    "regions": ["us-west-2", "eu-central-1"],
    "eventTypes": ["purchase", "refund"],
    "minAmount": 50.00
  },
  "groupBy": ["region", "month"],
  "limit": 100
}

これだけです。URLはクリーンなままであり、ボディがすべての複雑さを保持します。そして、すべてのHTTPインフラストラクチャがこのリクエストを読み取り操作であると認識します。

セキュリティの観点:新しいメソッド、新しい攻撃面

ここからが興味深く、そして少し恐ろしいところです。

QUERYメソッドは、複雑な読み取りにおけるGETとPOSTの構造的な問題を解決します。しかし、Webインフラストラクチャに新しいHTTPメソッドを導入することは、攻撃者やセキュリティ研究者にとって大きな新しい遊び場を開くことにもなります。

キャッシュが複雑になる

QUERYはキャッシュ可能であり、ボディを持っています。この組み合わせは、ほとんどのHTTPインフラストラクチャにとって新しいものです。

従来のキャッシュでは、URLと特定のヘッダーをキャッシュキーとして使用します。QUERYでは、サーバーとプロキシはリクエストボディもキャッシュキーに含める必要があります。もしキャッシュ実装がこれを誤り、例えばURLのみをキーにしてボディを無視した場合、異なるユーザーの検索結果が互いに漏洩する可能性があります。

さらに悪いことに、リクエストボディに含まれる機密データがキャッシュログやデバッグ出力に残ってしまうと、あるログ問題(アクセスログ内のURLパラメータ)を別のログ問題(キャッシュデバッグログ内のリクエストボディ)と交換しただけになってしまいます。

古典的な脆弱性、新しいベクター

新しいHTTPメソッドが登場するたびに、既存の脆弱性クラスに新たな機会がもたらされます:

  • 入力検証の失敗。 お使いのWAFは、POSTボディを検証するのと同じ方法でQUERYリクエストボディを検証していますか?そうでなければ、攻撃者が悪意のあるペイロードを防壁の向こうへ密輸する可能性があります。
  • レート制限の抜け穴。 レートリミッターがGETとPOSTリクエストをカウントしていてもQUERYを認識していない場合、攻撃者は無制限にリクエストを送信できてしまいます。
  • CSRFおよびCORSの混乱。 ブラウザとフレームワークは、QUERYのクロスオリジンセマンティクスを正しく処理する必要があります。導入初期段階では、設定ミスがほぼ確実に発生するでしょう。
  • HTTPリクエストスマグリング。 QUERYを理解していないロードバランサーやリバースプロキシはリクエストを誤って解析する可能性があり、フロントエンドとバックエンドでリクエストの終了位置と次のリクエストの開始位置の認識が一致しなくなるスマグリングの機会が生じます。
  • メソッドの混乱。 WAFやミドルウェアが未知のメソッドを検知してデフォルトハンドラーにフォールスルーした場合、まったく誤ったセキュリティポリシーを適用してしまう可能性があります。

これらは想定上のリスクではありません。HTTP/2の導入時、WebSocketsの登場時、その他あらゆる重大なプロトコル変更が本番インフラに適用された際に現れたのと同じ種類のバグです。パターンは明確です。ツールが追いつくまでの間、新しいプロトコル機能は一時的なセキュリティギャップを生み出します。

導入の現状

2026年半ばの時点で、導入は初期段階にあります:

  • ブラウザ サポートの追加が始まっていますが、まだ一般的ではありません。
  • Webアプリケーションファイアウォール QUERYリクエストを認識し適切にフィルタリングするようにルールセットを更新しています。
  • CDN QUERY向けにボディを意識したキャッシュサポートを順次展開していますが、設定は様々です。
  • APIフレームワーク — Express、FastAPI、Spring、ASP.NET — は、最新リリースでQUERYハンドラーを追加しています。
  • HTTPクライアントライブラリ QUERYリクエストの送信をサポートするように更新が進められています。

完全かつ広範な普及には時間がかかります。これはプロトコルレベルの変更であり、ブラウザからCDN、リバースプロキシ、アプリケーションフレームワーク、WAFに至るまで、スタックのあらゆるレイヤーが新しいメソッドを理解する必要があることを意味します。

今すぐすべきこと

バックエンド開発者またはAPIデザイナーの場合:

  1. RFCを読む。 RFC 9148が正式な仕様書です。実装する前にセマンティクスを理解してください。
  2. インフラストラクチャを監査する。 リバースプロキシ、ロードバランサー、WAFがQUERYリクエストを正しく通過させるか確認してください。古い設定の多くは、未知のHTTPメソッドをデフォルトでブロックします。
  3. 本番環境への導入を急がない。 内部APIや開発環境から始めてください。QUERYエンドポイントをパブリックインターネットに公開する前に、ツールの成熟を待ちましょう。
  4. キャッシュ戦略を更新する。 QUERYレスポンスをキャッシュする予定がある場合は、キャッシュキーにURLだけでなくリクエストボディのハッシュも含まれていることを確認してください。
  5. セキュリティコントロールをテストする。 レート制限、入力検証、CORS、認証のすべてがQUERYで正しく機能することを確認してください — 機能していると思い込まないでください。

セキュリティ研究者であれば、これは絶好の機会です。まったく新しいHTTPメソッドが本番インフラに適用されることは、いたるところに新たな攻撃面が生まれることを意味します。導入初期に現れるバグは最も大きな影響を与えることが多いため、今すぐQUERYの研究を始めましょう。

全体像

QUERYメソッドは革命ではありません。修正です。26年もの間、開発者はGETとPOSTをどちらのメソッドも想定していなかった用途に使用し、その代償をセキュリティバグ、キャッシュの破綻、アーキテクチャの扱いづらさとして支払ってきました。

QUERYはGETを置き換えるものではありません。POSTを置き換えるものでもありません。数年前に埋められるべきだった隙間(リクエストボディをサポートする、安全で読み取り専用のHTTPメソッド)を埋めるものです。

プロトコルは公式なものとなりました。RFCは発行されました。エコシステムは適応しつつあります。APIを構築しているか、インフラを強化しているか、あるいは脆弱性を探しているかにかかわらず、QUERYメソッドは理解しておくべきものです。

Webに新しい動詞が加わりました。賢く使いましょう。

メリット

  • URL長制限の解決: 複雑な検索ペイロードがURLからリクエストボディに移動 — 切り詰めの解消
  • セキュリティの向上: 機密性の高い検索パラメータがブラウザ履歴、アクセスログ、プロキシキャッシュに漏洩しなくなる
  • 正確なセマンティクス: サーバー、ミドルウェア、WAFが推測することなく読み取りと書き込みを区別できる
  • ネイティブなキャッシュ可能性: HTTPインフラストラクチャがQUERYレスポンスをキャッシュ可能 — POSTによる回避策とは異なる
  • べき等かつ安全: リトライが無害であり、分散システムにおけるエラー処理がシンプルになる
  • プロトコルレベルの解決策: GraphQLのようなアプリケーションレベルの回避策を必要とせず、すべてのREST APIで機能する

デメリット

  • 新しい攻撃面: スマグリング、メソッドの混乱、CSRF、CORSの問題に関する新たなベクターの導入
  • キャッシュの複雑化: キャッシュ実装でキーにリクエストボディを含める必要がある — 設定ミスによるデータ漏洩のリスク
  • 緩やかな普及: エンドツーエンドで確実に機能するには、ブラウザ、CDN、WAF、フレームワークのすべてで更新が必要
  • ツールの未対応: デバッグツール、モニタリングダッシュボード、ログパーサーがまだQUERYに対応していない可能性がある
  • インフラストラクチャの障害: 古いリバースプロキシやロードバランサーは、QUERYリクエストをサイレントにドロップまたは拒否する可能性があります。
  • 誤った安心感: パラメータをURLから外してもログ記録のリスクはなくなりません — ボディがログ記録される可能性は依然として残っています

注意

この記事では、2026年6月に標準化されたRFC 9148で定義されているQUERY HTTPメソッドについて説明します。ブラウザのサポート、フレームワークのサポート、およびインフラストラクチャの互換性は急速に進化しています。CDNからWAF、アプリケーションフレームワークに至るまで、スタックのすべてのレイヤーがこの新しいメソッドを適切に処理することを確認せずに、本番環境にQUERYエンドポイントをデプロイしないでください。ここで説明するセキュリティ特性は正しい実装を前提としています。誤設定されたインフラストラクチャは、QUERYが防止するように設計されているまさにその脆弱性を引き起こす可能性があります。まずは必ず制御された環境でテストしてください。

よくある質問

  • HTTP QUERYメソッドとは何ですか?GETとどのように異なりますか?
  • 今すぐ本番環境のAPIでQUERYを使用できますか?
  • POST経由で検索ペイロードを送信することと比較して、QUERYはどのように異なりますか?
  • CDNやプロキシはQUERYレスポンスを正しくキャッシュしますか?
  • QUERYメソッドはどのようなセキュリティリスクをもたらしますか?
  • 複雑なデータ取得において、QUERYはGraphQLを置き換えますか?
  • ExpressまたはFastAPIアプリケーションにQUERYサポートを追加するにはどうすればよいですか?
  • WAFがQUERYメソッドを認識しない場合はどうなりますか?

タグ

#http #query-method #rfc-9148 #api-design #web-security #rest-api #caching #http-methods

Free field guide

Docker Security Checklist

Lock down your containers from build to runtime — 29 practical controls covering images, runtime flags, secrets, and the daemon. Enter your email — you'll get the PDF instantly, plus new posts on Docker, Linux & security.