| 国際標準 | |
|---|---|
| 開発者 | 当初はCERN、IETF、W3C |
| 紹介された | 1991 (1991年) |
| Webサイト | httpwg |
| HTTP |
|---|
| リクエスト方法 |
| ヘッダーフィールド |
| 応答ステータスコード |
| セキュリティアクセス制御方法 |
| セキュリティの脆弱性 |
| インターネットプロトコルスイート |
|---|
| アプリケーション層 |
| トランスポート層 |
| インターネット層 |
| リンク層 |
HTTP(ハイパーテキスト転送プロトコル)は、分散型、協調型、ハイパーメディア情報システムのためのインターネットプロトコルスイートのアプリケーション層プロトコルです。 [ 1 ] HTTPは、ワールドワイドウェブのデータ通信の基盤であり、ハイパーテキスト文書には、マウスのクリックやウェブブラウザでの画面のタップなどによりユーザーが簡単にアクセスできる他のリソースへのハイパーリンクが含まれています。
HTTPは、クライアント・サーバーモデルにおけるリクエスト・レスポンス・プロトコルです。トランザクションは、クライアントがサーバーにリクエストを送信することから始まり、サーバーはリクエストに応えようと試み、リクエストの処理内容を記述したレスポンスをクライアントに返します。レスポンスには、 HTMLドキュメントやその他のコンテンツなどのリクエストされたリソースがオプションで含まれます。
一般的なシナリオでは、ウェブブラウザがクライアントとして機能し、1つ以上のウェブサイトをホストするウェブサーバーがサーバーとして機能します。ウェブブラウザはユーザーエージェント(UA)の一例です。その他の種類のユーザーエージェントには、検索プロバイダー(ウェブクローラー)が使用するインデックス作成ソフトウェア、音声ブラウザ、モバイルアプリ、そしてウェブコンテンツにアクセス、利用、表示する その他のソフトウェアが含まれます。
HTTPは、中間ネットワーク要素がクライアントとサーバー間の通信を改善または有効化できるように設計されています。トラフィック量の多いウェブサイトでは、上流サーバーに代わってコンテンツを配信するウェブキャッシュサーバーが、応答時間の改善に役立つことがよくあります。ウェブブラウザは、以前アクセスしたウェブリソースをキャッシュし、可能な限り再利用することで、ネットワークトラフィックを削減します。プライベートネットワーク境界にあるHTTPプロキシサーバーは、外部サーバーにメッセージを中継することで、グローバルにルーティング可能なアドレスを持たないクライアントの通信を容易にします。
中間 HTTP ノード (プロキシ サーバー、Web キャッシュなど) が機能を実行できるようにするために、一部のHTTP ヘッダー(HTTP 要求/応答内) はホップバイホップで管理されますが、その他の HTTP ヘッダーはエンドツーエンドで管理されます(ソース クライアントとターゲット Web サーバーによってのみ管理されます)。
ウェブリソースは、 httpとhttpsのUniform Resource Identifier(URI)スキームを使用して、 Uniform Resource Locator(URL)によって配置されます。URIはHTML文書内でハイパーリンクとしてエンコードされ、相互にリンクされたハイパーテキスト文書を形成します。[ 2 ]
このプロトコルは、これまで何度も改訂されてきました。バージョンはHTTP/#で示されます(#はバージョン番号)。この記事ではすべてのバージョンの特徴を網羅していますが、主にHTTP/0.9、HTTP/1.0、HTTP/1.1について解説します。HTTP /2とHTTP/3については、別の記事で詳細に解説しています。
| バージョン | 紹介された | 状態 |
|---|---|---|
| 0.9 | 1991 | 廃止 |
| 1.0 | 1996 | 廃止 |
| 1.1 | 1997 | 標準 |
| 2 | 2015 | 標準 |
| 3 | 2022 | 標準 |
HTTP/1.0では、リソース要求ごとに同じサーバーへの個別のTCP接続が確立されます。 [ 3 ]:§1.3
HTTP/1.1では、TCP接続を再利用して複数のリソース要求(HTMLページ、フレーム、画像、スクリプト、スタイルシートなど)を行うことができます。[ 4 ]:§9.1、9.3 HTTP/1.1通信では、TCP接続の確立にかなりのオーバーヘッドがかかるため、特にトラフィック量が多い状況では、遅延が少なくなります。[ 5 ]
HTTP/2 で追加された機能強化により、HTTP/1.1 通信よりも遅延が少なくなり、多くの場合、通信速度が向上します。HTTP/2 では、以下のサポートが追加されています。
HTTP/3は、 TCPの代わりにQUIC + UDPトランスポートプロトコルを使用します。IP層のみが使用されます(UDPはTCPと同様にIP層を基盤としています)。これにより、通信の平均速度がわずかに向上し、すべてのストリームのデータフローを一時的にブロックまたは遅延させる可能性のあるTCP接続輻輳(別の形態の「ヘッドオブラインブロッキング」)の問題を回避できます。
HTTP/2はウェブサイトの71%でサポートされており[ 7 ] [ 8 ](HTTP/2 34.1% + 下位互換性のあるHTTP/3 36.9%)、ほぼすべてのウェブブラウザ(ユーザーの98%以上)でサポートされています。[ 9 ]また、主要なウェブサーバーでは、TLS(トランスポート層セキュリティ)を介してアプリケーション層プロトコルネゴシエーション(ALPN)拡張機能を使用してサポートされています[ 10 ](TLS 1.2以降が必要です)。[ 6 ]
HTTP/3はウェブサイトの36.9%で使用されており[ 11 ]、ほとんどのウェブブラウザでサポートされています。つまり、(少なくとも部分的に)97%のユーザーがサポートしています。[ 12 ] HTTP/3は、基盤となるトランスポートプロトコルとしてTCPではなくQUICを使用します。HTTP/2と同様に、以前のメジャーバージョンのプロトコルを廃止することはありません。2019年に、HTTP/3のサポートはCloudflareとChromeに初めて追加され[ 13 ] [ 14 ] 、 Firefoxでも有効化されました。[ 15 ] HTTP/3は実際のウェブページでのレイテンシが低く、HTTP/2よりも読み込みが速く、場合によってはHTTP/1.1よりも3倍以上高速です。HTTP/1.1は現在でも一般的に唯一有効化されているプロトコルです。[ 16 ]
HTTPの安全なバージョンであるHTTPSは、85%以上のウェブサイトで使用されています。[ 17 ]
HTTPは、基盤となる信頼性の高いトランスポート層プロトコルを前提としています。[ 1 ]:§3.3 HTTP/3より前の基盤プロトコルの標準的な選択肢は、伝送制御プロトコル(TCP)でした。HTTP/3は、信頼性の低いユーザーデータグラムプロトコル(UDP)の上に信頼性を提供する、QUICと呼ばれる別のトランスポート層を使用します。HTTP/1.1およびそれ以前のバージョンは、マルチキャストおよびユニキャストの状況で、信頼性の低い単純なUDP上で使用できるように適応されており、HTTPMUおよびHTTPUを形成しています。これらは、通常ローカルエリアネットワークで実行される2つのプロトコルであるUPnPおよびSimple Service Discovery Protocol(SSDP)で使用されます。
HTTPはステートレスなアプリケーションレベルプロトコルであり、クライアントとサーバー間でデータを交換するために信頼性の高いネットワークトランスポート接続を必要とします。[ 18 ] HTTP実装では、TCP/IP接続は既知のポート(通常、接続が暗号化されていない場合はポート80 、接続が暗号化されている場合はポート443、 TCPおよびUDPポート番号の一覧も参照)を使用して使用されます。[ 1 ]:§4.2.1、4.2.2 HTTP/2では、TCP/IP接続と複数のプロトコルチャネルが使用されます。HTTP/3では、 UDP上の アプリケーショントランスポートプロトコルQUICが使用されます。
データは、セッション層トランスポート接続によって交換される一連のリクエスト・レスポンス・メッセージを通じて交換されます。 [ 18 ] HTTPクライアントは最初に、サーバーとの実接続または仮想接続を確立しようとします。ポートをリッスンしているHTTPサーバーは接続を受け入れ、クライアントからのリクエストメッセージを待ちます。クライアントはHTTPリクエストメッセージを送信します。リクエストを受信すると、サーバーはHTTPレスポンスメッセージを返します。レスポンスメッセージには、ヘッダーと、必要に応じて本文が含まれます。このレスポンスメッセージの本文は通常、要求されたリソースですが、エラーメッセージやその他の情報が返される場合もあります。クライアントまたはサーバーは、いつでも、様々な理由で接続を閉じることができます。接続の終了は通常、最後のリクエストまたはレスポンス内の1つ以上のHTTPヘッダーによって通知されます。[ 4 ]:§9.1
HTTP/0.9 では、サーバーの応答が送信された後、TCP/IP 接続は常に閉じられるため、永続的になることはありません。
HTTP/1.0では、応答が送信された後、TCP/IP接続は常にサーバーによって閉じられる必要があります。[ 3 ] [注2 ]
HTTP/1.1では、キープアライブ機構が正式に導入され、接続を複数のリクエスト/レスポンスで再利用できるようになりました。このような持続的な接続により、クライアントは最初のリクエスト送信後にTCP 3ウェイハンドシェイク接続を再ネゴシエートする必要がなくなるため、リクエストのレイテンシが大幅に短縮されます。もう一つのプラス効果として、TCPのスロースタート機構により、一般的に時間の経過とともに接続速度が速くなることが挙げられます。
HTTP/1.1 では、クライアントが各応答を待つ前に複数のリクエストを送信できるようにすることで、持続的な接続を使用する際の遅延時間をさらに短縮するHTTP パイプラインも追加されました。いくつかの Web サーバーと多くのプロキシ サーバー(特にクライアントとサーバー間のインターネット/イントラネットに配置された透過型プロキシ サーバー) は、パイプライン化されたリクエストを適切に処理しなかったため (最初のリクエストのみを処理して他のリクエストを破棄したり、最初のリクエストの後にさらにデータがあったために接続を閉じたり、一部のプロキシが順序どおりにレスポンスを返さなかったりするなど)、この最適化が本当に安全であると見なされたことはありませんでした。このため、安全かつべき等なモードでパイプライン化できるのは HEAD リクエストと一部の GET リクエスト (つまり、実際のファイル リクエストに限定され、クエリ文字列をコマンドとして使用しないURLなど) のみでした。パイプラインを有効にすることで発生する問題に長年悩まされた後、この機能は最初は無効化され、その後 HTTP/2 の採用が発表されたこともあり、ほとんどのブラウザーから削除されました。
HTTP/2 は、単一の TCP/IP 接続を介して多数の同時リクエスト/レスポンスを多重化することにより、永続的な接続の使用を拡張しました。
HTTP/3 は TCP/IP 接続ではなく QUIC + UDP を使用します。
HTTP/0.9 では、要求されたリソースは常に全体が送信されていました。
HTTP/1.0 では、条件付き GET リクエストを許可するために、クライアントによってキャッシュされたリソースを管理するためのヘッダーが追加されました。
Content-Encoding返されるコンテンツが圧縮されているかどうかを指定するためのヘッダーが追加されました。Content-Length。クライアントは接続が切断された時点で転送が完了したと想定しますが、接続が早期に切断された場合、クライアントはコンテンツが不完全であることに気付かず、転送が完了していない状態のままとなります。導入された HTTP/1.1 以降のバージョンでは以下が提供されます。
HTTPはステートレスなプロトコルであるため、複数のリクエストの間、ウェブサーバーが各ユーザーに関する情報やステータスを保持する必要がありません。ウェブアプリケーションがアプリケーションセッションを必要とする場合、 HTTPクッキー、[ 20 ] 、ウェブフォーム内の隠し変数、またはその他のメカニズムを介してセッションを実現します。
通常、セッションを開始するには対話型ログインが実行され、セッションを終了するにはユーザーによるログアウトが要求されます。これらの操作では、 HTTP認証ではなく、カスタム認証メカニズムが使用されます。
HTTP は、チャレンジ レスポンス メカニズムを介して動作する基本アクセス認証やダイジェスト アクセス認証などの複数の認証スキームを提供します。これにより、サーバーは要求されたコンテンツを提供する前にチャレンジを識別して発行します。
HTTPは、チャレンジレスポンス認証方式の拡張可能なセットを介して、アクセス制御と認証のための一般的なフレームワークを提供します。これは、サーバーがクライアントの要求にチャレンジするために、またクライアントが認証情報を提供するために使用できます。[ 1 ]
上記の認証メカニズムは HTTP プロトコルに属し、アプリケーション セッションを使用する Web アプリケーションではなく、クライアントおよびサーバーの HTTP ソフトウェアによって管理されます (1 つ以上の Web リソースへのクライアント アクセスを許可する前に認証を要求するように構成されている場合) 。
HTTP認証仕様には、特定のルートURIに共通するリソースをさらに細分化するための、実装固有の任意の構造を提供するレルムが含まれています。レルム値文字列が存在する場合、それは正規のルートURIと組み合わされ、チャレンジの保護空間コンポーネントを形成します。これにより、サーバーは実質的に、1つのルートURIの下に個別の認証スコープを定義することができます。[ 1 ]
暗号化されたHTTP接続を確立する最も一般的な方法はHTTPSです。[ 21 ]暗号化されたHTTP接続を確立する他の2つの方法は、セキュアハイパーテキスト転送プロトコル( SHTTP)と、HTTP/1.1アップグレードヘッダーを使用してTLSへのアップグレードを指定することです。ただし、これら2つのブラウザのサポートはほとんどありません。[ 22 ] [ 23 ] [ 24 ]

このセクションでは、HTTP/1.1のメッセージについて説明します。以降のバージョンであるHTTP/2 [ 25 ]およびHTTP/3では、バイナリプロトコルが採用されており、ヘッダーはHPACK [ 26 ]HEADERS (HTTP/2)またはQPACK (HTTP/3)を用いて、1つのフレームと0個以上のフレームにエンコードされます。HPACKはどちらも効率的なヘッダー圧縮を提供します。HTTP/1のリクエスト行またはレスポンス行も、コロン ( ) で始まる複数の疑似ヘッダーフィールドに置き換えられました。 CONTINUATION:
最高レベルでは、メッセージはヘッダーとそれに続く本文で構成されます。
ヘッダーはASCIIテキストの行で構成され、各行はキャリッジリターンとラインフィードのシーケンスで終了します。リクエストヘッダーとレスポンスヘッダーのレイアウトは次のとおりです。
本文はASCIIに限らず、任意の形式のデータで構成されます。Content-Typeメッセージにヘッダーフィールドが含まれている場合、その形式はヘッダーフィールドで指定された形式と一致している必要があります。本文はオプションであり、空白でも構いません。
HTTP/2 より前では、「エンティティ」という用語は、ボディと、ボディを記述するヘッダーフィールドの両方を指していました。特に、すべてのヘッダーがエンティティの一部とはみなされませんでした。「エンティティヘッダー」という用語は、エンティティの一部とみなされるヘッダーを指し、ボディはエンティティボディと呼ばれることもありました。最近のドキュメントでは、 「エンティティ」は使用せず、「ボディ」と「ヘッダー」を使用しています。
ヘッダー フィールドは、その内容メッセージに関するメタデータを表します。たとえば、本文のエンコード方法 ( Content-Encoding経由)、クライアントのセッション検証および識別 (ブラウザー クッキー、IP アドレス、ユーザー エージェントなど) またはその匿名性 (VPN またはプロキシ マスキング、ユーザー エージェント スプーフィング)、サーバーのデータ処理方法 ( Do-Not-Trackまたはグローバル プライバシー コントロールなど)、ダウンロードされるドキュメントの経過時間 (共有キャッシュ内に存在していた時間) などがあります。一般に、ヘッダー フィールドの情報はソフトウェアによって使用され、ユーザーには表示されません。
ヘッダーフィールド行は、コロンで区切られた名前と値のペアとしてフォーマットされます。名前の前後に空白文字を入れることはできませんが、値の部分では先頭と末尾の空白文字は無視されます。メソッド名(大文字と小文字を区別)は完全に一致する必要がありますが、 [ 27 ]ヘッダーフィールド名は大文字と小文字を区別せずに一致しますが、多くの場合、各単語が大文字で表記されます。[ 28 ]例えば、以下はおよびのヘッダーフィールドHostですAccept-Language。
ホスト: www.example.com Accept-Language: en
標準規格では、ヘッダーフィールドのサイズやメッセージ内のフィールド数に制限はありません。しかし、ほとんどのサーバー、クライアント、プロキシソフトウェアは、実用上およびセキュリティ上の理由から制限を設けています。例えば、Apache 2.3サーバーはデフォルトで各フィールドのサイズを8190バイトに制限しており、1つのリクエストに含まれるヘッダーフィールドの数は最大100個です。[ 29 ]
RFC 7230 [ 30 ]では非推奨となっているが、過去にはスペースやタブ文字で始まる継続行を使用して長い行を複数行に分割することが可能であった。
リクエストはクライアントからサーバーに送信されます。開始行には、メソッド名、リクエストURI、プロトコルバージョンが含まれ、各フィールドの間には1つのスペースが挿入されます。[ 31 ]次のリクエスト開始行は、メソッド名GET、リクエストURI /customer/123、プロトコルバージョンを指定していますHTTP/1.1。
GET /customer/123 HTTP/1.1
リクエストヘッダーフィールドは、クライアントがリクエスト行の外側にある追加情報を渡すことを可能にします。リクエストヘッダーフィールドは、(手続きのパラメータと同様に)リクエスト修飾子として機能します。リクエストヘッダーフィールドは、クライアント、対象リソース、またはリクエストの想定される処理に関する情報を提供します。HTTP/1.1プロトコルでは、<code><code><code><code>を除くすべてのヘッダーフィールドはHostオプションです。
パス名のみを含むリクエスト行は、RFC 1945のHTTP/1.0仕様以前のHTTPクライアントとの互換性を維持するためにサーバーによって受け入れられます。[ 32 ]
プロトコルは、トランザクションをリソースに対する操作として構造化します。リソースが何を表すか(既存のデータか動的に生成されるデータか)は、サーバーの実装によって異なります。多くの場合、リソースはファイルまたはサーバー上で実行される実行可能ファイルの出力に対応します。
リクエストは、リソースに対して実行される望ましいアクションを分類するためのメソッド(非公式には動詞と呼ばれることもある)を識別する。HTTP/1.0 仕様[ 3 ] : §8 では 、GET、HEAD、POST メソッドが定義され、追加メソッドとして PUT、DELETE、LINK、UNLINK メソッドがリストされている。ただし、HTTP/1.1 仕様[ 33 ] : §9 では、PUT、DELETE、CONNECT、OPTIONS、TRACE の 5 つの新しいメソッドが追加されている。どのクライアントも任意のメソッドを使用でき、サーバーはメソッドの任意の組み合わせをサポートするように設定できる。メソッドが中間者に不明な場合は、安全でない非べき等メソッドとして扱われる。定義できるメソッドの数に制限はないため、既存のインフラストラクチャを壊すことなく将来のメソッドを指定することが可能になる。たとえば、WebDAV では7 つの新しいメソッドが定義され、RFC 5789ではPATCHメソッドが指定されている。汎用ウェブサーバーは少なくともGETとHEADを実装する必要があり、その他のメソッドは仕様ではオプションとみなされている。[ 1 ]:§9.1
メソッド名は大文字と小文字が区別されます。[ 4 ] : §3 [ 1 ] : §9.1 これは、大文字と小文字を区別しないHTTPヘッダーフィールド名とは対照的です。[ 1 ] : §6.3
Content-Length。| 方法 | RFC | リクエストにはペイロード本体 があります | レスポンスにはペイロード本体 がある | 安全 | べき等性 | キャッシュ可能 |
|---|---|---|---|---|---|---|
| 得る | RFC 9110 | オプション | はい | はい | はい | はい |
| 頭 | RFC 9110 | オプション | いいえ | はい | はい | はい |
| 役職 | RFC 9110 | はい | はい | いいえ | いいえ | はい |
| 置く | RFC 9110 | はい | はい | いいえ | はい | いいえ |
| 消去 | RFC 9110 | オプション | はい | いいえ | はい | いいえ |
| 接続する | RFC 9110 | オプション | はい | いいえ | いいえ | いいえ |
| オプション | RFC 9110 | オプション | はい | はい | はい | いいえ |
| トレース | RFC 9110 | いいえ | はい | はい | はい | いいえ |
| パッチ | RFC 5789 | はい | はい | いいえ | いいえ | いいえ |
リクエストメソッドが安全であるとは、そのメソッドを用いたリクエストがサーバーに意図した影響を与えない場合を指します。GET、HEAD、OPTIONS、TRACEメソッドは安全であると定義されています。つまり、安全なメソッドは読み取り専用です。安全なメソッドであっても、リクエスト情報をログファイルに追加したり、広告アカウントに課金したりするなど、クライアントには見えない副作用が生じる可能性があります。
一方、POST、PUT、DELETE、CONNECT、PATCHメソッドは安全ではありません。これらのメソッドは、サーバーの状態を変更したり、メールを送信するなどの影響を与える可能性があります。そのため、これらのメソッドは、準拠しているWebロボットやWebクローラーでは通常使用されません。準拠していない一部のメソッドは、コンテキストや結果を考慮せずにリクエストを送信する傾向があります。
GETリクエストの安全性は規定されているものの、実際にはサーバーによる処理は技術的にまったく制限されていません。不注意または故意に不規則なプログラミングを行うと、GETリクエストによってサーバー上で重大な変更が生じる可能性があります。Webキャッシュ、検索エンジン、その他の自動化エージェントがサーバー上で意図しない変更を行った場合に問題が発生する可能性があるため、これは推奨されません。たとえば、ウェブサイトはhttps://example.com/article/1234/deleteなどのURLを介してリソースの削除を許可している場合があります。このURLを任意に取得した場合、GETを使用しても記事が削除されるだけです。[ 37 ]適切にコーディングされたウェブサイトでは、このアクションにはDELETEまたはPOSTメソッドが必要ですが、悪意のないボットはこれを行いません。
実際に発生した例としては、短命に終わったGoogle Web Acceleratorベータ版が挙げられます。このベータ版は、ユーザーが閲覧しているページ上の任意のURLをプリフェッチし、大量のレコードを自動的に変更または削除するものでした。このベータ版は、広範な批判を受け、最初のリリースからわずか数週間で停止されました。[ 38 ] [ 37 ]
あるリクエスト メソッドがべき等であるとは、そのメソッドによる複数の同一リクエストが、単一のリクエストと同じ結果をもたらす場合です。PUT メソッドと DELETE メソッド、および安全なメソッドはべき等であると定義されています。安全なメソッドはサーバーにまったく影響を与えないことを意図しているため、自明にべき等です。一方、PUT メソッドと DELETE メソッドは、連続する同一リクエストが無視されるためべき等です。たとえば、Web サイトは、ユーザーの記録された電子メール アドレスを変更するために PUT エンドポイントを設定することがあります。このエンドポイントが正しく構成されていれば、ユーザーの電子メール アドレスを既に記録されている同じ電子メール アドレスに変更することを要求するリクエスト (成功したリクエストの後に続く重複したリクエストなど) は効果がありません。同様に、特定のユーザーを削除するリクエストは、そのユーザーが既に削除されている場合は効果がありません。
対照的に、POST、CONNECT、および PATCH メソッドは必ずしもべき等ではないため、同一の POST 要求を複数回送信すると、サーバーの状態がさらに変更されたり、複数の電子メールが送信されるなどの他の影響が生じたりする可能性があります。 これは望ましい効果である場合もありますが、誤って発生する場合もあります。たとえば、最初のクリックが処理中であるという明確なフィードバックがない場合、ユーザーはボタンを再度クリックして、誤って複数の POST 要求を送信してしまう可能性があります。Webブラウザーは、ページの再読み込みによって POST 要求が再送信される可能性がある場合にユーザーに警告するアラート ダイアログ ボックスを表示することがありますが、POST 要求を複数回送信してはならない場合の処理は、通常、Web アプリケーション側で行います。
メソッドがべき等であるかどうかは、プロトコルやウェブサーバーによって強制されるわけではないことに注意してください。例えば、データベースへの挿入など、べき等ではないアクションがGETリクエストやその他のリクエストによってトリガーされるようなウェブアプリケーションを作成することは可能です。しかし、推奨事項に反してこれを行うと、ユーザーエージェントが同じリクエストを繰り返しても安全ではないにもかかわらず、安全であると想定してしまうなど、望ましくない結果を招く可能性があります。
リクエストメソッドは、そのメソッドを使用したリクエストへのレスポンスが将来再利用できるように保存される場合、キャッシュ可能です。GET、HEAD、POSTメソッドはキャッシュ可能と定義されています。
対照的に、PUT、DELETE、CONNECT、OPTIONS、TRACE、および PATCH メソッドはキャッシュできません。
レスポンスはサーバーからクライアントに送信されます。レスポンスの開始行は、プロトコルバージョン、ステータスコード、およびオプションで理由フレーズで構成され、各フィールドは1つのスペース文字で区切られます。[ 4 ]:§2.1 以下のレスポンス開始行は、プロトコルバージョンHTTP/1.1、ステータスコード400、および理由フレーズを指定しますBad Request。
HTTP/1.1 400 不正なリクエスト
レスポンスヘッダーフィールドは、サーバーがステータスライン以外の追加情報を渡すことを可能にし、レスポンス修飾子として機能します。レスポンスヘッダーフィールドは、サーバーに関する情報、または対象リソースや関連リソースへのさらなるアクセスに関する情報を提供します。各レスポンスヘッダーフィールドは定義された意味を持ち、リクエストメソッドやレスポンスステータスコードのセマンティクスによってさらに詳細化されます。
ステータスコードは、3桁の10進整数値で、サーバーがクライアントのリクエストを満たすための処理方法を表します。通常、クライアントは主にステータスコード、次にレスポンスヘッダーフィールドに基づいてレスポンスを処理します。クライアントはサーバーが報告するすべてのステータスコードを理解できるとは限りませんが、最初の桁で示されるクラスを理解し、認識できないコードをそのクラスのx00コードと同等に扱う必要があります。クラスは次のとおりです。
標準的な理由フレーズは推奨事項に過ぎません。ウェブサーバーはローカライズされた同等のフレーズを使用することが許可されています。ステータスコードが問題を示している場合、ユーザーエージェントは問題の性質に関する詳細情報を提供するために、理由フレーズをユーザーに表示することがあります。標準では、ユーザーエージェントが理由フレーズを解釈することを許可していますが、標準ではステータスコードは機械可読であり、理由フレーズは人間が読めるものであると明示的に規定されているため、これは賢明ではない可能性があります。
以下は、www.example.comのポート80にあるサーバーに対するHTTP/1.1のリクエスト・レスポンス・トランザクションを示しています。HTTP/1.0では、いくつかのヘッダーが欠落していることを除いて同じメッセージが使用されます。HTTP/2とHTTP/3では、同じリクエスト・レスポンス・メカニズムが使用されますが、HTTPヘッダーの表現が異なります。
以下はボディのないリクエストです。開始行、6つのヘッダーフィールド、そして1つの空行で構成され、各フィールドはキャリッジリターンとラインフィードのシーケンスで終端されています。ヘッダーフィールドは、単一のIPアドレスを共有する複数のDNSHost名を区別し、名前ベースの仮想ホスティングを可能にします。HTTP/1.0ではオプションですが、HTTP/1.1では必須です。
GET / HTTP / 1.1ホスト: www.example.comユーザーエージェント: Mozilla/5.0 Accept : text/html、application/xhtml+xml、application/xml;q=0.9、image/avif、image/webp、*/*;q=0.8 Accept-Language : en-GB、en;q=0.5 Accept-Encoding : gzip、deflate、br接続: keep-alive上記の表現では(このWikiの制限により)明確ではありませんが、末尾の空行によって2つの改行シーケンスが終了します。上記の短縮版を文字列として表現すると、<CRLF>改行シーケンスを表す次のようになりますGET / HTTP/1.1<CRLF>Host: www.example.com<CRLF><CRLF>。
以下のレスポンスでは、ETag(エンティティタグ)ヘッダーフィールドは、要求されたリソースのキャッシュバージョンがサーバー上のリソースの現在のバージョンと同一かどうかを判定するために使用されます。ヘッダーフィールドは、HTTPメッセージによって伝送されるデータのインターネットメディアタイプをContent-Type指定し、その長さをバイト単位で示します。HTTP/1.1ウェブサーバーは、バイト範囲のリソースに対するリクエストに応答する機能を を含めることで公開しています。これは、クライアントがサーバーから送信されたリソースの特定の部分[ 39 ]のみを必要とする場合に便利です。これはバイトサービングと呼ばれます。 が送信されると、ウェブサーバーはこのレスポンスの転送終了後すぐにTCP接続を閉じることを意味します。 [ 4 ] : §9.1 Content-LengthAccept-Ranges: bytesConnection: close
ヘッダーフィールドのほとんどはオプションですが、一部は必須です。Content-Lengthレスポンスボディにヘッダーがない場合、HTTP/1.0ではエラーとみなされますが、HTTP/1.1ではヘッダーTransfer-Encoding: chunkedが存在する場合でもエラーとはみなされない場合があります。チャンク転送エンコーディングでは、コンテンツの終了を示すためにチャンクサイズ0を使用します。HTTP/1.0の古い実装の中には、レスポンス開始時にボディの長さが不明な場合にヘッダーを省略する実装がありContent-Length、その結果、サーバーがソケットを閉じるまでクライアントへのデータ転送が継続されていました。
Content-Encoding: gzip本文がgzipアルゴリズムに従って圧縮されていることをクライアントに通知します。
HTTP / 1.1 200 OK日付: 2005年5月23日(月) 22:38:34 GMTコンテンツタイプ: text/html; 文字セット=UTF-8コンテンツ長: 155最終更新日: 2003年1月8日(水) 23:11:55 GMTサーバー: Apache/1.3.3.7 (Unix) (Red-Hat/Linux) ETag : "3f80f-1b6-3e1cb03b" Accept-Ranges :バイト接続: close< html > < head > < title >サンプルページ</ title > </ head > < body > < p > Hello World、これは非常にシンプルな HTML ドキュメントです。</ p > </ body > </ html >
ティム・バーナーズ=リーと欧州原子核研究機構(CERN)の彼のチームは、HTTPのほか、HTMLやウェブサーバーとウェブブラウザと呼ばれるクライアントユーザーインターフェースの関連技術を発明したとされています。バーナーズ=リーは、彼のもう一つのアイデアである「WorldWideWeb」プロジェクトの普及を促進するためにHTTPを設計しました。このプロジェクトは1989年に初めて提案され、現在はワールドワイドウェブとして知られています。HTTPの開発は1989年に開始され、最初のHTTPバージョンである0.9を使用したクライアントとサーバーの動作を記述した簡単な文書にまとめられました。[ 40 ]このバージョンはその後開発が進められ、最終的に公開バージョン1.0となりました。[ 41 ]初期のHTTP Request for Comments(RFC)文書の開発は、数年後にインターネット技術タスクフォース(IETF)とワールドワイドウェブコンソーシアム(W3C)の共同作業として開始され、その後作業はIETFに移管されました。
最初のウェブサーバーは1990年に稼働しました。[ 42 ] [ 43 ]使用されたプロトコルは、サーバーからページを要求するGETという1つのメソッドのみでした。[ 44 ]サーバーからの応答は常にHTMLページでした。[ 40 ]
1991年に初めて文書化されたHTTPの公式バージョンは、700語未満のプレーンドキュメントとして書かれ、このバージョンはHTTP/0.9と名付けられました。このバージョンはGETメソッドのみをサポートし、クライアントはサーバーからHTMLドキュメントを取得することしかできず、他のファイル形式や情報のアップロードはサポートしていませんでした。[ 40 ]
1992年以降、基本プロトコルの次期フルバージョンに向けた進化を規定する新しい文書が執筆されました。この文書は、バージョン0.9のシンプルなリクエストメソッドと、クライアントのHTTPバージョンを含む完全なGETリクエストの両方をサポートしていました。これは、HTTP/1.0の最終版に先立って作成された、数多くの非公式なHTTP/1.0ドラフトの最初のものでした。[ 41 ]
HTTPプロトコルの新機能が必要であり、それらを公式RFC文書として完全に文書化する必要があると決定した後、1995年初頭に、拡張操作、拡張ネゴシエーション、より豊富なメタ情報、追加のメソッドとヘッダーフィールドを追加することでより効率的になったセキュリティプロトコルとの連携により、プロトコルを標準化および拡張することを目的として、HTTPワーキンググループ(HTTP WG、Dave Raggettが率いる)が結成されました。[ 45 ] [ 46 ]
HTTP WGは1995年中にプロトコルの新しいバージョンをHTTP/1.0とHTTP/1.1として改訂し公開することを計画していましたが、多くの改訂があったため、そのタイムラインは1年以上続きました。[ 47 ]
HTTP WG は、パフォーマンス、低遅延応答などに関する以前のバージョンで残っていた問題をすべて解決する HTTP-NG (HTTP Next Generation) と呼ばれる HTTP の遠い将来のバージョンを指定することも計画していましたが、この作業は数年後に開始され、完了することはありませんでした。
1996年5月、RFC 1945 [ 3 ]は、多くのウェブブラウザやウェブサーバーで既に使用されていたHTTP/1.0の事前標準ドラフトとして過去4年間使用されていたものの最終的なHTTP/1.0改訂版として公開されました。
1996年初頭、開発者たちは、次期HTTP/1.1仕様の草案を使用して、HTTP/1.0プロトコルの非公式な拡張機能(キープアライブ接続など)を自社製品に組み込み始めました。[ 19 ]
1996年初頭から、主要なウェブブラウザとウェブサーバ開発者も、標準前のHTTP/1.1ドラフト仕様で規定された新機能の実装を開始しました。エンドユーザーによるブラウザとサーバの新バージョンの導入は急速に進みました。1996年3月、あるウェブホスティング会社は、インターネットで使用されているブラウザの40%以上が仮想ホスティングを可能にするために新しいHTTP/1.1ヘッダー「Host」を使用しており、1996年6月までに、自社のサーバにアクセスするブラウザの65%が標準前のHTTP/1.1に準拠していたと報告しました。[ 48 ]
1997年1月にRFC 2068 [ 49 ]がHTTP/1.1仕様として正式にリリースされました。
1999年6月に、以前の(廃止された)HTTP/1.1仕様に基づくすべての改良と更新を含む RFC 2616 [ 33 ]がリリースされました。
1995年に以前のHTTPワーキンググループの計画を再開し、1997年にHTTP-NGワーキンググループが結成されました。このグループは、HTTP-NG(HTTP New Generation)と呼ばれる新しいHTTPプロトコルを開発するために設立されました。単一のTCP/IP接続内でHTTPトランザクションを多重化する新しいプロトコルに関するいくつかの提案/草案が作成されましたが、1999年にグループは活動を中止し、技術的な問題をIETFに委ねました。[ 50 ]
2007年にIETF HTTPワーキンググループ(HTTP WG bisまたはHTTPbis)が再開され、第一に以前のHTTP/1.1仕様を改訂・明確化し、第二に将来のHTTP/2仕様(httpbisと命名)を策定・改良することとなった。[ 51 ] [ 52 ]
2009年、Googleはブラウザとサーバー間のウェブトラフィックを高速化するために開発したバイナリプロトコル、SPDYを発表しました。多くのテストにおいて、SPDYの使用はHTTP/1.1よりも確かに高速でした。SPDYはGoogleのChromiumに統合され、その後、他の主要なウェブブラウザにも統合されました。[ 53 ]単一のTCP接続上でHTTPストリームを多重化するアイデアの一部は、W3C HTTP-NGワーキンググループの成果を含む、様々な情報源から引用されました。
2012年、HTTPワーキンググループ(HTTPbis)は新しいプロトコルの必要性を発表しました。当初はSPDY [ 54 ] [ 55 ]の側面を検討し、最終的に新しいプロトコルをSPDYから派生させることを決定しました[ 56 ] 。 2015年5月、HTTP/2がRFC 7540 [ 57 ]として公開されました。このプロトコルは、既にSPDYをサポートしていたウェブブラウザでは急速に採用されましたが、ウェブサーバーでは徐々に採用されました。
2014年6月、HTTPワーキンググループはRFC 2616を廃止する6部構成のHTTP/1.1仕様の更新版をリリースした[ 33 ]。
2014年に、HTTP/0.9はHTTP/1.1以降のバージョンをサポートするサーバーでは非推奨となりました。[ 58 ]:§付録A
HTTP/0.9 はリクエスト内のヘッダーフィールドをサポートしていなかったため、名前ベースの仮想ホスト(Host ヘッダーフィールドの検査によるリソースの選択)をサポートするメカニズムが存在しません。名前 ベースの仮想ホストを実装するサーバーは、HTTP/0.9 のサポートを無効にする必要があります。HTTP/0.9 のように見えるリクエストのほとんどは、実際にはクライアントがリクエストターゲットを適切にエンコードできなかったために生成された、不適切に構成された HTTP/1.x リクエストです。
2016年以降、多くのプロダクトマネージャーやユーザーエージェント(ブラウザなど)およびウェブサーバーの開発者は、主に以下の理由から、HTTP/0.9プロトコルのサポートを段階的に廃止し、廃止する計画を立て始めています。[ 64 ]
2022年現在、HTTP/0.9のサポートは公式には完全に廃止されておらず、多くのウェブサーバーやブラウザでは、通常は無効化されているものの、サーバー応答のみに利用されています。HTTP/0.9の廃止にどれくらいの時間がかかるかは不明です。
2020年にHTTP/3の最初のドラフトが公開され、主要なウェブブラウザやウェブサーバーが採用を開始しました。2022年6月6日、IETFはHTTP/3をRFC 9114として標準化しました[ 65 ]。
2022 年 6 月に、以前のドキュメントの多くを非推奨とし、いくつかの小さな変更を導入し、HTTP セマンティクスの説明を別のドキュメントにリファクタリングする RFC ドキュメントが公開されました。
リソースを更新するアクションに GET を使用することです。[...] この問題は、2005 年に Google Web Accelerator がリリースされたときに Rails の注目を集めました。