インターネット技術タスクフォース (IETF) R. Fielding, 編集者
コメント募集: 9110 Adobe
廃止対象: 2818, 7230, 7231, 7232, 7233, 7235, 7538, 7615, 7694 M. Nottingham, 編集者
STD: 97 Fastly
更新対象: 3864 J. Reschke, 編集者
分類: 標準化過程 greenbytes
ISSN: 2070-1721 2022年 6月

HTTP セマンティクス


概要

ハイパーテキスト転送プロトコル (HTTP) は、ステートレスなアプリケーションレベルのプロトコルであり、 分散型の協調的なハイパーテキスト情報システムを対象とする。本文書で説明するのは、 HTTP の全体的なアーキテクチャであり、共通の用語を確立し、定義する側面は、 すべてのバージョンで共有されるプロトコルの側面である。この定義に含まれるのは、中核となるプロトコル要素、 拡張機構、および "http" と "https" の統一資源識別子 (URI) スキームである。

本文書は RFC 3864 を更新し、廃止対象とするのは RFC 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, および 7230 の一部である。

このメモの位置付け

これはインターネット標準化過程の文書である。

本文書はインターネット技術タスクフォース (IETF) の成果物である。本文書が示すのは、 IETF コミュニティの合意である。公開レビューを受けており、承認を得ている。 公開の承認元はインターネット技術運営グループ (IESG) である。さらに詳しい情報については、 インターネット標準に関する掲載箇所が RFC 7841 の第 2 節である。

本文書の現在の状況、正誤表、および送信方法に関する情報は、 本文書へのフィードバックの方法も含め、次から入手できる https://www.rfc-editor.org/info/rfc9110。

Copyright Notice

Copyright (c) 2022 IETF Trust and the persons identified as the document authors. All rights reserved.

This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License.

This document may contain material from IETF Documents or IETF Contributions published or made publicly available before November 10, 2008. The person(s) controlling the copyright in some of this material may not have granted the IETF Trust the right to allow modifications of such material outside the IETF Standards Process. Without obtaining an adequate license from the person(s) controlling the copyright in such materials, this document may not be modified outside the IETF Standards Process, and derivative works of it may not be created outside the IETF Standards Process, except to format it for publication as an RFC or to translate it into languages other than English.

1. はじめに

1.1. 目的

ハイパーテキスト転送プロトコル (HTTP) は、ステートレスなアプリケーションレベルの、 汎用インターフェイス、拡張可能なセマンティクス、および 自己記述的なメッセージを共有し、ネットワークベースのハイパーテキスト 情報システムとの柔軟な対話を可能にするリクエスト/レスポンスプロトコルのファミリーである。

HTTP は、提供されるリソースの種類に依存しない統一されたインターフェイスを クライアントに提示することで、サービスがどのように実装されているかの詳細を隠す。同様に、サーバーは 各クライアントの目的を認識する必要はない。リクエストは、特定の種類のクライアントや あらかじめ定められたアプリケーション手順のシーケンスに関連付けるのではなく、個別に 考慮できる。これにより、汎用実装を効果的に使用でき、 多くの異なるコンテキストで対話の複雑さを軽減し、独立した 経時的な発展を可能にする。

HTTP は仲介プロトコルとして使用することも意図して設計されており、プロキシやゲートウェイは HTTP ではない情報システムを、より汎用的なインターフェイスに変換できる。

この柔軟性の結果の一つとして、プロトコルをインターフェイスの背後で 何が発生するかという観点から定義することはできない。その代わり、定義できるのは 通信の構文、受信した通信の意図、および 受信者に期待される振る舞いに限られる。通信を個別に考慮する場合、成功したアクションは サーバーが提供する観測可能なインターフェイスにおける対応する変更として反映される べきである。しかし、複数のクライアントが並行して、場合によっては 相反する目的で動作する可能性があるため、そのような変更が 単一のレスポンスの範囲を超えて観測可能であることを要求することはできない。

1.2. 歴史と発展

HTTP は 1990 年に導入されて以来、World Wide Web の主要な情報転送プロトコルで あり続けている。当初は低遅延リクエストのための単純な仕組みとして始まり、 与えられたパス名によって識別されるハイパーテキスト文書と想定されたものの転送を要求する単一のメソッド (GET) のみを 備えていた。Web の成長に伴い、HTTP はリクエストとレスポンスを メッセージ内に格納し、MIME に似たメディアタイプを使用して任意のデータ形式を転送し、 仲介者を経由してリクエストをルーティングするよう拡張された。これらのプロトコルは最終的に HTTP/0.9 および HTTP/1.0 として定義された ([HTTP/1.0] を参照)。

HTTP/1.1 は、既存のテキストベースのメッセージ構文との互換性を維持しながら プロトコルの機能を洗練し、インターネット全体での相互運用性、 スケーラビリティ、および堅牢性を向上させるよう設計された。これには、固定および動的 (チャンク化) コンテンツの 両方に対する長さベースのデータ区切り、コンテンツネゴシエーションのための一貫した フレームワーク、条件付きリクエストのための不透明なバリデーター、より優れた キャッシュ整合性のためのキャッシュ制御、部分更新のための範囲リクエスト、およびデフォルトの永続 接続が含まれていた。HTTP/1.1 は 1995 年に導入され、1997 年に標準化過程として公開され [RFC2068]、1999 年に改訂され [RFC2616]、さらに 2014 年に再び改訂された ([RFC7230] から [RFC7235] まで)。

HTTP/2 ([HTTP/2]) は、既存の TLS および TCP プロトコル上に多重化セッション層を導入し、 効率的なフィールド圧縮とサーバープッシュを用いて並行 HTTP メッセージを交換できるようにした。 HTTP/3 ([HTTP/3]) は、TCP の代わりに UDP 上の安全な多重化トランスポートとして QUIC を使用することにより、 並行メッセージ間のより高い独立性を提供する。

HTTP の主要な三つのバージョンはいずれも、この文書で定義されるセマンティクスに依存している。それらは それぞれ使用コンテキストに応じて固有の利点と制限を持つため、 相互に廃止してはいない。実装は、それぞれの特定のコンテキストに最も 適切なトランスポートとメッセージ構文を選択することが期待される。

HTTP のこの改訂では、セマンティクス (この文書) とキャッシュの定義 ([CACHING]) を現在の HTTP/1.1 メッセージ 構文 ([HTTP/1.1]) から分離し、各主要プロトコルバージョンが 同じ中核セマンティクスを参照しながら独立して発展できるようにしている。

1.3. 中核 セマンティクス

HTTP は、リソース (3.1節) と対話するための統一されたインターフェイスを、その種類、性質、または 実装にかかわらず、表現 (3.2節) を操作または転送するメッセージを送信することによって提供する。

各メッセージはリクエストまたはレスポンスのいずれかである。クライアントは、その 意図を伝えるリクエストメッセージを構築し、それらのメッセージを識別されたオリジンサーバーへルーティングする。 サーバーはリクエストを待ち受け、受信した各メッセージを解析し、メッセージの セマンティクスを識別されたターゲットリソースとの関係で解釈し、そのリクエストに 一つ以上のレスポンスメッセージで応答する。クライアントは受信したレスポンスを調べて、その 意図が実行されたかを確認し、ステータスコードと 受信したコンテンツに基づいて次に何をするかを決定する。

HTTP セマンティクスには、各リクエストメソッド (9節) によって定義される意図、それらのセマンティクスに対する リクエストヘッダーフィールドで記述される可能性のある拡張、レスポンスを記述するステータスコード (15節)、およびその他の制御データ とレスポンスフィールドで提供される可能性のあるリソースメタデータが含まれる。

セマンティクスには、受信者がコンテンツをどのように解釈することを 意図されているかを記述する表現メタデータ、コンテンツ選択に影響を及ぼす可能性のあるリクエストヘッダーフィールド、 および総称して コンテンツネゴシエーション と呼ばれる さまざまな選択アルゴリズムも含まれる (12節)。

1.4. この文書によって廃止される 仕様

表 1
タイトル 参照 参照先
TLS 上の HTTP [RFC2818] B.1
HTTP/1.1 メッセージ構文とルーティング [*] [RFC7230] B.2
HTTP/1.1 セマンティクスとコンテンツ [RFC7231] B.3
HTTP/1.1 条件付きリクエスト [RFC7232] B.4
HTTP/1.1 範囲リクエスト [RFC7233] B.5
HTTP/1.1 認証 [RFC7235] B.6
HTTP ステータスコード 308 (恒久的リダイレクト) [RFC7538] B.7
HTTP Authentication-Info および Proxy-Authentication-Info レスポンスヘッダーフィールド [RFC7615] B.8
HTTP クライアント起動型 Content-Encoding [RFC7694] B.9

[*] この文書は RFC 7230 のうち、HTTP/1.1 メッセージ構文および 接続管理から独立している部分のみを廃止する。RFC 7230 の残りの部分は "HTTP/1.1" [HTTP/1.1] によって廃止される。

2. 適合性

2.1. 構文 表記

この仕様では、[RFC5234] の Augmented Backus-Naur Form (ABNF) 表記を使用し、 [RFC7405] で定義される文字列の大文字小文字区別の表記によって拡張している。

また、5.6.1節 で定義されるリスト拡張も使用し、これによって "#" 演算子を使用してコンマ区切りリストを簡潔に定義できる ("\*" 演算子が反復を示す方法と同様である)。付録 A には、すべてのリスト 演算子を標準 ABNF 表記に展開した統合文法を示す。

慣例として、"obs-" という接頭辞を持つ ABNF 規則名は、歴史的な理由から 存在する廃止された文法規則を表す。

以下のコア規則は、付録 B.1 の [RFC5234] で定義されているとおり、参照によって含まれる: ALPHA (文字)、CR (キャリッジリターン)、CRLF (CR LF)、CTL (制御文字)、DIGIT (10 進 0-9)、DQUOTE (二重引用符)、HEXDIG (16 進 0-9/A-F/a-f)、HTAB (水平タブ)、LF (改行)、OCTET (任意の 8 ビットデータ列)、SP (空白)、および VCHAR (任意の可視 US-ASCII 文字)。

5.6節 では、フィールド値のためのいくつかの汎用構文コンポーネントを定義する。

この仕様では、"character"、"character encoding scheme"、"charset"、 および "protocol element" という用語を、[RFC6365] で定義される意味で使用する。

2.2. 要件の表記

この文書におけるキーワード "しなければならない"、"してはならない"、"必須である"、"しなければならない"、"してはならない"、"することが望ましい"、"しないことが望ましい"、"推奨される"、"推奨されない"、"してもよい"、および "任意である" は、 BCP 14 [RFC2119] [RFC8174] に記載されるとおり、ここに示すようにすべて大文字で現れる場合に限って解釈される。

この仕様は、HTTP 通信における参加者の役割に応じて適合基準を定める。 したがって、要件は送信者、受信者、クライアント、 サーバー、ユーザーエージェント、仲介者、オリジンサーバー、プロキシ、ゲートウェイ、またはキャッシュに対して、 その要件によってどの振る舞いが制約されるかに応じて課される。さらに、 単一の通信の範囲を超えて適用される場合には、実装、リソース所有者、およびプロトコル要素の 登録にも要件が課される。

要件が、受信した要素を 下流へ転送する実装ではなく、そのプロトコル要素を作成する実装にのみ適用される場合には、"send" の代わりに "generate" という動詞を使用する。

実装は、HTTP において担当する役割に関連付けられたすべての要件に 準拠している場合、適合しているとみなされる。

送信者は、対応する ABNF 規則によって定義された 文法に一致しないプロトコル要素を生成してはならない。特定のメッセージ内で、送信者は 他の役割の参加者のみが生成することを許可されているプロトコル要素または構文上の選択肢を 生成してはならない (すなわち、そのメッセージについて送信者が 持たない役割である)。

HTTP への適合には、使用中のプロトコルバージョン固有のメッセージ構文への適合と、 送信されるプロトコル要素のセマンティクスへの適合の両方が含まれる。たとえば、 HTTP/1.1 に適合していると主張しながら、 HTTP/1.1 の受信者に要求される機能を認識できないクライアントは、その主張に従って レスポンスを調整するサーバーとの相互運用に失敗する。コンテンツネゴシエーションやユーザーが選択した拡張など、 ユーザーの選択を反映する機能は、 プロトコルストリームを超えてアプリケーションの振る舞いに影響を与える可能性がある。ユーザーの選択を 不正確に反映するプロトコル要素を送信すると、ユーザーを混乱させ、選択を妨げる。

実装がセマンティック適合性を満たさない場合、その実装からの メッセージの受信者は、最終的にそれに応じて振る舞いを調整するための回避策を開発する。受信者は、 その回避策が問題のある実装だけに限定されている場合、このプロトコルへの適合を維持したまま そのような回避策を使用してもよい。たとえば、 サーバーは既知の バグや不適切に選択されたデフォルトに対して自身の振る舞いを調整するために、User-Agent フィールド値の一部を調べることが多く、ユーザーエージェントは Server フィールド値を調べることが多い。

2.3. 長さの要件

受信者は、受信したプロトコル要素を防御的に解析することが望ましく、 その要素が ABNF 文法に適合し、 妥当なバッファーサイズに収まるという期待は最小限にとどめるべきである。

HTTP の多くのプロトコル要素には、適切となり得る長さが 配備コンテキストや実装の目的によって大きく異なるため、 特定の長さ制限がない。したがって、送信者と 受信者間の相互運用性は、各プロトコル要素について何が妥当な長さであるかに関する共通の期待に 依存する。さらに、一部のプロトコル要素について 一般に妥当と理解される長さは、過去 30 年間の HTTP 利用の過程で変化しており、 今後も変化し続けることが予想される。

最低限、受信者は、 他のメッセージで同じプロトコル要素について自ら生成する値と少なくとも同じ長さの プロトコル要素を解析および処理できなければならない。たとえば、自身のリソースに対して 非常に長い URI 参照を公開するオリジンサーバーは、その同じ参照がターゲット URI として受信された場合に 解析および処理できる必要がある。

受信した多くのプロトコル要素は、その要素を識別して 下流へ転送するために必要な範囲だけ解析される。たとえば、仲介者は受信した フィールドをフィールド名とフィールド値の構成要素に解析しても、その後、 フィールド値内部をさらに解析せずにそのフィールドを転送する場合がある。

2.4. エラー処理

受信者は、受信したプロトコル要素を、この仕様によってその要素に対して定義された セマンティクス (この仕様の拡張を含む) に従って解釈しなければならない。ただし、 受信者が (経験または設定を通じて) 送信者がそれらのセマンティクスによって暗示されるものを誤って実装していると判断した場合を除く。たとえば、 オリジンサーバーは、受信した Accept-Encoding ヘッダーフィールドの内容を、 User-Agent ヘッダーフィールドを調査した結果、 特定のコンテンツコーディングを受信すると失敗することが知られている特定の実装バージョンであることが 示された場合、無視することがある。

特に記載がない限り、受信者は、 無効な構造から使用可能なプロトコル要素を復元しようとしてもよい。HTTP は、異なる プロトコルの用途には異なるエラー処理戦略が必要であるため、セキュリティに直接影響する場合を除き、 特定のエラー処理機構を定義しない。たとえば、 Web ブラウザーは、Location ヘッダーフィールドが ABNF に従って解析できない レスポンスから透過的に復元することを望む場合がある一方、システム制御クライアントは、あらゆる形式のエラー 復元を危険とみなす場合がある。

一部のリクエストは、基盤となる 接続障害が発生した場合、9.2.2節 で説明されるように、クライアントによって自動的に再試行できる。

2.5. プロトコルバージョン

HTTP のバージョン番号は、"." (ピリオドまたは 小数点) で区切られた 2 桁の 10 進数字で構成される。最初の数字 (メジャーバージョン) はメッセージ構文を示し、 2 番目の数字 (マイナーバージョン) は、そのメジャー バージョン内で送信者が適合している (将来の通信で理解できる) 最も高いマイナーバージョンを示す。

HTTP の中核セマンティクスはプロトコルバージョン間で変化しないが、その「通信路上」での 表現は変化し得るため、通信路形式に互換性のない変更が 加えられると HTTP バージョン番号も変化する。さらに、HTTP は、 定義済みの拡張ポイント (16節) を使用することで、バージョンを変更せずに 後方互換性のある段階的な変更をプロトコルに加えることを許可している。

プロトコルバージョン全体は、そのバージョンに対応する仕様で 定められた要件一式に対する送信者の適合性を示す。たとえば、 バージョン "HTTP/1.1" は、この文書、"HTTP Caching" [CACHING]、および "HTTP/1.1" [HTTP/1.1] の仕様を組み合わせたものによって定義される。

HTTP のメジャーバージョン番号は、互換性のないメッセージ構文が 導入されたときに増加する。マイナー番号は、プロトコルに加えられた変更が メッセージセマンティクスを追加する効果を持つ場合、または 送信者の追加機能を暗示する場合に増加する。

送信者がプロトコルの後方互換性のあるサブセットのみを 使用している場合でも、マイナーバージョンは送信者の通信能力を通知し、 それによって受信者は、より高度な機能をレスポンス (サーバーの場合) または 将来のリクエスト (クライアントの場合) で使用できることを知る。

HTTP のメジャーバージョンがマイナーバージョンを一つも定義していない場合、 マイナーバージョン "0" が暗黙に想定される。マイナーバージョン識別子を必要とする 要素内でそのプロトコルを参照するときには "0" が使用される。

3. 用語と 中核概念

HTTP は World Wide Web (WWW) アーキテクチャのために作成され、時間の経過とともに 世界規模のハイパーテキストシステムに必要なスケーラビリティを支援するよう発展してきた。そのアーキテクチャの多くは、 HTTP を定義するために使用される用語に反映されている。

3.1. リソース

HTTP リクエストのターゲットは リソース と呼ばれる。HTTP は リソースの性質を制限せず、リソースと対話するために使用できる インターフェイスを定義するだけである。ほとんどのリソースは、4節 で 説明されるように、Uniform Resource Identifier (URI) によって識別される。

HTTP の設計目標の一つは、リソースの識別をリクエストセマンティクスから分離することであり、 これは、リクエストセマンティクスをリクエストメソッド (9節) および少数のリクエスト変更用ヘッダー フィールドに持たせることで可能になる。リソースは、リクエストをその メソッドのセマンティクスと矛盾する方法で扱うことはできない。たとえば、リソースの URI が 安全ではないセマンティクスを暗示していたとしても、クライアントは、安全なメソッドを持つリクエストを処理するときに リソースが安全でないアクションを避けることを期待できる (9.2.1節 を参照)。

HTTP は、ターゲットリソース (7.1節) およびリソース間の関係を示すため、 Uniform Resource Identifier (URI) 標準 [URI] に依存する。

3.2. 表現

表現とは、特定のリソースの過去、現在、 または望まれる状態を、プロトコルを介して容易に通信できる 形式で反映することを意図した情報である。表現は、一組の表現メタデータと、 潜在的に上限のない表現データのストリーム (8節) から構成される。

HTTP は、リソース自体を 転送するのではなく、転送可能なリソース状態の表現に関して通信を定義することで、その統一インターフェイスの背後で「情報隠蔽」を可能にする。 これにより、URI によって識別されるリソースは、 "the current weather in Laguna Beach" のような時間依存関数を含め、任意のものになり得る一方、 メッセージが生成された時点でそのリソースを表現する情報を提供できる [REST]。

統一インターフェイスは窓に似ており、その向こう側にいる独立した主体への メッセージの通信を通じてのみ、あるものを観察し、それに作用できる。 通信において、そのものの現在または 望まれる状態を表現する ("代わりを務める") ためには、共有された抽象化が必要である。表現がハイパーテキストである場合、 リソース状態の表現と、 受信者の将来の対話を導くのに役立つ処理命令の両方を提供できる。

ターゲットリソースには、それぞれリソースの 現在の状態を反映することを意図した複数の表現が提供されているか、またはそれらを 生成できる場合がある。通常、コンテンツネゴシエーション (12節) に基づくアルゴリズムを使用して、それらの 表現のうち特定のリクエストに最も適用可能なものを一つ選択する。この 選択された 表現は、条件付き リクエスト (13節) の評価、および GET (9.3.1節) に対する 200 (OK)、206 (Partial Content)、および 304 (Not Modified) レスポンスのコンテンツ構築のためのデータとメタデータを提供する。

3.3. 接続、クライアント、およびサーバー

HTTP は、信頼性のあるトランスポート層または セッション層の 接続 上で動作するクライアント/サーバープロトコルである。

HTTP クライアントは、一つ以上の HTTP リクエストを 送信する目的でサーバーへの接続を確立するプログラムである。HTTP サーバーは、 HTTP レスポンスを送信して HTTP リクエストを処理するために接続を受け入れるプログラムである。

クライアントおよびサーバーという用語は、これらのプログラムが 特定の接続について実行する役割のみを指す。同じプログラムが、ある接続ではクライアントとして、 別の接続ではサーバーとして動作する場合がある。

HTTP はステートレスなプロトコルとして定義されており、これは各リクエストメッセージのセマンティクスを 個別に理解でき、接続と その上のメッセージとの関係が、それらのメッセージの解釈に影響を与えないことを意味する。たとえば、 CONNECT リクエスト (9.3.6節 ) または Upgrade ヘッダーフィールドを持つリクエスト (7.8節) は、 接続上の最初のメッセージだけでなく、いつでも発生し得る。多くの実装は、 プロキシされた接続を再利用したり、複数のサーバー間でリクエストを動的に 負荷分散したりするために、HTTP のステートレス設計に依存している。

したがって、サーバーは、 接続が安全であり、かつ そのエージェント専用でない限り、同じ接続上の二つのリクエストが同じユーザーエージェントからのものであると仮定してはならない。一部の非標準 HTTP 拡張 (例: [RFC4559]) はこの要件に違反することが知られており、その結果、セキュリティおよび相互運用性の 問題を引き起こしている。

3.4. メッセージ

HTTP は、接続を介して メッセージを交換する ステートレスなリクエスト/レスポンスプロトコルである。送信者および 受信者という用語は、それぞれ特定のメッセージを送信または受信する任意の実装を指す。

クライアントは、メソッド (9節) とリクエストターゲット (7.1節) を持つ リクエストメッセージの形式で、 サーバーにリクエストを送信する。リクエストには、リクエスト修飾子、クライアント情報、 および表現メタデータのためのヘッダーフィールド (6.3節)、 メソッドに従って処理されることを意図したコンテンツ (6.4節 )、およびコンテンツ送信中に収集された情報を伝達するトレーラーフィールド (6.5節) も含まれる場合がある。

サーバーは、クライアントのリクエストに対して一つ以上の レスポンス メッセージを送信して応答し、それぞれにステータスコード (15節) が含まれる。レスポンスには、 サーバー情報、リソースメタデータ、および表現メタデータのためのヘッダーフィールド、ステータスコードに従って 解釈されるコンテンツ、およびコンテンツ送信中に収集された情報を伝達する トレーラーフィールドも含まれる場合がある。

3.5. ユーザー エージェント

ユーザーエージェントという用語は、リクエストを開始する さまざまなクライアントプログラムのいずれかを指す。

ユーザーエージェントの最もよく知られた形式は汎用 Web ブラウザーであるが、それは 実装のごく一部にすぎない。その他の一般的なユーザーエージェントには、スパイダー (Web を巡回するロボット)、コマンドラインツール、掲示板画面、家電製品、 はかり、電球、ファームウェア更新スクリプト、モバイルアプリ、および さまざまな形状やサイズの通信デバイスが含まれる。

ユーザーエージェントであることは、リクエスト時に人間のユーザーが ソフトウェアエージェントと直接対話していることを意味しない。多くの場合、ユーザーエージェントは バックグラウンドで実行され、後で確認するために結果を保存するようインストールまたは 設定されている (または、興味深い可能性やエラーの可能性がある結果の 一部のみを保存する)。たとえば、スパイダーには通常、 開始 URI が与えられ、Web をハイパーテキストグラフとしてクロールする際に特定の振る舞いに従うよう 設定される。

多くのユーザーエージェントは、ユーザーに対して対話的な提案を行ったり、 セキュリティまたはプライバシー上の懸念について十分な警告を提供したりできない、あるいはそうしないことを選択する。この 仕様がユーザーへのエラー報告を要求する少数のケースでは、 そのような報告がエラーコンソールまたはログファイルでのみ確認可能であっても許容される。同様に、 自動化されたアクションを続行する前にユーザーが確認しなければならないという要件は、 事前の設定選択、実行時オプション、または安全でない アクションを単純に避けることによって満たされる場合がある。ユーザーがすでにその選択を行っている場合、 確認は特定のユーザーインターフェイスや通常処理の中断を意味しない。

3.6. オリジンサーバー

オリジンサーバーという用語は、特定のターゲットリソースに対して権威ある レスポンスを生成できるプログラムを指す。

オリジンサーバーの最もよく知られた形式は大規模な公開ウェブサイトである。しかし、ユーザー エージェントをブラウザーと同一視する場合と同様に、すべての オリジンサーバーが同じであると考えるのは誤りである。一般的なオリジンサーバーには、ホームオートメーション装置、 設定可能なネットワークコンポーネント、オフィス機器、自律ロボット、ニュースフィード、 交通カメラ、リアルタイム広告選択システム、およびビデオオンデマンドプラットフォームも含まれる。

ほとんどの HTTP 通信は、URI によって識別される 何らかのリソースの表現に対する取得リクエスト (GET) で構成される。最も単純な場合、これは ユーザーエージェント (UA) とオリジン サーバー (O) の間の単一の双方向接続 (===) を介して実現される。

         リクエスト   >

    UA ======================================= O

                                <   レスポンス

3.7. 仲介者

HTTP では、接続の連鎖を通じてリクエストを満たすために仲介者を使用できる。 HTTP 仲介者には一般的に三つの形式がある: プロキシ、 ゲートウェイ、およびトンネルである。場合によっては、単一の仲介者がオリジンサーバー、 プロキシ、ゲートウェイ、またはトンネルとして動作し、各リクエストの性質に基づいて振る舞いを切り替える場合がある。

         >             >             >             >

    UA =========== A =========== B =========== C =========== O

                <             <             <             <

上の図は、ユーザーエージェントと オリジンサーバーの間に三つの仲介者 (A、B、および C) があることを示している。連鎖全体を通過するリクエストまたはレスポンスメッセージは、 四つの個別の接続を通過する。一部の HTTP 通信オプションは、 最も近い非トンネル隣接ノードとの接続だけ、連鎖の エンドポイントだけ、または連鎖に沿ったすべての接続に適用される場合がある。図は直線的であるが、各 参加者は複数の同時通信に関与している場合がある。たとえば、B は、 A 以外の多数のクライアントからリクエストを受信し、かつ/または A のリクエストを処理しているのと同時に、C 以外のサーバーへリクエストを転送している場合がある。同様に、 後続のリクエストは、多くの場合、 負荷分散のための動的設定に基づいて、異なる接続経路を通じて送信される場合がある。

上流および 下流という用語は、 メッセージフローに関する方向要件を記述するために使用される。すべてのメッセージは上流から 下流へ流れる。受信方向および 送信方向という用語は、 リクエスト経路に関する方向要件を記述するために使用される。受信方向は「 オリジンサーバーに向かう」を意味し、送信方向は「ユーザーエージェントに向かう」を意味する。

プロキシは、通常ローカル設定規則を介してクライアントによって 選択され、ある種類の絶対 URI に対するリクエストを受信し、 HTTP インターフェイスを介した変換によってそれらのリクエストを満たそうとする メッセージ転送エージェントである。"http" URI に対するプロキシリクエストのように 変換が最小限である場合もあれば、まったく異なる アプリケーションレベルプロトコルとの間で変換を必要とするリクエストもある。プロキシは、セキュリティサービス、 注釈サービス、または共有キャッシュのために、組織の HTTP リクエストを共通の仲介者経由にまとめるためによく使用される。一部のプロキシは、 7.7節 で説明されるように、転送中に選択されたメッセージまたはコンテンツへ 変換を適用するよう設計されている。

ゲートウェイ (別名 リバースプロキシ) は、 送信方向の接続ではオリジンサーバーとして動作するが、受信した リクエストを変換して受信方向に別のサーバーへ転送する仲介者である。ゲートウェイは、 レガシーまたは信頼されていない情報サービスをカプセル化したり、アクセラレーターキャッシュによってサーバー 性能を改善したり、複数のマシン間で HTTP サービスの分割または負荷 分散を可能にしたりするためによく使用される。

オリジンサーバーに適用されるすべての HTTP 要件は、ゲートウェイの送信方向の 通信にも適用される。ゲートウェイは、HTTP の私的拡張を含む任意の プロトコルを使用して受信方向のサーバーと通信でき、それらはこの 仕様の範囲外である。ただし、第三者の HTTP サーバーと 相互運用することを望む HTTP-to-HTTP ゲートウェイは、 ゲートウェイの受信方向接続においてユーザーエージェント要件に適合する必要がある。

トンネルは、メッセージを変更することなく二つの 接続間でブラインドリレーとして動作する。いったんアクティブになると、トンネルは HTTP 通信の当事者とはみなされないが、HTTP リクエストによって開始されている場合がある。中継された接続の両端が閉じられると、トンネルは存在しなくなる。 トンネルは、たとえば Transport Layer Security (TLS, [TLS13]) を使用して共有ファイアウォールプロキシを通じた機密通信を確立する場合など、仲介者を通じて仮想接続を延長するために使用される。

上記の仲介者の分類は、HTTP 通信の参加者として動作するものだけを 考慮している。ネットワークプロトコルスタックの より低い層で動作し、メッセージ送信者の認識や 許可なしに HTTP トラフィックをフィルタリングまたはリダイレクトできる仲介者も存在する。ネットワーク仲介者は、 プロトコルレベルでは経路上の攻撃者と区別できず、HTTP セマンティクスへの誤った違反によって セキュリティ上の欠陥や相互運用性の問題を引き起こすことが多い。

たとえば、 インターセプションプロキシ [RFC3040] (一般に 透過プロキシ [RFC1919] とも呼ばれる) は、 クライアントによって選択されないという点で HTTP プロキシと異なる。代わりに、インターセプション プロキシは送信 TCP ポート 80 パケット (場合によっては他の一般的な ポートのトラフィックも) をフィルタリングまたはリダイレクトする。インターセプションプロキシは、公共ネットワークアクセスポイントにおいて、 ローカル以外のインターネット サービスの使用を許可する前にアカウント購読を強制する手段として、また企業ファイアウォール内でネットワーク利用ポリシーを強制するために一般的に見られる。

3.8. キャッシュ

キャッシュは、以前のレスポンスメッセージのローカル保存領域と、 そのメッセージの保存、取得、および削除を制御するサブシステムである。キャッシュは、 将来の同等のリクエストにおけるレスポンス時間とネットワーク帯域幅消費を 削減するため、キャッシュ可能なレスポンスを保存する。任意のクライアントまたはサーバーは キャッシュを使用してもよいが、トンネルとして動作している間はキャッシュを使用できない。

キャッシュの効果として、連鎖上の 参加者の一つがそのリクエストに適用可能なキャッシュ済みレスポンスを持つ場合、リクエスト/レスポンス連鎖が短縮される。 以下は、UA または A によってキャッシュされていないリクエストについて、 B が O (C 経由) から以前に受信したレスポンスのキャッシュ済みコピーを持っている場合に生じる連鎖を示す。

            >             >

        UA =========== A =========== B - - - - - - C - - - - - - O

                   <             <

キャッシュが、後続のリクエストへの応答に使用するために レスポンスメッセージのコピーを保存することを許可されている場合、そのレスポンスは キャッシュ可能である。 レスポンスがキャッシュ可能であっても、特定の リクエストに対してそのキャッシュ済みレスポンスをいつ使用できるかについて、クライアントまたはオリジンサーバーによって追加の制約が 課されている場合がある。キャッシュの振る舞いとキャッシュ可能なレスポンスに関する HTTP 要件は [CACHING] で定義される。

World Wide Web 全体および大規模組織内には、さまざまな キャッシュのアーキテクチャと設定が配備されている。これには、 帯域幅を節約し遅延を低減するためのプロキシキャッシュの国家規模の階層、人気サイトの地域的および世界的な配信を最適化するために ゲートウェイキャッシュを使用するコンテンツ配信ネットワーク、 キャッシュエントリをブロードキャストまたはマルチキャストする協調システム、オフラインまたは高遅延環境で使用するための事前取得済み キャッシュエントリのアーカイブなどが含まれる。

3.9. メッセージ交換の 例

次の例は、URI "http://www.example.com/hello.txt" に対する GET リクエスト (9.3.1節) の典型的な HTTP/1.1 メッセージ交換を示す:

クライアントリクエスト:

GET /hello.txt HTTP/1.1

User-Agent: curl/7.64.1

Host: www.example.com

Accept-Language: en, mi



サーバーレスポンス:

HTTP/1.1 200 OK

Date: Mon, 27 Jul 2009 12:28:53 GMT

Server: Apache

Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT

ETag: "34aa387-d-1568eb00"

Accept-Ranges: bytes

Content-Length: 51

Vary: Accept-Encoding

Content-Type: text/plain



Hello World! My content includes a trailing CRLF.

4. HTTP における識別子

Uniform Resource Identifier (URI) [URI] は、 HTTP 全体でリソースを識別する手段として使用される (3.1節)。

4.1. URI 参照

URI 参照は、リクエストのターゲット指定、リダイレクトの指示、および関係の定義に使用される。

"URI-reference"、"absolute-URI"、"relative-part"、"authority"、"port"、 "host"、"path-abempty"、"segment"、および "query" の定義は URI 汎用構文から採用される。 空ではない path コンポーネントを含むことができるプロトコル要素のために "absolute-path" 規則が 定義される。(この規則は RFC 3986 の path-abempty 規則とはわずかに異なり、 これは空の path を許可する。また、path-absolute 規則とも異なり、こちらは "//" で始まる path を許可しない。) 相対 URI を含むことはできるが fragment コンポーネントは含められないプロトコル要素のために "partial-URI" 規則が定義される。

  URI-reference = <URI-reference, see [URI], Section 4.1>
  absolute-URI  = <absolute-URI, see [URI], Section 4.3>
  relative-part = <relative-part, see [URI], Section 4.2>
  authority     = <authority, see [URI], Section 3.2>
  uri-host      = <host, see [URI], Section 3.2.2>
  port          = <port, see [URI], Section 3.2.3>
  path-abempty  = <path-abempty, see [URI], Section 3.3>
  segment       = <segment, see [URI], Section 3.3>
  query         = <query, see [URI], Section 3.4>

  absolute-path = 1*( "/" segment )
  partial-URI   = relative-part [ "?" query ]

URI 参照を許可する HTTP の各プロトコル要素は、その ABNF 生成規則において、その要素があらゆる形式の参照 (URI-reference) を許可するのか、絶対形式の URI (absolute-URI) のみを許可するのか、path および任意の query コンポーネント (partial-URI) のみを許可するのか、または上記の何らかの組み合わせを許可するのかを示す。特に示されない限り、URI 参照はターゲット URI (7.1節) を基準として解析される。

すべての送信者および受信者は、少なくとも、 プロトコル要素内で長さ 8000 オクテットの URI をサポートすることが 推奨される。これは、 一部の構造および通信路上の表現 (たとえば HTTP/1.1 のリクエスト行) が 場合によっては必然的にこれより大きくなることを意味する点に注意すること。

4.2. HTTP 関連の URI スキーム

IANA は [BCP35] の URI スキームレジストリを https://www.iana.org/assignments/uri-schemes/ で管理している。 リクエストは任意の URI スキームをターゲットにできるが、次のスキームは HTTP サーバーに固有である:

表 2
URI スキーム 説明 節
http ハイパーテキスト転送プロトコル 4.2.1
https 安全なハイパーテキスト転送プロトコル 4.2.2

"http" または "https" URI が存在することは、識別されたオリジンに 接続を待ち受ける HTTP サーバーが常に存在することを意味しない点に注意すること。サーバーが存在するかどうか、また そのサーバーが現在その識別子をリソースに対応付けているかどうかにかかわらず、誰でも URI を作成できる。 登録名および IP アドレスが委任される性質により、 HTTP サーバーが存在するかどうかにかかわらず、連合された名前空間が形成される。

4.2.1. http URI スキーム

"http" URI スキームは、指定されたポートで TCP ([TCP]) 接続を待ち受ける可能性のある HTTP オリジンサーバーによって管理される 階層的な名前空間内で識別子を作成するために、ここで定義される。

  http-URI = "http" "://" authority path-abempty [ "?" query ]

"http" URI のオリジンサーバーは、authority コンポーネントによって識別され、これには host 識別子 ([URI], 3.2.2節) と任意のポート番号 ([URI], 3.2.3節) が含まれる。port サブコンポーネントが空であるか指定されていない場合、TCP ポート 80 ( WWW サービス用に予約されたポート) がデフォルトである。オリジンは、 4.3.2節 で定義されるように、識別されたリソースをターゲットとするリクエストに 権威をもって応答する権利を誰が持つかを決定する。

送信者は、空の host 識別子を持つ "http" URI を生成してはならない。そのような URI 参照を処理する受信者は、それを 無効として拒否しなければならない。

階層的な path コンポーネントと任意の query コンポーネントは、そのオリジンサーバーの 名前空間内のターゲットリソースを識別する。

4.2.2. https URI スキーム

"https" URI スキームは、指定されたポートで TCP 接続を待ち受け、HTTP 通信のために安全化された TLS ([TLS13]) 接続を確立できる可能性のあるオリジンサーバーによって管理される階層的な名前空間内で識別子を作成するために、ここで定義される。この文脈では、 安全化されたとは具体的に、サーバーが識別された authority の代理として動作していることが 認証され、そのサーバーとのすべての HTTP 通信が、クライアントとサーバーの双方に受け入れられる 機密性および完全性の保護を備えていることを意味する。

  https-URI = "https" "://" authority path-abempty [ "?" query ]

"https" URI のオリジンサーバーは、authority コンポーネントによって識別され、これには host 識別子 ([URI], 3.2.2節) と任意のポート番号 ([URI], 3.2.3節) が含まれる。port サブコンポーネントが空であるか指定されていない場合、TCP ポート 443 ( TLS 上の HTTP 用に予約されたポート) がデフォルトである。オリジンは、 4.3.3節 で定義されるように、識別されたリソースをターゲットとするリクエストに 権威をもって応答する権利を誰が持つかを決定する。

送信者は、空の host 識別子を持つ "https" URI を生成してはならない。そのような URI 参照を処理する受信者は、それを 無効として拒否しなければならない。

階層的な path コンポーネントと任意の query コンポーネントは、そのオリジンサーバーの 名前空間内のターゲットリソースを識別する。

クライアントは、"https" リソースに対する HTTP リクエストが通信される前に安全化されていること、およびそれらのリクエストに対する 安全化されたレスポンスのみを受け入れることを保証しなければならない。クライアントとサーバーに受け入れられる暗号 メカニズムの定義は通常ネゴシエートされ、時間とともに変化し得ることに注意すること。

"https" スキームを介して利用可能になるリソースは、 "http" スキームと共有される識別性を持たない。それらは別個の名前空間を持つ異なるオリジンである。しかし、 Cookie プロトコル [COOKIE] のように、同じ host を持つすべてのオリジンに適用されるものとして定義された HTTP の拡張は、 一つのサービスによって設定された情報が、一致する host ドメイン群内の他のサービスとの 通信に影響することを許可する。このような拡張は、安全化された接続から取得された情報が 安全化されていないコンテキスト内で意図せず交換されることを防ぐため、十分に慎重に設計するべきである。

4.2.3. http(s) の正規化と比較

"http" または "https" スキームを持つ URI は、各スキームについて上記で説明したデフォルトを使用して、 [URI] の 6節 で定義された 方法に従って正規化および比較される。

HTTP は、等価性を判定するために特定の方法を使用することを要求しない。たとえば、 キャッシュキーは単純な文字列として、構文ベースの 正規化後に、またはスキームベースの正規化後に比較される場合がある。

"http" および "https" URI のスキームベースの正規化 ( [URI] の 6.2.3節) には、次の追加規則が含まれる:

  • port がスキームのデフォルトポートと等しい場合、正規形では port サブコンポーネントを省略する。
  • OPTIONS リクエストのターゲットとして使用されていない場合、空の path コンポーネントは "/" という絶対 path と等価であるため、正規形では代わりに "/" という path を指定する。
  • scheme と host は大文字小文字を区別せず、通常は小文字で指定される。他の すべてのコンポーネントは大文字小文字を区別して比較される。
  • "reserved" 集合に含まれない文字は、その パーセントエンコードされたオクテットと等価である。正規形ではそれらをエンコードしない (2.1節および 2.2節、[URI] を参照)。

たとえば、次の三つの URI は等価である:

   http://example.com:80/~smith/home.html
   http://EXAMPLE.com/%7Esmith/home.html
   http://EXAMPLE.com:/%7esmith/home.html

正規化後に (任意の方法を使用して) 等価となる二つの HTTP URI は、 同じリソースを識別すると仮定でき、任意の HTTP コンポーネントは正規化を実行してもよい。したがって、異なるリソースを 正規化後に等価となる HTTP URI ( 6.2節 の [URI] で定義される任意の方法を使用) によって識別することは 望ましくない。

4.2.4. http(s) URI における userinfo の非推奨化

authority の URI 汎用構文には、URI にユーザー認証情報を含めるための userinfo サブコンポーネント ([URI], 3.2.1節) も含まれる。その サブコンポーネントでは、"user:password" 形式の使用は非推奨である。

一部の実装は、コマンド呼び出しオプション、設定 ファイル、ブックマークリストなどにおいて、認証情報の内部設定のために userinfo コンポーネントを使用するが、 そのような使用によってユーザー識別子または パスワードが露出する可能性がある。

送信者は、"http" または "https" URI 参照がメッセージ内で ターゲット URI またはフィールド値として生成される場合、userinfo サブコンポーネント (およびその "@" 区切り文字) を生成してはならない。

信頼されていない ソースから受信した "http" または "https" URI 参照を使用する前に、受信者は userinfo を解析し、その 存在をエラーとして扱うことが望ましい。これはフィッシング攻撃のために authority を隠す目的で使用されている可能性が高い。

4.2.5. フラグメント識別子を伴う http(s) 参照

フラグメント識別子は、3.5節 の [URI] で定義されるように、URI スキームとは独立して副次的リソースを間接的に識別できるようにする。 URI を参照する一部のプロトコル要素はフラグメントを含めることを許可するが、 他の要素は許可しない。それらは、フラグメントが許可される要素では ABNF 規則を使用することで 区別され、それ以外ではフラグメントを除外する特定の規則が使用される。

4.3. 権威あるアクセス

権威あるアクセスとは、識別されたリソースへのアクセスを目的として、クライアントが権威ある (リソース所有者によって制御されている) と信じる方法で、指定された識別子を参照解除することをいう。アクセスが 許可されるかどうかを決定するプロセスは URI スキームによって定義され、汎用構文が使用される場合の authority コンポーネントなど、URI コンポーネント内のデータを使用することが多い。しかし、権威ある アクセスは識別された機構に限定されない。

4.3.1節 は、そのような用途を支援するためにオリジンの概念を 定義し、後続の各小節では、あるピアがオリジンを代表する権威を 持つことを確立する方法を説明する。

権威の確立に関するセキュリティ上の考慮事項については、17.1節 を参照すること。

4.3.1. URI オリジン

指定された URI の オリジンは、scheme と host を小文字に正規化し、port から 先頭のゼロを除去するよう正規化した後の scheme、host、および port の三つ組である。 URI から port が省略されている場合、そのスキームのデフォルトポートを 使用する。たとえば、URI

   https://Example.Com/happy.js

のオリジンは

   { "https", "example.com", "443" }

となり、port が常に存在する正規化済み URI 接頭辞としても記述できる:

   https://example.com:443

各オリジンは独自の名前空間を定義し、その 名前空間内の識別子をどのようにリソースへ対応付けるかを制御する。そして、オリジンが有効な リクエストに時間を通じて一貫してどのように応答するかが、ユーザーが URI と関連付ける セマンティクスを決定し、それらのセマンティクスの有用性によって、最終的にこれらの 機構が、ユーザーが将来参照およびアクセスするためのリソースへと変わる。

scheme、host、または port が異なる場合、二つのオリジンは別個である。同じ主体が 二つの異なるオリジンを制御していることを検証できる場合でも、それらのオリジンの下にある二つの名前空間は、 そのオリジンについて権威を持つサーバーによって明示的にエイリアス化されない限り別個である。

オリジンは、この文書の範囲外である HTML および関連する Web プロトコル内でも使用され、 [RFC6454] で説明されている。

4.3.2. http オリジン

HTTP はトランスポートプロトコルから独立しているが、"http" スキーム (4.2.1節) は、 authority コンポーネント内で識別された host の指定ポートで TCP 接続を待ち受けるオリジンサーバーを制御する者と authority を関連付けることに特化している。 これは、クライアント固有の名前解決機構と、経路上の攻撃者から 保護されていない可能性のある通信の両方に依存するため、非常に弱い意味での authority である。それでも、 信頼された環境内で一貫して解決するために、"http" 識別子をオリジンサーバーへ 結び付ける最低限の方法としては十分である。

host 識別子が IP アドレスとして提供されている場合、オリジンサーバーは、その IP アドレスの指定された TCP ポート上のリスナー (存在する場合) である。host が 登録名である場合、その登録名は、DNS などの名前 解決サービスで適切なオリジンサーバーのアドレスを見つけるために使用する間接的な識別子である。

"http" URI が指定された リソースへのアクセスを必要とするコンテキストで使用される場合、クライアントは host 識別子を IP アドレスに解決し、そのアドレスの指定された ポートへ TCP 接続を確立し、その接続上でクライアントのターゲット URI と一致する リクエストターゲットを含む HTTP リクエストメッセージを送信することによってアクセスを試みてもよい (7.1節)。

サーバーがそのようなリクエストに、15節 で 説明される暫定ではない HTTP レスポンスメッセージで応答した場合、その レスポンスはクライアントのリクエストに対する権威ある回答とみなされる。

ただし、上記は権威ある レスポンスを得る唯一の手段ではなく、権威あるレスポンスが常に必要であることを意味するものでもない ([CACHING] を参照)。たとえば、Alt-Svc ヘッダー フィールド [ALTSVC] により、オリジン サーバーはそのオリジンについて権威を持つ他のサービスを識別できる。 "http" で識別されるリソースへのアクセスは、この文書の範囲外の プロトコルによって提供される場合もある。

4.3.3. https オリジン

"https" スキーム (4.2.2節) は、 識別されたオリジンサーバーについてクライアントが信頼できるとみなす証明書に対応する 秘密鍵をサーバーが使用できる能力に基づいて authority を関連付ける。クライアントは通常、 事前に取り決められた、または設定されたトラストアンカーから伝達される信頼の連鎖に依存して、 証明書を信頼できるとみなす (4.3.4節)。

HTTP/1.1 以前では、クライアントは、 その URI オリジンの host 専用に正常に確立され安全化された接続上で 通信している場合にのみ、サーバーに authority を帰属させる。接続の確立と証明書の 検証が authority の証明として使用される。

HTTP/2 および HTTP/3 では、正常に確立され安全化された接続上で 通信している場合、URI オリジンの host がサーバーの証明書に存在するいずれかの host と一致し、かつ クライアントがその URI についてその host への接続を開けると考えるなら、クライアントはサーバーに authority を帰属させる。実際には、 クライアントは DNS クエリを行い、オリジンの host に 確立済み接続と同じサーバー IP アドレスが含まれていることを確認する。この制限は、 オリジンサーバーが等価な ORIGIN フレーム [RFC8336] を送信することで解除できる。

リクエストターゲットの host および port の値は各 HTTP リクエスト内で渡され、 オリジンを識別し、同じサーバーによって 制御される可能性のある他の名前空間から区別する (7.2節)。証明書の秘密鍵を制御するサービスが 対応する "https" 名前空間の管理にも同等の責任を負うこと、または 少なくとも誤送信されたように見えるリクエストを拒否する準備ができていることを保証するのはオリジンの責任である (7.4節)。

オリジンサーバーは、そうする authority を持っている場合でも、特定のターゲット URI に対する リクエストを処理したくない場合がある。たとえば、host が異なるポート (例: 443 と 8000) で別個のサービスを運用している場合、 ネットワーク攻撃者があるポートへの接続を別の ポートで受信させる可能性があるため、接続が安全化された後であってもオリジンサーバーでターゲット URI を確認する必要がある。 ターゲット URI を確認しないと、そのような攻撃者が、ある ターゲット URI (例: "https://example.com/foo") へのレスポンスを、別のポートからの見かけ上 権威あるレスポンス (例: "https://example.com:8000/foo") に置き換えることを許す可能性がある。

"https" スキームは authority の関連付けに TCP および接続されたポート番号を 依存しないことに注意すること。両方とも安全化された通信の外部にあり、 決定的なものとして信頼できないためである。したがって、HTTP 通信は、 4.2.2節 で定義されるように安全化された任意のチャネル上で行うことができ、 TCP を使用しないプロトコルも含まれる。

"https" URI が指定された リソースへのアクセスを必要とするコンテキストで使用される場合、クライアントは host 識別子を IP アドレスへ解決し、そのアドレスの指定された ポートへ TCP 接続を確立し、機密性および完全性の保護を伴う TLS を TCP 上で正常に開始することによって接続をエンドツーエンドで安全化し、その 接続上でクライアントのターゲット URI と一致するリクエストターゲットを含む HTTP リクエストメッセージを送信することでアクセスを試みてもよい (7.1節)。

サーバーがそのようなリクエストに、15節 で 説明される暫定ではない HTTP レスポンスメッセージで応答した場合、その レスポンスはクライアントのリクエストに対する権威ある回答とみなされる。

ただし、上記は権威ある レスポンスを得る唯一の手段ではなく、権威あるレスポンスが常に必要であることを意味するものでもない ([CACHING] を参照)。

4.3.4. https 証明書の検証

URI を参照解除するために 安全化された接続を確立するには、 クライアントはサービスの 識別性が URI のオリジンサーバーに対して許容可能な一致であることを検証しなければならない。証明書 検証は、経路上の攻撃者または 名前解決を制御する攻撃者によるサーバーなりすましを防ぐために使用される。このプロセスには、クライアントが 一組のトラストアンカーで設定されていることが必要である。

一般に、クライアントは 6節 の [RFC6125] で定義された検証プロセスを使用して サービス識別性を検証しなければならない。 クライアントはサービスの host から参照識別性を構築しなければならない: host がリテラル IP アドレスである場合 (4.3.5節)、参照識別性は IP-ID であり、それ以外では host は名前であり、参照識別性は DNS-ID である。

CN-ID 型の参照識別性をクライアントが使用してはならない。6.2.1節 の [RFC6125] に記載されているように、 CN-ID 型の参照識別性は古いクライアントによって使用される場合がある。

クライアントは、代替形式のサーバー 識別性検証を受け入れるよう特別に設定されている場合がある。たとえば、クライアントが アドレスとホスト名が動的なサーバーに接続しており、そのサービスが ターゲット URI のオリジンと一致する証明書ではなく、特定の証明書 (または外部で定義された何らかの参照 識別性と一致する証明書) を提示することを期待している場合がある。

特殊な場合には、クライアントが単純にサーバーの 識別性を無視することが適切な場合もあるが、これは接続を能動的な 攻撃にさらしたままにすることを理解しなければならない。

証明書がターゲット URI のオリジンに対して有効でない場合、ユーザーエージェントは、 続行する前にユーザーから確認を得る (3.5節 を参照) か、 不正な証明書エラーで接続を終了しなければならない。自動化されたクライアントは、 適切な監査ログ (利用可能な場合) にエラーを記録しなければならず、接続を (不正な証明書 エラーで) 終了することが望ましい。自動化されたクライアントは、この確認を無効にする設定を 提供してもよいが、それを有効にする設定を 提供しなければならない。

4.3.5. IP-ID 参照識別性

"https" URI の "host" フィールド内で IP アドレスリテラルを使用して識別されるサーバーは、IP-ID 型の参照識別性を持つ。IP バージョン 4 アドレスは "IPv4address" ABNF 規則を使用し、IP バージョン 6 アドレスは "IPv6address" オプションを持つ "IP-literal" 生成規則を使用する。3.2.2節 の [URI] を参照。 IP-ID の参照識別性は、IP アドレスを復号したバイト列を含む。

IP バージョン 4 アドレスは 4 オクテット、IP バージョン 6 アドレスは 16 オクテットである。 IP-ID の使用は、その他の IP バージョンについては定義されていない。証明書の subjectAltName 拡張における iPAddress 選択肢は IP バージョンを明示的には含まないため、 バージョンの区別はアドレスの長さに依存する。4.2.1.6節 の [RFC5280] を参照。

IP-ID 型の参照識別性は、そのアドレスが証明書の subjectAltName 拡張の iPAddress 値と同一である場合に一致する。

5. フィールド

HTTP はフィールドを使用して、登録済みのキー名前空間を持つ拡張可能な名前/値ペアの形式で データを提供する。フィールドは、メッセージのヘッダーおよびトレーラー セクション内で送受信される (6節 )。

5.1. フィールド 名

フィールド名は、対応するフィールド値がその 名前によって定義されたセマンティクスを持つことを示すラベルである。たとえば、Date ヘッダーフィールドは、 6.6.1節 で、それが現れるメッセージの生成タイムスタンプを含むものとして 定義される。

フィールド名は大文字小文字を区別せず、"Hypertext Transfer Protocol (HTTP) Field Name Registry" に登録するべきである。16.3.1節 を参照。

同じメジャー HTTP バージョンのマイナーバージョン間でフィールドの解釈は変化しないが、そのようなフィールドが存在しない場合の受信者のデフォルトの振る舞いは 変化し得る。特に指定されない限り、フィールドはすべての HTTP バージョンに対して定義される。特に、 Host および Connection フィールドは、HTTP/1.1 への適合を通知するかどうかにかかわらず、 すべての HTTP 実装によって認識されるべきである。

定義されたセマンティクスにより、それを認識しない受信者が安全に無視できる場合、新しいフィールドは プロトコルバージョンを変更せずに導入できる。16.3節 を参照。

プロキシは、フィールド名が Connection ヘッダー フィールド (7.6.1節) に列挙されている場合、またはそのプロキシがそのようなフィールドを ブロックする、あるいはその他の方法で変換するよう特別に設定されている場合を除き、認識できないヘッダーフィールドを転送しなければならない。その他の受信者は、認識できないヘッダーおよびトレーラーフィールドを無視することが望ましい。これらの要件に従うことで、配備済みの仲介者を更新または 削除することなく HTTP の機能を拡張できる。

5.2. フィールド 行と結合されたフィールド値

フィールドセクションは任意の数のフィールド 行から構成され、それぞれがフィールドを識別するフィールド名 (5.1節 を参照) と、そのフィールドのインスタンスに対する データを伝えるフィールド行値を持つ。

フィールド名がセクション内に一度だけ存在する場合、そのフィールドの 結合されたフィールド値は、対応するフィールド行 値から構成される。フィールド名がセクション内で繰り返される場合、その結合されたフィールド値は、 そのセクション内の対応するフィールド行値のリストを 順番に連結し、各フィールド行値をコンマで区切ったものから構成される。

たとえば、このセクション:

Example-Field: Foo, Bar
Example-Field: Baz

には、どちらもフィールド名が "Example-Field" である二つのフィールド行が含まれる。最初のフィールド行 のフィールド行値は "Foo, Bar" であり、二番目のフィールド行値は "Baz" である。 "Example-Field" のフィールド値はリスト "Foo, Bar, Baz" である。

5.3. フィールド 順序

受信者は、フィールド セクション内にある同じフィールド名を持つ複数のフィールド行を、メッセージの セマンティクスを変更することなく一つのフィールド行に結合してもよい。これは、後続する各フィールド行値を最初の フィールド行値に順番に追加し、コンマ (",") と任意の空白 (OWS、5.6.3節 で定義) で区切ることによって行う。一貫性のため、コンマ SP を使用する。

したがって、同じ名前を持つフィールド行が受信された順序は、 フィールド値の解釈にとって重要である。プロキシは、メッセージを転送するとき、 これらのフィールド行値の順序を変更してはならない。

これは、以下に記載するよく知られた例外を除き、送信者は、 そのフィールドの定義が 複数のフィールド行値をコンマ区切りのリストとして再結合することを許可しない限り、メッセージ内 (ヘッダーでもトレーラーでも) に同じ名前を持つ複数のフィールド行を 生成したり、同じ名前のフィールド行がすでにメッセージ内に存在するときにフィールド行を追加したりしてはならないことを意味する (すなわち、フィールド定義の少なくとも 一つの選択肢が、5.6.1節 で定義される ABNF 規則 #(values) のようなコンマ区切りリストを許可する場合)。

異なるフィールド名を持つフィールド行がセクション内で受信される順序は 重要ではない。しかし、実装がメッセージを処理しないことをできるだけ早く 決定できるように、リクエストの Host や レスポンスの Date など、追加の 制御データを含むヘッダーフィールドを最初に送信することが望ましい慣行である。

後続のヘッダーフィールド行に 条件、認証資格情報、またはリクエスト処理に影響し得る意図的に誤解を招く重複ヘッダー フィールドが含まれている可能性があるため、サーバーはリクエストヘッダーセクション全体を受信するまで、 リクエストをターゲットリソースへ適用してはならない。

5.4. フィールド 制限

HTTP は、2節 で説明されるように、各フィールド行、フィールド値、 またはヘッダーもしくはトレーラーセクション全体の長さに事前定義された制限を設けない。実際には、 個々の長さに対するさまざまなアドホックな制限があり、多くの場合、特定のフィールドの セマンティクスに依存する。

処理したいサイズより大きいリクエストヘッダーフィールド行、フィールド値、またはフィールド集合を受信した サーバーは、適切な 4xx (クライアントエラー) ステータスコードで応答しなければならない。そのような ヘッダーフィールドを無視すると、リクエストスマグリング攻撃に対するサーバーの脆弱性が高まる (11.2節、 [HTTP/1.1])。

フィールドのセマンティクスが、 破棄された値をメッセージフレーミングまたはレスポンス セマンティクスを変更せず安全に無視できるものである場合、クライアントは処理したいサイズより大きい受信済みフィールド行を破棄または切り詰めてもよい。

5.5. フィールド 値

HTTP フィールド値は、そのフィールドの 文法によって定義された形式の文字列から構成される。各フィールドの文法は通常 ABNF ([RFC5234]) を使用して定義される。

フィールド値には先頭または末尾の空白は含まれない。特定の HTTP バージョンが メッセージ内にそのような空白を許可する場合、フィールド解析実装は、フィールド値を評価する前に そのような空白を除外しなければならない。

フィールド値は通常、US-ASCII 文字 [USASCII] の範囲に制約される。 より広い範囲の文字を必要とするフィールドは、 [RFC8187] で定義されるようなエンコーディングを使用できる。 歴史的に、HTTP は ISO-8859-1 文字セット [ISO-8859-1] のテキストをフィールド内容として許可し、 その他の文字セットは [RFC2047] エンコーディングの使用によってのみサポートしていた。新たに定義されるフィールドの仕様は、 その値を可視 US-ASCII オクテット (VCHAR)、SP、および HTAB に制限することが望ましい。受信者は、 フィールド内容内で許可されるその他のオクテット (すなわち obs-text) を不透明なデータとして扱うことが望ましい。

CR、LF、または NUL 文字を含むフィールド値は無効かつ危険である。実装が それらの文字を解析および解釈する方法が異なるためである。フィールド値内に CR、LF、または NUL を受信した 受信者は、そのメッセージを拒否するか、さらなる処理 または転送の前にそれらの各文字を SP で置き換えなければならない。その他の CTL 文字を含むフィールド値も 無効である。ただし、受信者は、それらの文字が安全なコンテキスト内に現れる場合 (例: 下流の HTTP パーサーによって処理されないアプリケーション固有の 引用文字列)、堅牢性のためにそのような文字を保持してもよい。

フィールド値として単一のメンバーのみを想定するフィールドは、 シングルトンフィールドと呼ばれる。

フィールド値として複数のメンバーを許可するフィールドは、 リストベースフィールドと呼ばれる。5.6.1節 のリスト演算子拡張は、 複数のメンバーを含み得るフィールド値を定義するための共通表記として使用される。

コンマ (",") はメンバー間の区切り文字として使用されるため、メンバー内のデータとして 許可される場合には注意深く扱う必要がある。これはリストベース フィールドとシングルトンフィールドの両方に当てはまる。シングルトンフィールドが誤って複数の メンバーを伴って送信される可能性があり、そのようなエラーを検出することで相互運用性が向上するためである。 HTTP-date または URI-reference 要素内など、メンバー内にコンマを含むことを想定するフィールドは、 そのデータ内のコンマを潜在的なリスト区切り文字から区別するため、 その要素の周囲に区切り文字を持つよう定義するべきである。

たとえば、テキスト形式の日付と URI (どちらもコンマを含む場合がある) は、 次のようなリストベースのフィールド値で安全に運ぶことができる:

Example-URIs: "http://example.com/a.html,foo",
              "http://without-a-comma.example.com/"
Example-Dates: "Sat, 04 May 1996", "Wed, 14 Sep 2005"

二重引用符の区切り文字は、ほぼ常に quoted-string 生成規則 (5.6.4節) とともに使用されることに注意すること。二重引用符内で 異なる構文を使用すると、不必要な混乱を引き起こす可能性が高い。

多くのフィールド (たとえば Content-Type、 8.3節 で定義) は、パラメーター値に 引用なし (token) と引用あり (quoted-string) の両方の構文を許可する共通のパラメーター構文 (5.6.6節) を使用する。共通構文の使用により、 受信者は既存のパーサーコンポーネントを再利用できる。両方の形式を許可する場合、 パラメーター値の意味は、token として受信された場合でも quoted string として受信された場合でも同じであるべきである。

5.6. フィールド値を定義するための共通規則

5.6.1. リスト (#rule ABNF 拡張)

[RFC5234] の ABNF 規則に対する #rule 拡張は、 一部のリストベースのフィールド値の定義における可読性を向上させるために使用される。

コンマ区切りの 要素リストを定義するため、"*" と同様の構造 "#" が定義される。完全な形式は "<n>#<m>element" であり、少なくとも <n> 個、最大で <m> 個の要素を示し、それぞれは単一のコンマ (",") と 任意の空白 (OWS、5.6.3節 で定義) で区切られる。

5.6.1.1. 送信者の要件

リスト構造を使用する任意の生成規則において、送信者は空のリスト要素を生成してはならない。 言い換えると、送信者は 次の構文を満たすリストを生成しなければならない:

  1#element => element *( OWS "," OWS element )

および:

  #element => [ 1#element ]

また、n >= 1 および m > 1 の場合:

  <n>#<m>element => element <n-1>*<m-1>( OWS "," OWS element )

付録 A には、 リスト構造を展開した後の送信者向け統合 ABNF を示す。

5.6.1.2. 受信者の要件

空の要素は、存在する要素数には寄与しない。受信者は、 妥当な数の空のリスト 要素を解析して無視しなければならない。その数は、値を結合する送信者による一般的な誤りを処理するには十分であり、 かつサービス拒否機構として使用できるほど多くないものとする。言い換えると、 受信者は次の 構文を満たすリストを受け入れなければならない:

  #element => [ element ] *( OWS "," OWS [ element ] )

空のリスト要素が存在する可能性があるため、RFC 5234 ABNF はリスト要素のカーディナリティを強制できず、その結果、 すべてのケースはカーディナリティが指定されていないかのように対応付けられることに注意すること。

たとえば、次の ABNF 生成規則があるとする:

  example-list      = 1#example-list-elmt
  example-list-elmt = token ; see Section 5.6.2

このとき、次は example-list の有効な値である (二重 引用符は含まれず、区切りのためにのみ示している):

  "foo,bar"
  "foo ,bar,"
  "foo , ,bar,charlie"

対照的に、次の値は、example-list 生成規則が少なくとも一つの空でない 要素を要求するため無効となる:

  ""
  ","
  ",   ,"

5.6.2. トークン

トークンは、空白または区切り文字を含まない 短いテキスト識別子である。

  token          = 1*tchar

  tchar          = "!" / "#" / "$" / "%" / "&" / "'" / "*"
                 / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~"
                 / DIGIT / ALPHA
                 ; 区切り文字を除く任意の VCHAR

多くの HTTP フィールド値は、 共通の構文コンポーネントを使用し、空白または特定の区切り 文字によって分離されて定義される。区切り文字は、 token で許可されない US-ASCII 可視文字の集合 (DQUOTE および "(),/:;<=>?@[\]{}") から選択される。

5.6.3. 空白

この仕様では、線形空白の使用を表すために三つの規則を使用する: OWS (任意の空白)、RWS (必須の空白)、および BWS ("不正な" 空白)。

OWS 規則は、0 個以上の線形空白オクテットが現れ得る場所で使用される。 可読性を向上させるため任意の空白が望まれるプロトコル要素では、 送信者は任意の空白を単一の SP として生成することが望ましい。それ以外では、送信者は インプレースのメッセージフィルタリング中に無効または不要なプロトコル要素を 上書きするために必要な場合を除き、任意の空白を生成しないことが望ましい。

RWS 規則は、フィールドトークンを 分離するために少なくとも一つの線形空白オクテットが必要な場合に使用される。送信者は RWS を 単一の SP として生成することが望ましい。

OWS および RWS は単一の SP と同じセマンティクスを持つ。OWS または RWS として定義されていることが分かっている 任意の内容は、それを解釈する前、またはメッセージを下流へ 転送する前に、単一の SP に置き換えてもよい。

BWS 規則は、文法が歴史的な 理由だけで任意の空白を許可する場所で使用される。送信者はメッセージ内に BWS を生成してはならない。 受信者は、そのような不正な空白を解析し、 プロトコル要素を解釈する前に除去しなければならない。

BWS にはセマンティクスがない。BWS として定義されていることが分かっている任意の内容は、 それを解釈する前、またはメッセージを 下流へ転送する前に除去してもよい。

  OWS            = *( SP / HTAB )
                 ; 任意の空白
  RWS            = 1*( SP / HTAB )
                 ; 必須の空白
  BWS            = OWS
                 ; "不正な" 空白

5.6.4. 引用文字列

テキスト文字列は、二重引用符を使用して引用されている場合、 単一の値として解析される。

  quoted-string  = DQUOTE *( qdtext / quoted-pair ) DQUOTE
  qdtext         = HTAB / SP / %x21 / %x23-5B / %x5D-7E / obs-text

バックスラッシュオクテット ("\") は、quoted-string および comment 構造内で 単一オクテットの引用 機構として使用できる。quoted-string の値を処理する受信者は、 quoted-pair をバックスラッシュに続くオクテットで 置き換えたかのように扱わなければならない。

  quoted-pair    = "\" ( HTAB / SP / VCHAR / obs-text )

送信者は、その 文字列内に現れる DQUOTE およびバックスラッシュオクテットを引用するために必要な場合を除き、quoted-string 内に quoted-pair を生成しないことが望ましい。送信者は、 comment 内に現れる括弧 ["(" および ")"] とバックスラッシュ オクテットを引用するために必要な場合を除き、comment 内に quoted-pair を生成しないことが望ましい。

5.6.5. コメント

一部の HTTP フィールドには、コメントテキストを 括弧で囲むことによってコメントを含めることができる。コメントは、フィールド値定義の一部として "comment" を含むフィールドでのみ許可される。

  comment        = "(" *( ctext / quoted-pair / comment ) ")"
  ctext          = HTAB / SP / %x21-27 / %x2A-5B / %x5D-7E / obs-text

5.6.6. パラメーター

パラメーターは名前/値ペアのインスタンスであり、項目に補助情報を追加するための 共通構文としてフィールド値内でよく使用される。 各パラメーターは通常、直前のセミコロンによって区切られる。

パラメーター名は大文字小文字を区別しない。パラメーター値は、 パラメーター名のセマンティクスに応じて大文字小文字を区別する場合も、しない場合もある。 パラメーターおよびいくつかの等価な形式の例は、メディアタイプ (8.3.1節) および Accept ヘッダー フィールド (12.5.1節 ) に見ることができる。

token 生成規則に一致するパラメーター値は、token としても quoted-string 内でも送信できる。引用された値と引用されていない値は等価である。

5.6.7. 日付/時刻形式

1995 年以前、サーバーが タイムスタンプを伝えるために一般的に使用していた形式は三つあった。古い実装との互換性のため、三つすべてを ここで定義する。推奨形式は、Internet Message Format [RFC5322] で使用される 日付および時刻仕様の固定長かつ単一ゾーンのサブセットである。

推奨形式の例は次のとおりである

Sun, 06 Nov 1994 08:49:37 GMT    ; IMF-fixdate

二つの廃止形式の例は次のとおりである

Sunday, 06-Nov-94 08:49:37 GMT   ; 廃止された RFC 850 形式
Sun Nov  6 08:49:37 1994         ; ANSI C の asctime() 形式

HTTP フィールド内のタイムスタンプ値を解析する受信者は、三つすべての HTTP-date 形式を受け入れなければならない。送信者が HTTP-date として定義された一つ以上のタイムスタンプを含むフィールドを生成する場合、 送信者はそれらのタイムスタンプを IMF-fixdate 形式で生成しなければならない。

HTTP-date 値は、協定世界時 (UTC) における時点として時間を表す。最初の二つの形式は、 UTC 名の前身であるグリニッジ標準時の三文字略称 "GMT" によって UTC を示す。asctime 形式の値は UTC であると仮定される。

時計とは、UTC における現在の時点の妥当な 近似を提供できる実装である。時計実装は、UTC と同期するために NTP ([RFC5905])、 または同様のプロトコルを使用するべきである。

推奨形式:

  IMF-fixdate  = day-name "," SP date1 SP time-of-day SP GMT
  ; 形式の固定長/ゾーン/大文字小文字サブセット
  ; [RFC5322] の 3.3節 を参照

  day-name     = %s"Mon" / %s"Tue" / %s"Wed"
               / %s"Thu" / %s"Fri" / %s"Sat" / %s"Sun"

  date1        = day SP month SP year
               ; 例: 02 Jun 1982

  day          = 2DIGIT
  month        = %s"Jan" / %s"Feb" / %s"Mar" / %s"Apr"
               / %s"May" / %s"Jun" / %s"Jul" / %s"Aug"
               / %s"Sep" / %s"Oct" / %s"Nov" / %s"Dec"
  year         = 4DIGIT

  GMT          = %s"GMT"

  time-of-day  = hour ":" minute ":" second
               ; 00:00:00 - 23:59:60 (うるう秒)

  hour         = 2DIGIT
  minute       = 2DIGIT
  second       = 2DIGIT

廃止形式:

  rfc850-date  = day-name-l "," SP date2 SP time-of-day SP GMT
  date2        = day "-" month "-" 2DIGIT
               ; 例: 02-Jun-82

  day-name-l   = %s"Monday" / %s"Tuesday" / %s"Wednesday"
               / %s"Thursday" / %s"Friday" / %s"Saturday"
               / %s"Sunday"

HTTP-date は大文字小文字を区別する。4.2節 の [CACHING] は、 キャッシュ受信者についてこれを緩和していることに注意すること。

送信者は、文法内で SP として明示的に含まれるものを超えて、 HTTP-date 内に追加の空白を生成してはならない。day-name、day、month、year、および time-of-day のセマンティクスは、 対応する名前を持つ Internet Message Format 構造について定義されたものと同じである ([RFC5322]、3.3節)。

2 桁の年を使用する rfc850-date 形式のタイムスタンプ値を受信した受信者は、 50 年を超えて 未来にあるように見えるタイムスタンプを、末尾 2 桁が同じであった過去の最も 近い年を表すものとして解釈しなければならない。

フィールド定義によって別途制限されない限り、タイムスタンプ値の受信者は タイムスタンプの解析において堅牢であることが推奨される。たとえば、メッセージが Internet Message Format によって定義された任意の 日付および時刻仕様を生成する可能性のある非 HTTP ソースから、HTTP を介して転送されることがある。

6. メッセージ 抽象化

HTTP の各メジャーバージョンは、メッセージを通信するための独自の構文を定義する。この節では、 それらのメッセージの特性、共通構造、およびセマンティクスを伝達する能力を一般化したものに基づいて、 HTTP メッセージの抽象データ型を定義する。この抽象化は、 HTTP バージョンに依存しない送信者および受信者に対する要件を定義するために使用され、 これにより、あるバージョンのメッセージを、その意味を変更することなく 他のバージョンを介して中継できる。

メッセージは、次のものから構成される:

  • メッセージを記述し、ルーティングするための制御データ、
  • その制御データを拡張し、送信者、メッセージ、コンテンツ、またはコンテキストに関する 追加情報を伝達するための名前/値ペアの headers ルックアップテーブル、
  • 潜在的に上限のないコンテンツのストリーム、および
  • コンテンツの送信中に得られた情報を伝達するための 名前/値ペアの trailers ルックアップテーブル。

フレーミングおよび制御データが最初に送信され、その後に headers テーブル用のフィールドを含むヘッダーセクションが続く。メッセージにコンテンツが含まれる場合、コンテンツはヘッダー セクションの後に送信され、その後に trailers テーブル用のフィールドを含む可能性のあるトレーラーセクションが続く場合がある。

メッセージはストリームとして処理されることが想定され、そのストリームの目的と 継続的な処理方法は読み取り中に明らかになる。したがって、制御データは 受信者が直ちに知る必要のあることを記述し、ヘッダーフィールドは コンテンツを受信する前に知る必要のあることを記述し、コンテンツ (存在する場合) はおそらく 受信者がメッセージセマンティクスを満たすために望む、または必要とするものを含み、トレーラーフィールドは コンテンツを送信する前には不明だった任意のメタデータを提供する。

メッセージは自己記述的であることを意図している。受信者が メッセージについて知る必要のあるすべてのことは、転送中に圧縮または省略された部分を復号または 再構成した後、メッセージ自体を見ることで判断でき、 送信者の現在のアプリケーション状態 (以前のメッセージによって確立されたもの) を理解する必要はない。 ただし、クライアントは対応するレスポンスを解析、 解釈、またはキャッシュするとき、リクエストに関する情報を保持しなければならない。たとえば、HEAD メソッドへのレスポンスは GET へのレスポンスの先頭と同じように見えるが、 同じ方法では解析できない。

このメッセージ抽象化は、いくつかのバージョンには存在しない可能性のある機能を含め、 多くの HTTP バージョンにわたる一般化であることに注意すること。たとえば、トレーラーは HTTP/1.1 のチャンク化転送コーディングにおいて、コンテンツの後のトレーラーセクションとして 導入された。同等の機能が HTTP/2 および HTTP/3 では、 各ストリームを終了するヘッダーブロック内に存在する。

6.1. フレーミングと完全性

メッセージフレーミングは、各メッセージがどのように開始し終了するかを示し、各メッセージを 同じ接続上の他のメッセージまたはノイズと区別できるようにする。HTTP の各メジャーバージョンは 独自のフレーミング機構を定義する。

HTTP/0.9 および初期の HTTP/1.0 配備では、基盤となる接続の切断を レスポンスの終了に使用していた。後方互換性のため、この暗黙的フレーミングは HTTP/1.1 でも許可される。ただし、接続が早期に閉じられた場合、 暗黙的フレーミングでは不完全なレスポンスを区別できないことがある。そのため、ほぼすべての現代的な実装は、 長さで区切られたメッセージデータ列という形式の明示的フレーミングを使用する。

フレーミングによって示されたすべてのオクテットが 利用可能であるとき、メッセージは完全であるとみなされる。明示的フレーミングが使用されない場合、 基盤となる接続の切断によって終了したレスポンスメッセージは、 トランスポートレベルのエラーによって完全ではないことが示されない限り、 不完全なレスポンスと区別できない場合でも完全であるとみなされることに注意すること。

6.2. 制御データ

メッセージは、その主要な目的を記述する制御データから始まる。リクエストメッセージの 制御データには、リクエストメソッド (9節 )、リクエストターゲット (7.1節)、およびプロトコルバージョン (2.5節) が含まれる。レスポンスメッセージの 制御データには、ステータスコード (15節)、任意の理由句、およびプロトコルバージョンが含まれる。

HTTP/1.1 ([HTTP/1.1]) 以前では、制御データは メッセージの最初の行として送信される。HTTP/2 ([HTTP/2]) および HTTP/3 ([HTTP/3]) では、制御データは 予約済みの名前接頭辞 (例: ":authority") を持つ疑似ヘッダーフィールドとして送信される。

すべての HTTP メッセージはプロトコルバージョンを持つ。使用中のバージョンに応じて、それは メッセージ内で明示的に識別される場合もあれば、メッセージを 受信した接続から推論される場合もある。受信者は、そのバージョン情報を使用して、 その送信者との後続通信における制限または可能性を判断する。

メッセージが仲介者によって転送される場合、プロトコルバージョンは その仲介者が使用したバージョンを反映するよう更新される。Via ヘッダーフィールド (7.6.3節) は、転送されたメッセージ内で 上流のプロトコル情報を伝達するために使用される。

既知である場合、クライアントは、自身が適合する最高の バージョンであり、そのメジャーバージョンが サーバーによってサポートされる最高のバージョンを超えないリクエストバージョンを送信することが望ましい。クライアントは、 自身が適合していないバージョンを送信してはならない。

サーバーが HTTP 仕様を誤って実装していることが分かっている場合、クライアントは より低いリクエストバージョンを送信してもよいが、それはクライアントが 少なくとも一つの通常のリクエストを試み、レスポンスステータスコードまたは ヘッダーフィールド (例: Server) から、サーバーが より高いリクエストバージョンを不適切に処理すると判断した後に限られる。

サーバーは、自身が適合する最高の バージョンのうち、リクエストで受信したもの以下のメジャーバージョンを持つ レスポンスバージョンを送信することが望ましい。サーバーは、自身が適合しないバージョンを 送信してはならない。サーバーは、何らかの 理由でクライアントのメジャープロトコルバージョンへのサービス提供を拒否したい場合、505 (HTTP Version Not Supported) レスポンスを送信できる。

自身が実装しているメジャーバージョン番号と、自身が実装するものより高い マイナーバージョン番号を持つメッセージを受信した受信者は、 自身が適合するそのメジャーバージョン内の最高のマイナーバージョンの メッセージであるかのように処理することが望ましい。受信者は、 より高いマイナーバージョンへのサポートをまだ示していない受信者に送信された より高いマイナーバージョンのメッセージは、同じメジャーバージョンの任意の 実装が安全に処理できる程度に十分な後方互換性を持つと仮定できる。

6.3. ヘッダーフィールド

コンテンツより前に送受信されるフィールド (5節) は、 「ヘッダーフィールド」(口語的には単に「ヘッダー」) と呼ばれる。

メッセージのヘッダーセクションは、一連のヘッダーフィールド行から構成される。 各ヘッダーフィールドは、メッセージセマンティクスを変更または拡張したり、送信者を記述したり、 コンテンツを定義したり、追加のコンテキストを提供したりする場合がある。

6.4. コンテンツ

HTTP メッセージは、完全または部分的な表現をメッセージ コンテンツとして転送することが多い。これは、メッセージフレーミングによって区切られ、 ヘッダーセクションの後に送信されるオクテットのストリームである。

このコンテンツの抽象的定義は、データが メッセージフレーミングから抽出された後のものを反映している。たとえば、HTTP/1.1 メッセージ本文 ( [HTTP/1.1] の 6節) は、チャンク化転送コーディングでエンコードされたデータストリーム — 一連の データチャンク、一つの長さゼロのチャンク、およびトレーラーセクション — から構成される場合があるが、 同じメッセージのコンテンツには、転送コーディングが 復号された後のデータストリームのみが含まれる。チャンク長、チャンク化フレーミング構文、またはトレーラー フィールド (6.5節) は含まれない。

6.4.1. コンテンツセマンティクス

リクエスト内のコンテンツの目的は、メソッドセマンティクス (9節) によって定義される。

たとえば、PUT リクエスト (9.3.4節) のコンテンツ内の表現は、 リクエストが正常に適用された後の ターゲットリソース の望ましい状態を表す一方、 POST リクエスト (9.3.3節) のコンテンツ内の表現は、 ターゲットリソースによって処理される情報を表す。

レスポンスでは、コンテンツの目的はリクエストメソッド、レスポンス ステータスコード (15節)、および そのコンテンツを記述するレスポンスフィールドによって定義される。たとえば、GET (200 (OK) レスポンスのコンテンツは、メッセージ生成日時 (9.3.1節) へのレスポンスとして 観測された ターゲットリソース の現在の状態を表し、 メッセージ生成日時 (6.6.1節) における状態である一方、 同じステータスコードを持つ POST へのレスポンスのコンテンツは、処理 結果または処理適用後のターゲットリソースの新しい状態のいずれかを表す場合がある。

GET への 206 (Partial Content) レスポンスのコンテンツには、選択された表現の単一の部分、または その表現の複数の部分を含むマルチパートメッセージ本文のいずれかが含まれる。これは 15.3.7節 で説明される。

エラーステータスコードを持つレスポンスメッセージは通常、 エラー状態を表すコンテンツを含み、そのコンテンツはエラー状態と それを解決するために推奨される手順を記述する。

HEAD リクエストメソッド (9.3.2節) へのレスポンスには決してコンテンツが含まれない。関連するレスポンス ヘッダーフィールドは、リクエストメソッドが GET (9.3.1節) であった場合にその値が何であったかだけを示す。

CONNECT リクエストメソッド (2xx (成功) レスポンスは、 コンテンツを持つ代わりに接続をトンネルモードへ切り替える (9.3.6節 )。

すべての 1xx (情報)、204 (No Content)、および 304 (Not Modified) レスポンスにはコンテンツが含まれない。

その他のすべてのレスポンスにはコンテンツが含まれるが、そのコンテンツの長さが 0 である場合もある。

6.4.2. コンテンツの識別

完全または部分的な表現がメッセージコンテンツとして転送される場合、 送信者が提供するか、受信者が、その特定の表現に対応するリソースの 識別子を判断できることが望ましい場合が多い。たとえば、 「現在の天気 レポート」というリソースに GET リクエストを行うクライアントは、返されたコンテンツに固有の識別子 (例: 「20210720T1711 時点の Laguna Beach の天気 レポート」) を必要とする場合がある。これは、 時間とともに表現が変化すると予想されるリソースからのコンテンツを共有または ブックマークする際に役立つ。

リクエストメッセージの場合:

  • リクエストに Content-Location ヘッダーフィールドがある場合、送信者は コンテンツが Content-Location フィールド値によって識別されるリソースの表現であると表明する。ただし、そのような表明は 他の手段 (この仕様では定義されない) によって検証できない限り信頼できない。 それでも、この情報は改訂履歴のリンクに役立つ場合がある。
  • それ以外の場合、コンテンツは HTTP によって識別されないが、より具体的な識別子が コンテンツ自体の中で提供される場合がある。

レスポンスメッセージの場合、次の規則が一致するものが 見つかるまで順番に適用される:

  1. リクエストメソッドが HEAD、またはレスポンスステータスコードが 204 (No Content) または 304 (Not Modified) である場合、レスポンスに コンテンツはない。
  2. リクエストメソッドが GET でレスポンスステータスコードが 200 (OK) である場合、コンテンツは ターゲット リソースの表現である (7.1節)。
  3. リクエストメソッドが GET でレスポンスステータスコードが 203 (Non-Authoritative Information) である場合、 コンテンツは、仲介者によって提供された ターゲットリソース の 潜在的に変更または拡張された表現である。
  4. リクエストメソッドが GET でレスポンスステータスコードが 206 (Partial Content) である場合、コンテンツは ターゲットリソースの表現の一つ以上の部分である。
  5. レスポンスに Content-Location ヘッダーフィールドがあり、そのフィールド値が ターゲット URI と同じ URI への参照である場合、コンテンツは ターゲットリソースの表現である。
  6. レスポンスに Content-Location ヘッダーフィールドがあり、そのフィールド値が ターゲット URI とは異なる URI への参照である場合、送信者は コンテンツが Content-Location フィールド値によって識別されるリソースの表現であると表明する。ただし、そのような表明は 他の手段 (この仕様では定義されない) によって検証できない限り信頼できない。
  7. それ以外の場合、コンテンツは HTTP によって識別されないが、より具体的な識別子が コンテンツ自体の中で提供される場合がある。

6.5. トレーラーフィールド

トレーラーセクション内に置かれるフィールド (5節) は、 「トレーラーフィールド」(口語的には単に「トレーラー」) と呼ばれる。 トレーラーフィールドは、メッセージ完全性チェック、 デジタル署名、配信メトリクス、または後処理ステータス情報を提供するのに役立つ場合がある。

トレーラーフィールドは、 ヘッダーセクションが完了した時点で既知のメッセージセマンティクスと矛盾することを避けるため、ヘッダー セクション内のフィールドとは別に処理および保存するべきである。特定のヘッダーフィールドの有無は、 トレーラーが 受信される前に、メッセージ全体のルーティングまたは処理に関する選択へ影響する場合がある。そのような選択は、後からトレーラーフィールドが見つかっても取り消すことはできない。

6.5.1. トレーラー使用の制限

トレーラーセクションは、使用中の HTTP バージョンによってサポートされ、 明示的なフレーミング機構によって有効にされている場合にのみ可能である。たとえば、 HTTP/1.1 のチャンク化転送コーディングでは、コンテンツの後にトレーラーセクションを送信できる ( [HTTP/1.1] の 7.1.2節)。

多くのフィールドは、その評価が コンテンツを受信する前に必要であるため、ヘッダーセクション外では処理できない。これにはメッセージ フレーミング、ルーティング、認証、リクエスト修飾子、レスポンス制御、またはコンテンツ 形式を記述するものが含まれる。送信者は、対応するヘッダーフィールド名の定義がそのフィールドを トレーラーで送信することを許可していると分かっている場合を除き、トレーラーフィールドを生成してはならない。

あるプロトコルバージョンから別のプロトコルバージョンへメッセージを転送する仲介者にとって、 トレーラーフィールドは処理が難しい場合がある。メッセージ全体を転送中にバッファーできる場合、 一部の仲介者は、転送前にトレーラーフィールドをヘッダーセクションへ (適切に) 統合できる。しかし、ほとんどの場合、トレーラーは単に 破棄される。受信者は、対応するヘッダーフィールド 定義を理解し、その定義がトレーラーフィールド 値を安全に統合できる方法を明示的に許可および定義していない限り、トレーラーフィールドを ヘッダーセクションへ統合してはならない。

リクエストの TE ヘッダーフィールド (10.1.4節) にキーワード "trailers" が存在することは、 クライアントが自身および任意の 下流クライアントの代理としてトレーラーフィールドを受け入れる意思があることを示す。仲介者からのリクエストでは、これは すべての下流クライアントが転送されたレスポンス内のトレーラーフィールドを受け入れる意思があることを意味する。 "trailers" が存在することは、クライアントが レスポンス内の特定のトレーラーフィールドを処理することを意味するのではなく、トレーラーセクションが どのクライアントによっても破棄されないことだけを意味する点に注意すること。

トレーラーフィールドが転送中に破棄される可能性があるため、サーバーは、 ユーザーエージェントが受信するために必要だと考えるトレーラーフィールドを 生成しないことが望ましい。

6.5.2. トレーラーフィールドの処理

"Trailer" ヘッダーフィールド (6.6.2節) は、トレーラーセクションで送信される可能性の高い フィールドを示すために送信でき、これにより受信者はコンテンツを処理する 前にそれらの受信に備えることができる。たとえば、フィールド名によって、 コンテンツの受信中に動的チェックサムを計算し、 トレーラーフィールド値を受信したら直ちに確認する必要があることが示される場合に役立つ。

ヘッダーフィールドと同様に、同じ名前を持つトレーラーフィールドは受信した順序で 処理される。同じ名前を持つ複数のトレーラーフィールド行は、複数の値を メンバーのリストとして追加した場合と同等のセマンティクスを持つ。メッセージ中に 複数回生成される可能性のあるトレーラーフィールドは、各メンバー値が受信した フィールド行ごとに一度しか処理されない場合でも、リストベースフィールドとして定義されなければならない。

メッセージの終端で、受信者は、受信した トレーラーフィールドの集合を、ヘッダーフィールドに似ているが別個の 名前/値ペアのデータ構造として扱ってもよい。追加の処理要件がある場合、 トレーラーでの使用を意図したフィールドのフィールド仕様内で定義できる。

6.6. メッセージメタデータ

メッセージがいつ、どのように 生成されたかなど、メッセージ自体を記述するフィールドは、リクエストとレスポンスの両方に現れることができる。

6.6.1. Date

"Date" ヘッダーフィールドは、メッセージが 生成された日時を表し、[RFC5322] の 3.6.1節 で定義される Origination Date Field (orig-date) と 同じセマンティクスを持つ。フィールド値は、5.6.7節 で定義される HTTP-date である。

例:

Date: Tue, 15 Nov 1994 08:12:31 GMT

Date ヘッダーフィールドを生成する送信者は、 メッセージ生成の日時について利用可能な最良の近似としてそのフィールド値を生成することが望ましい。 理論上、その日時は メッセージコンテンツを生成する直前の瞬間を表すべきである。実際には、送信者は メッセージ生成中の任意の時点で日時値を生成できる。

時計 (5.6.7節 で定義) を持つオリジンサーバーは、 すべての 2xx (成功)、3xx (リダイレクト)、および 4xx (クライアントエラー) レスポンスで Date ヘッダーフィールドを生成しなければならず、1xx (情報) および 5xx (サーバーエラー) レスポンスでは Date ヘッダーフィールドを生成してもよい。

時計を持たないオリジンサーバーは Date ヘッダーフィールドを生成してはならない。

時計を持つ受信者が Date ヘッダーフィールドのないレスポンスメッセージを受信した場合、 その受信時刻を記録し、そのメッセージがキャッシュされるか 下流へ転送される場合には、対応する Date ヘッダーフィールドをメッセージのヘッダーセクションへ追加しなければならない。

時計を持つ受信者が無効な Date ヘッダーフィールド 値を持つレスポンスを受信した場合、その値をレスポンスの 受信時刻で置き換えてもよい。

ユーザーエージェントはリクエスト内で Date ヘッダーフィールドを送信してもよいが、 一般には、それがサーバーへ有用な情報を伝えると考えられる場合を除き、 そうしない。たとえば、HTTP のカスタムアプリケーションでは、サーバーが ユーザーエージェントとサーバーの時計の差に基づいてユーザーのリクエストの解釈を調整すると 予想される場合、Date を伝達することがある。

6.6.2. Trailer

"Trailer" ヘッダーフィールドは、送信者がそのメッセージ内で トレーラーフィールドとして送信することを予期するフィールド名のリストを提供する。これにより受信者は、 コンテンツの処理を開始する前に、示されたメタデータの受信に備えることができる。

たとえば、送信者は、コンテンツの ストリーミング中に署名が計算され、最終的な署名をトレーラーフィールドとして提供することを示す場合がある。これにより、 受信者はコンテンツを受信しながら同じチェックを逐次実行できる。

メッセージ内に一つ以上のトレーラーフィールドを生成する予定の送信者は、 そのメッセージのヘッダーセクションに Trailer ヘッダーフィールドを生成して、 トレーラーに存在する可能性のあるフィールドを示すことが望ましい。

仲介者が転送中にトレーラーセクションを破棄した場合、Trailer フィールドは 失われたメタデータの手掛かりを提供できるが、Trailer の送信者が 常に指定されたフィールドを実際に送信する保証はない。

7. HTTP メッセージのルーティング

HTTP リクエストメッセージのルーティングは、ターゲットリソース、クライアントの プロキシ設定、および受信方向接続の確立または再利用に基づいて各クライアントが決定する。 対応するレスポンスのルーティングは、同じ接続チェーンをたどってクライアントへ戻る。

7.1. ターゲットリソースの決定

HTTP は非常に幅広いアプリケーションで使用されるが、ほとんどのクライアントは汎用 Web ブラウザーと同じリソース識別機構および設定技法に依存している。 通信オプションがクライアント設定にハードコードされている場合でも、 その組み合わせた効果を URI 参照 (4.1節) と考えることができる。

URI 参照は、ターゲット URIを得るため絶対形式へ解決される。ターゲット URI は参照のフラグメントコンポーネントがある場合、それを除外する。これは フラグメント識別子がクライアント側処理のために予約されているためである ([URI]、3.5節)。

ターゲットリソースに対するアクションを実行するため、クライアントは、 解析済みターゲット URI の十分なコンポーネントを含むリクエストメッセージを送信し、 受信者が同じリソースを識別できるようにする。歴史的な理由により、解析済みターゲット URI コンポーネントは、 総称してリクエストターゲットと呼ばれ、メッセージ 制御データと Host ヘッダーフィールド (7.2節 ) 内で送信される。

リクエストターゲットコンポーネントが メソッド固有の形式になる特殊なケースが二つある:

  • CONNECT (9.3.6節 ) では、リクエストターゲットはトンネル 宛先のホスト名とポート番号をコロンで区切ったものである。
  • OPTIONS (9.3.7節 ) では、リクエストターゲットは単一のアスタリスク ("*") にできる。

詳細については、それぞれのメソッド定義を参照すること。これらの形式は、他のメソッドでは使用してはならない。

クライアントのリクエストを受信すると、サーバーは ローカル設定および受信接続コンテキストに従って、受信したコンポーネントからターゲット URI を再構成する。 この再構成は各メジャープロトコルバージョンに固有である。たとえば、 [HTTP/1.1] の 3.3節 は、 サーバーが HTTP/1.1 リクエストのターゲット URI を決定する方法を定義する。

7.2. Host と :authority

リクエスト内の "Host" ヘッダーフィールドは、ターゲット URI から host および port 情報を提供し、オリジンサーバーが 複数のホスト名に対するリクエストを処理するときにリソースを区別できるようにする。

HTTP/2 [HTTP/2] および HTTP/3 [HTTP/3] では、Host ヘッダーフィールドは、場合によっては リクエスト制御データの ":authority" 疑似ヘッダーフィールドによって置き換えられる。

  Host = uri-host [ ":" port ] ; 4節

ターゲット URI の authority 情報はリクエスト処理にとって重要である。ユーザーエージェントは、 その情報を ":authority" 疑似ヘッダーフィールドとして送信する場合を除き、 リクエストに Host ヘッダーフィールドを生成しなければならない。Host を送信するユーザーエージェントは、 リクエストのヘッダーセクションで最初のフィールドとして送信することが望ましい。

たとえば、オリジンサーバーへの <http://www.example.org/pub/WWW/> に対する GET リクエストは次のように始まる:

GET /pub/WWW/ HTTP/1.1
Host: www.example.org

host および port 情報はアプリケーションレベルのルーティング機構として機能するため、 共有キャッシュを汚染したり、リクエストを 意図しないサーバーへリダイレクトしたりしようとするマルウェアの標的となることが多い。インターセプションプロキシが、 内部サーバーへのリクエストのリダイレクト、または 共有キャッシュのキャッシュキーとして host および port 情報に依存し、その前にインターセプトした 接続がその host の有効な IP アドレスをターゲットにしていることを検証しない場合、特に脆弱である。

7.3. 受信方向リクエストのルーティング

ターゲット URI とそのオリジンが決定されると、クライアントは、 望ましいセマンティクスを実現するためにネットワークリクエストが必要かどうか、必要な場合はそのリクエストを どこへ送るかを決定する。

7.3.1. キャッシュへ

クライアントがキャッシュ [CACHING] を持ち、リクエストをそれによって 満たせる場合、通常、リクエストは最初にそこへ送られる。

7.3.2. プロキシへ

リクエストがキャッシュによって満たされない場合、一般的なクライアントは、 リクエストを満たすためにプロキシを使用するかどうかを判断するため設定を確認する。 プロキシ設定は実装依存だが、多くの場合 URI 接頭辞の 一致、選択的な authority の一致、またはその両方に基づき、プロキシ自体は通常 "http" または "https" URI によって識別される。

"http" または "https" プロキシが適用可能な場合、クライアントは そのプロキシへの接続を確立 (または再利用) して受信方向へ接続し、その後、 クライアントのターゲット URI と一致するリクエストターゲットを含む HTTP リクエストメッセージを送信する。

7.3.3. オリジンへ

プロキシが適用されない場合、一般的なクライアントは、識別されたリソースへのアクセスを得るため、 (ターゲット URI のスキームに固有の) ハンドラールーチンを呼び出す。その実現方法は ターゲット URI スキームに依存し、関連する 仕様によって定義される。

4.3.2節 は、 識別されたオリジンサーバーへの受信方向接続を確立 (または再利用) し、 クライアントのターゲット URI と一致するリクエストターゲットを含む HTTP リクエストメッセージを そのサーバーへ送信することによって、"http" リソースへのアクセスを得る方法を定義する。

4.3.3節 は、 識別されたオリジンについて権威を持つオリジンサーバーへの受信方向の安全化された 接続を確立 (または再利用) し、 クライアントのターゲット URI と一致するリクエストターゲットを含む HTTP リクエストメッセージをそのサーバーへ送信することによって、 "https" リソースへのアクセスを得る方法を定義する。

7.4. 誤送信されたリクエストの拒否

リクエストがサーバーに受信され、ターゲット URI を判断できる程度まで解析されると、サーバーは、そのリクエストを自身で処理するか、別のサーバーへ 転送するか、クライアントを別のリソースへリダイレクトするか、エラーで応答するか、または 接続を切断するかを決定する。この決定はリクエストまたは 接続コンテキストに関するあらゆる要素の影響を受け得るが、特に、サーバーが そのターゲット URI のリクエストを処理するよう設定されているか、および接続コンテキストが そのリクエストに適切であるかどうかに向けられる。

たとえば、受信した Host ヘッダーフィールド内の情報が接続の host または port と異なるように、 リクエストが意図的または偶発的に誤送信されている場合がある。接続が 信頼されたゲートウェイからのものであれば、そのような不整合は予想される場合がある。それ以外では、 セキュリティフィルターを回避したり、サーバーをだまして非公開コンテンツを配信させたり、 キャッシュを汚染したりする試みを示す場合がある。メッセージルーティングに関するセキュリティ上の考慮事項については、17節 を参照すること。

接続が信頼されたゲートウェイからのものでない限り、オリジンサーバーは、 ターゲット URI に対するスキーム固有の要件が満たされていない場合、リクエストを拒否しなければならない。特に、"https" リソースへのリクエストは、 4.2.2節 で定義されるように、そのターゲット URI のオリジンに対して有効な証明書によって安全化された接続上で 受信された場合を除き、拒否されなければならない。

レスポンス内の 421 (Misdirected Request) ステータスコードは、 リクエストが誤送信されたように見えるため、 オリジンサーバーがそのリクエストを拒否したことを示す (15.5.20節)。

7.5. レスポンスの対応付け

一つの接続は複数のリクエスト/レスポンス交換に使用される場合がある。 リクエストメッセージとレスポンスメッセージを対応付けるために使用される機構はバージョン依存である。一部の HTTP バージョンはメッセージの暗黙的な順序を使用し、その他は明示的な識別子を使用する。

すべてのレスポンスは、ステータスコードにかかわらず (暫定レスポンスを含む)、リクエストが 受信された後であればいつでも、たとえリクエストがまだ完全でなくても送信できる。レスポンスは、対応する リクエストが完全になる前に完了できる (6.1節)。同様に、クライアントは レスポンスを一定時間待つことを期待されない。クライアント (仲介者を含む) は、 妥当な時間内にレスポンスを受信しない場合、リクエストを放棄することがある。

関連するリクエストをまだ送信している間にレスポンスを受信したクライアントは、 明示的に反対の指示を受信しない限り、そのリクエストの送信を続けることが望ましい (たとえば、 [HTTP/1.1] の 9.5節 および [HTTP/2] の 6.4節 を参照)。

7.6. メッセージ転送

3.7節 で説明されるように、 仲介者は HTTP リクエストおよび レスポンスの処理でさまざまな役割を果たすことができる。一部の仲介者は性能または可用性を向上させるために使用される。その他は アクセス制御またはコンテンツのフィルタリングに使用される。HTTP ストリームは パイプ・アンド・フィルターアーキテクチャに似た特性を持つため、仲介者が ストリームのいずれの方向を強化 (または妨害) できる範囲にも、本質的な制限はない。

仲介者は、プロトコル要素が 認識されない場合 (例: 新しいメソッド、ステータスコード、またはフィールド名) でもメッセージを転送することが期待される。これは 下流の受信者に対する拡張性を維持するためである。

トンネルとして動作していない仲介者は、Connection ヘッダーフィールドを、7.6.1節 で指定されるように実装し、受信 接続専用のフィールドを転送対象から除外しなければならない。

無限のリクエストループから保護されている場合を除き、仲介者は メッセージを自身へ転送してはならない。一般に、仲介者は、 任意のエイリアス、ローカルな変形、またはリテラル IP アドレスを含む自身のサーバー名を認識し、 そのようなリクエストに直接応答するべきである。

HTTP メッセージは、増分処理または下流への転送のためにストリームとして解析できる。 ただし、一部の実装はネットワーク効率、セキュリティチェック、またはコンテンツ変換のために、 メッセージ転送をバッファーまたは遅延させるため、送信者および受信者は 部分メッセージの増分配信に依存できない。

7.6.1. Connection

"Connection" ヘッダーフィールドにより、送信者は 現在の接続に対する望ましい制御オプションを列挙できる。

Connection オプションは大文字小文字を区別しない。

Connection 以外のフィールドが現在の接続に対する、または現在の接続に関する 制御情報を提供するために使用される場合、送信者は、 対応するフィールド名を Connection ヘッダーフィールド内に列挙しなければならない。HTTP の一部のバージョンは そのような情報のためのフィールドの使用を禁止しており、そのため Connection フィールドを許可していないことに注意すること。

仲介者は、メッセージを転送する前に受信した Connection ヘッダーフィールドを 解析し、このフィールド内の各 connection-option について、 connection-option と同じ名前を持つ任意のヘッダーまたはトレーラーフィールドをメッセージから 削除し、その後 Connection ヘッダーフィールド自体も削除しなければならない (または 転送するメッセージに対する仲介者自身の制御オプションで置き換える)。

したがって、Connection ヘッダーフィールドは、直近の受信者だけを対象とする フィールド ("hop-by-hop") と、チェーン上のすべての受信者を対象とする フィールド ("end-to-end") を宣言的に区別する方法を提供し、 メッセージを自己記述的にし、将来の接続固有の 拡張を、古い仲介者が盲目的に転送することを懸念せずに 配備できるようにする。

さらに、仲介者は、そのフィールドのセマンティクスを適用した後、 connection-option として現れるかどうかにかかわらず、 転送前に削除する必要があると分かっているフィールドを削除または置換することが望ましい。これには以下が含まれるが、 これらに限定されない:

送信者は、コンテンツのすべての受信者を対象とする フィールドに対応する connection option を送信してはならない。たとえば、Cache-Control は connection option として決して適切ではない ( [CACHING] の 5.2節)。

Connection option は必ずしもメッセージ内に存在するフィールドに対応するとは限らない。 connection option に関連付けられたパラメーターがない場合、 接続固有のフィールドが不要なことがあるためである。対照的に、対応する connection option なしで 受信した接続固有のフィールドは通常、そのフィールドが 仲介者によって不適切に転送されたことを示し、受信者は無視するべきである。

フィールドに対応しない新しい connection option を定義するとき、 仕様の作成者は後の衝突を避けるため、 対応するフィールド名をいずれにせよ予約するべきである。そのような予約済みフィールド名は "Hypertext Transfer Protocol (HTTP) Field Name Registry" (16.3.1節) に登録される。

7.6.2. Max-Forwards

"Max-Forwards" ヘッダーフィールドは、TRACE (9.3.8節) および OPTIONS (9.3.7節) リクエストメソッドに対し、リクエストが プロキシによって転送される回数を制限する機構を提供する。これは、 チェーンの途中で失敗またはループしているように見えるリクエストを クライアントが追跡しようとする場合に役立つ。

Max-Forwards 値は、このリクエストメッセージを あと何回転送できるかを示す 10 進整数である。

Max-Forwards ヘッダーフィールドを含む TRACE または OPTIONS リクエストを受信する各仲介者は、 リクエストを転送する前にその値を確認し更新しなければならない。受信した値が 0 (0) の場合、仲介者は リクエストを転送してはならず、代わりに仲介者自身が 最終受信者として応答しなければならない。受信した Max-Forwards 値が 0 より大きい場合、仲介者は、転送された メッセージ内に更新された Max-Forwards フィールドを生成しなければならず、そのフィールド値は a) 受信値を 1 (1) 減らした値、または b) 受信者が Max-Forwards に対してサポートする最大値のうち小さい方とする。

受信者は、その他のリクエストメソッドとともに受信した Max-Forwards ヘッダーフィールドを無視してもよい。

7.6.3. Via

"Via" ヘッダーフィールドは、リクエストではユーザーエージェントとサーバーの間、レスポンスではオリジン サーバーとクライアントの間にある中間プロトコルおよび 受信者の存在を示し、電子メールの "Received" ヘッダーフィールドに似ている ([RFC5322] の 3.6.7節)。Via は、 メッセージ転送の追跡、リクエストループの回避、および リクエスト/レスポンスチェーンに沿った送信者のプロトコル能力の識別に使用できる。

Via フィールド値の各メンバーは、メッセージを転送したプロキシまたはゲートウェイを表す。 各仲介者は、メッセージがどのように 受信されたかに関する自身の情報を追加し、その結果は 転送受信者の順序に従って並べられる。

プロキシは、以下で説明する適切な Via ヘッダーフィールドを、 自身が転送する各メッセージ内で送信しなければならない。HTTP-to-HTTP ゲートウェイは、 各受信方向リクエストメッセージ内で適切な Via ヘッダーフィールドを送信しなければならず、転送する レスポンスメッセージ内では Via ヘッダーフィールドを送信してもよい。

各仲介者について、received-protocol は、メッセージの上流送信者が使用したプロトコルおよび プロトコルバージョンを示す。したがって、Via フィールド値は リクエスト/レスポンスチェーンで通知されたプロトコル能力を記録し、 下流の受信者から見える状態を維持する。これは、レスポンス内、または 後のリクエスト内で、どの後方互換性のない機能を安全に使用できるか判断する際に役立つ。2.5節 で説明されている。簡潔にするため、受信したプロトコルが HTTP の場合、 protocol-name は省略される。

received-by 部分は通常、後にメッセージを転送した受信 サーバーまたはクライアントの host と任意の port 番号である。ただし、実際の host が 機密情報とみなされる場合、送信者は それを仮名に置き換えてもよい。port が指定されていない場合、受信者は、 received-protocol にデフォルト port があるなら、そこで受信したことを意味すると解釈してもよい。

送信者は、User-Agent および Server ヘッダーフィールドと同様に、各受信者のソフトウェアを識別するためコメントを生成してもよい。 ただし、Via のコメントは任意であり、受信者は メッセージを転送する前に削除してもよい。

たとえば、リクエストメッセージが HTTP/1.0 ユーザーエージェントから、 コードネーム "fred" の内部プロキシへ送信され、そのプロキシが HTTP/1.1 を使用して p.example.net の公開プロキシへリクエストを転送し、その公開プロキシが www.example.com のオリジンサーバーへリクエストを転送して完了するとする。このとき、www.example.com が受信するリクエストは 次の Via ヘッダーフィールドを持つ:

Via: 1.0 fred, 1.1 p.example.net

ネットワークファイアウォールを通過するポータルとして使用される仲介者は、 明示的に有効化されていない限り、ファイアウォール領域内の host の名前および port を 転送しないことが望ましい。有効化されていない場合、そのような仲介者は、 ファイアウォールの背後にある任意の host の各 received-by host を その host に適した仮名で置き換えることが望ましい。

仲介者は、Via ヘッダーフィールドのリストメンバーの順序付き部分列について、それらのエントリーが同一の received-protocol 値を持つ場合、単一のメンバーに結合してもよい。たとえば、

Via: 1.0 ricky, 1.1 ethel, 1.1 fred, 1.0 lucy

は次のようにまとめることができる

Via: 1.0 ricky, 1.1 mertz, 1.0 lucy

送信者は、すべてが同じ組織の管理下にあり、 host がすでに仮名で 置き換えられている場合を除き、複数のリストメンバーを結合しないことが望ましい。送信者は、 異なる received-protocol 値を持つメンバーを結合してはならない。

7.7. メッセージ変換

一部の仲介者は、メッセージとそのコンテンツを変換する機能を備えている。たとえばプロキシは、 キャッシュ領域を節約したり、 遅いリンク上のトラフィック量を減らしたりするため、画像形式間を変換することがある。しかし、 これらの変換が、医療画像や科学データ解析など 重要なアプリケーション向けのコンテンツに適用される場合、特に 受信したコンテンツが元のものと同一であることを保証するために完全性チェックまたは デジタル署名が使用されている場合、運用上の問題が発生することがある。

HTTP-to-HTTP プロキシが、セマンティクス上意味のある方法でメッセージを変更するよう設計または 設定されている場合、それを変換プロキシと呼ぶ (すなわち、 通常の HTTP 処理に必要な範囲を超えて、 元の送信者にとって重要、または下流の 受信者にとって潜在的に重要となる方法でメッセージを変更する)。たとえば、変換プロキシは、共有注釈 サーバー (ローカル注釈データベースへの参照を含めるようレスポンスを変更する)、 マルウェアフィルター、形式トランスコーダー、またはプライバシーフィルターとして動作する場合がある。そのような変換は、 そのプロキシを選択したクライアント (またはクライアント組織) が望んでいるものと推定される。

プロキシが完全修飾ドメイン 名ではない host 名を持つターゲット URI を受信した場合、リクエストを 転送するとき、受信した host 名に自身のドメインを追加してもよい。ターゲット URI が 完全修飾ドメイン名を含む場合、プロキシは host 名を変更してはならない。

プロキシは、転送プロトコルによって要求される場合を除き、 受信したターゲット URI の "absolute-path" および "query" 部分を、次の受信方向サーバーへ転送するとき変更してはならない。たとえば、 HTTP/1.1 を介してオリジン サーバーへリクエストを転送するプロキシは、リクエストメソッドに応じて、空の path を "/" ( [HTTP/1.1] の 3.2.1節) または "*" ([HTTP/1.1] の 3.2.4節) に置き換える。

プロキシは、no-transform キャッシュディレクティブを含むレスポンスメッセージのコンテンツ (6.4節) を変換してはならない ( [CACHING] の 5.2.2.6節)。 これは、転送コーディングの追加または削除など、 コンテンツを変更しないメッセージ変換には適用されないことに注意すること ( [HTTP/1.1] の 7節)。

プロキシは、no-transform キャッシュディレクティブを 含まないメッセージのコンテンツを変換してもよい。200 (OK) レスポンスのコンテンツを変換するプロキシは、 レスポンスステータスコードを 203 (Non-Authoritative Information) (15.3.4節) に変更することで、変換が適用されたことを下流の 受信者へ知らせることができる。

プロキシは、フィールド定義がそのような変更を明示的に許可するか、 その変更がプライバシーまたはセキュリティのために必要とみなされる場合を除き、 通信チェーンのエンドポイント、リソース状態、または 選択された表現 (コンテンツ以外) に関する情報を提供するヘッダーフィールドを変更しないことが望ましい。

7.8. Upgrade

"Upgrade" ヘッダーフィールドは、同じ接続上で HTTP/1.1 から別のプロトコルへ移行するための単純な機構を提供することを意図している。

クライアントは、最終レスポンスが送信される前に、 優先度の高い順に指定された一つ以上のプロトコルへ切り替えるようサーバーを招くため、 リクエストの Upgrade ヘッダー フィールドにプロトコル名のリストを送信してもよい。サーバーは、 その接続で現在のプロトコルの使用を続けたい場合、受信した Upgrade ヘッダーフィールドを 無視してもよい。Upgrade を使用してプロトコル変更を強制することはできない。

プロトコル名は推奨される大文字小文字形式で登録されるが、 各 protocol-name をサポートされるプロトコルと照合するとき、受信者は 大文字小文字を区別しない比較を使用することが望ましい。

101 (Switching Protocols) レスポンスを送信するサーバーは、接続が切り替えられる新しい プロトコルを示すため Upgrade ヘッダーフィールドを送信しなければならない。複数のプロトコル層が 切り替えられる場合、送信者はプロトコルを 層の昇順で列挙しなければならない。サーバーは、対応するリクエストの Upgrade ヘッダー フィールドでクライアントによって示されていないプロトコルへ切り替えてはならない。 サーバーは、クライアントによって示された優先順位を無視し、 リクエストの性質やサーバーの現在の負荷など、他の要因に基づいて 新しいプロトコルを選択してもよい。

426 (Upgrade Required) レスポンスを送信するサーバーは、 受け入れ可能なプロトコルを優先度の高い順に示すため Upgrade ヘッダーフィールドを送信しなければならない。

サーバーは、将来のリクエストに適切な場合、 列挙されたプロトコルへのアップグレードをサポートしていることを 優先度の高い順で通知するため、その他の任意のレスポンス内で Upgrade ヘッダーフィールドを送信してもよい。

次はクライアントによって送信される仮想的な例である:

GET /hello HTTP/1.1
Host: www.example.com
Connection: upgrade
Upgrade: websocket, IRC/6.9, RTA/x11

プロトコル変更後のアプリケーションレベル通信の能力および性質は、 選択された新しいプロトコルに完全に依存する。ただし、 101 (Switching Protocols) レスポンスを送信した直後、 サーバーは、元のリクエストと同等のものを 新しいプロトコル内で受信したかのように、その元のリクエストへの応答を続けることが期待される (すなわち、サーバーは プロトコル変更後も満たすべき未処理のリクエストを持っており、 リクエストを再送する必要なくそれを実行することが期待される)。

たとえば、Upgrade ヘッダーフィールドが GET リクエストで受信され、サーバーが プロトコルを切り替えることを決定した場合、まず HTTP/1.1 で 101 (Switching Protocols) メッセージを返し、その直後に、 ターゲット リソースに対する GET へのレスポンスに相当する新しいプロトコルのものを続ける。これにより、HTTP と同じセマンティクスを持つプロトコルへ 接続を、追加の往復遅延コストなしでアップグレードできる。受信したメッセージのセマンティクスを 新しいプロトコルが満たせない限り、サーバーはプロトコルを切り替えてはならない。OPTIONS リクエストは任意のプロトコルによって満たすことができる。

次は上記の仮想的なリクエストに対するレスポンス例である:

HTTP/1.1 101 Switching Protocols
Connection: upgrade
Upgrade: websocket

[... データストリームが適切なレスポンスとともに websocket へ切り替わる
(新しいプロトコルで定義されるとおり) "GET /hello" リクエストへの ...]

Upgrade の送信者は、仲介者にこのフィールドを転送しないよう知らせるため、 Connection ヘッダーフィールド (7.6.1節 ) 内で "Upgrade" connection option も送信しなければならない。 HTTP/1.0 リクエスト内で Upgrade ヘッダーフィールドを受信したサーバーは、 その Upgrade フィールドを無視しなければならない。

クライアントは、リクエストメッセージを完全に 送信し終えるまで、接続上でアップグレードされたプロトコルの使用を開始できない (すなわち、クライアントは メッセージ送信の途中でプロトコルを変更できない)。サーバーが Upgrade と "100-continue" 期待値を持つ Expect ヘッダーフィールドの両方を受信した場合 (10.1.1節 )、サーバーは 101 (Switching Protocols) レスポンスを送信する前に 100 (Continue) レスポンスを送信しなければならない。

Upgrade ヘッダーフィールドは、既存の 接続上でプロトコルを切り替える場合にのみ適用される。基盤となる接続 (トランスポート) プロトコルを切り替えたり、 既存の通信を別の接続へ切り替えたりするためには使用できない。そのような目的では、 3xx (リダイレクト) レスポンス (15.4節) を使用する方が適切である。

この仕様では、2.5節 の HTTP バージョン規則およびこの仕様の将来の更新によって定義される Hypertext Transfer Protocol ファミリーが使用するプロトコル名として "HTTP" のみを定義する。追加のプロトコル名は、 16.7節 で定義される登録手順を使用して登録するべきである。

8. 表現データとメタデータ

8.1. 表現データ

HTTP メッセージに関連付けられた表現データは、メッセージのコンテンツとして提供されるか、 メッセージセマンティクスおよびターゲット URI によって参照される。表現 データは、表現メタデータ ヘッダーフィールドによって定義される形式およびエンコーディングである。

表現データのデータ型は、ヘッダーフィールド Content-Type および Content-Encoding によって決定される。これらは、 2 層の順序付きエンコーディングモデルを定義する:

  representation-data := Content-Encoding( Content-Type( data ) )

8.2. 表現メタデータ

表現ヘッダーフィールドは、表現に関するメタデータを提供する。メッセージに コンテンツが含まれる場合、表現ヘッダーフィールドはそのデータをどのように解釈するかを記述する。 HEAD リクエストへのレスポンスでは、表現ヘッダーフィールドは、 同じリクエストが GET であった場合にコンテンツ内に含まれていたであろう表現データを記述する。

8.3. Content-Type

"Content-Type" ヘッダーフィールドは、関連付けられた 表現のメディアタイプを示す。すなわち、メッセージコンテンツに含まれる表現、または メッセージセマンティクスによって決定される 選択された表現 である。 示されたメディアタイプは、Content-Encoding によって示されたコンテンツコーディングが復号された後、 受信したメッセージセマンティクスの範囲内で、データ 形式と、そのデータが受信者によってどのように処理されることを意図しているかの両方を定義する。

メディアタイプは 8.3.1節 で定義される。 フィールドの例は次のとおりである

Content-Type: text/html; charset=ISO-8859-4

コンテンツを含むメッセージを生成する送信者は、 含まれる表現の意図されたメディアタイプが送信者に不明である場合を除き、 そのメッセージ内に Content-Type ヘッダーフィールドを生成することが望ましい。 Content-Type ヘッダーフィールドが存在しない場合、受信者は、 "application/octet-stream" ([RFC2046], 4.5.1節) の メディアタイプを仮定するか、データを調べてその型を判断してもよい。

実際には、リソース所有者が特定の表現について正しい Content-Type を 提供するようオリジンサーバーを適切に設定しているとは限らない。一部のユーザーエージェントは コンテンツを調べ、場合によっては受信した型を上書きする (たとえば [Sniffing] を参照)。この「MIME スニッフィング」には、 データについて誤った結論を導き、ユーザーを追加のセキュリティ リスク (例: 「権限昇格」) にさらす危険がある。さらに、異なるメディアタイプが 共通のデータ形式を共有し、データをどのように処理することを意図しているかだけが異なることが多く、 データだけを調べても区別できない。スニッフィングを実装する場合、 実装者には、ユーザーがそれを無効にする手段を提供することが推奨される。

Content-Type はシングルトンフィールドとして定義されているが、誤って 複数回生成され、リストのように見える結合フィールド値になることがある。 受信者はしばしば、構文的に有効な最後の リストメンバーを使用してこのエラーを処理しようとするが、 実装ごとにエラー処理の振る舞いが異なる場合、相互運用性およびセキュリティ上の問題につながる可能性がある。

8.3.1. メディアタイプ

HTTP は、Content-Type (8.3節) および Accept (12.5.1節) ヘッダーフィールド内で、オープンで 拡張可能なデータ型付けと型ネゴシエーションを提供するために、メディアタイプ [RFC2046] を使用する。メディアタイプは、データ形式と さまざまな処理モデル、すなわちメッセージコンテキストに従ってそのデータをどのように処理するかの両方を定義する。

type および subtype トークンは大文字小文字を区別しない。

type/subtype の後には、名前/値ペア形式のセミコロン区切り パラメーター (5.6.6節) が続いてもよい。 パラメーターの有無は、メディアタイプ レジストリ内の定義に応じて、メディアタイプの処理にとって重要な場合がある。 パラメーター値は、パラメーター名の セマンティクスに応じて、大文字小文字を区別する場合もしない場合もある。

たとえば、次のメディアタイプは UTF-8 文字エンコーディング方式で エンコードされた HTML テキストデータを記述するものとして等価だが、 一貫性のため最初のものが推奨される ("charset" パラメーター値は [RFC2046], 4.1.2節 で大文字小文字を区別しないものとして定義される):

  text/html;charset=utf-8
  Text/HTML;Charset="utf-8"
  text/html; charset="utf-8"
  text/html;charset=UTF-8

メディアタイプは、[BCP13] で定義される手順に従って IANA に登録するべきである。

8.3.2. 文字セット

HTTP は、テキスト表現の文字エンコーディング 方式 ([RFC6365], 2節) を示す、またはネゴシエートするためにcharset名を使用する。 この文書で定義されるフィールドでは、charset 名は パラメーター (Content-Type) 内、または Accept-Encoding の場合は、単純な token の形式で現れる。どちらの 場合も、charset 名は大文字小文字を区別せずに照合される。

Charset 名は、[RFC2978] の 2節 で定義される手順に従って、 IANA "Character Sets" レジストリ (https://www.iana.org/assignments/character-sets) に登録するべきである。

8.3.3. マルチパートタイプ

MIME は、多数の "multipart" タイプ — 一つ以上の 表現を単一のメッセージ本文内にカプセル化するもの — を提供する。すべての multipart タイプは、 [RFC2046] の 5.1.1節 で定義される共通の 構文を共有し、メディアタイプ値の一部として boundary パラメーターを含む。メッセージ本文 自体がプロトコル要素であるため、送信者は 本文部分間の改行を表すために CRLF のみを生成しなければならない。

HTTP メッセージフレーミングは、multipart boundary をメッセージ 本文長の指標として使用しないが、コンテンツを生成または処理する実装が使用する場合はある。 たとえば、"multipart/form-data" タイプは、[RFC7578] で説明されるように、 リクエスト内でフォームデータを運ぶためによく使用され、 "multipart/byteranges" タイプは一部の 206 (Partial Content) レスポンスで使用するためにこの仕様で定義される (15.3.7節 を参照)。

8.4. Content-Encoding

"Content-Encoding" ヘッダーフィールドは、メディアタイプ固有のものを超えて、 どのコンテンツコーディングが表現に適用されたか、したがって Content-Type ヘッダーフィールドによって参照される メディアタイプのデータを得るために、どの復号 機構を適用する必要があるかを示す。 Content-Encoding は主に、基盤となるメディアタイプの識別性を失うことなく 表現のデータを圧縮できるようにするために使用される。

使用例:

Content-Encoding: gzip

一つ以上のエンコーディングが表現に適用された場合、それらを適用した 送信者は、コンテンツコーディングを適用された順に 列挙する Content-Encoding ヘッダーフィールドを生成しなければならない。 "identity" という名前のコーディングは Accept-Encoding における特別な役割のために予約されているため、 含めないことが望ましい。

エンコーディングパラメーターに関する追加情報は、この仕様で定義されていない他のヘッダー フィールドによって提供できる。

Transfer-Encoding ( [HTTP/1.1] の 6.1節) とは異なり、Content-Encoding に 列挙されるコーディングは表現の特性である。 表現は符号化形式に基づいて定義され、メタデータ 定義で特に記載されない限り、その表現に関するその他すべてのメタデータも符号化形式に関するものである。 通常、表現が復号されるのは、レンダリングまたは 同様の用途の直前だけである。

メディアタイプが、常に 圧縮されるデータ形式など、固有のエンコーディングを含む場合、そのエンコーディングが コンテンツコーディングのいずれかと同じアルゴリズムであっても、Content-Encoding で改めて指定されることはない。そのようなコンテンツコーディングは、 何らかの奇妙な理由で、表現を形成するために二度目に適用された場合にのみ列挙される。 同様に、オリジンサーバーは、同じデータを、コーディングが Content-Type または Content-Encoding の一部として定義されるかどうかだけが異なる 複数の表現として公開することを選択する場合がある。これは一部のユーザーエージェントが各レスポンスを異なる方法で処理するためである (例: コンテンツを自動的に展開してレンダリングする代わりに「名前を付けて保存...」ダイアログを開く)。

リクエストメッセージ内の表現が受け入れられない content coding を持つ場合、 オリジンサーバーは 415 (Unsupported Media Type) ステータスコードで応答してもよい。

8.4.1. コンテンツコーディング

コンテンツコーディング値は、表現に適用済み、または適用可能な エンコーディング変換を示す。コンテンツコーディングは主に、 基盤となるメディアタイプの識別性を失わず、情報を失うことなく、 表現を圧縮したり、その他の有用な方法で変換したりできるようにするために使用される。多くの場合、 表現は符号化形式で保存され、直接送信され、最終的な 受信者によってのみ復号される。

すべてのコンテンツコーディングは大文字小文字を区別せず、16.6節 で説明されるように、"HTTP Content Coding Registry" に登録するべきである。

Content-coding 値は、Accept-Encoding (12.5.3節 ) および Content-Encoding (8.4節) ヘッダーフィールドで使用される。

8.4.1.1. Compress コーディング

"compress" コーディングは、UNIX ファイル圧縮プログラム "compress" によって 一般的に生成される適応型 Lempel-Ziv-Welch (LZW) コーディング [Welch] である。 受信者は "x-compress" を "compress" と等価とみなすことが望ましい。

8.4.1.2. Deflate コーディング

"deflate" コーディングは、Lempel-Ziv (LZ77) 圧縮アルゴリズムと Huffman コーディングの組み合わせを使用する "deflate" 圧縮データストリーム [RFC1951] を含む "zlib" データ形式 [RFC1950] である。

8.4.1.3. Gzip コーディング

"gzip" コーディングは、gzip ファイル圧縮プログラム [RFC1952] によって一般的に生成される、32 ビット巡回冗長検査 (CRC) を伴う LZ77 コーディングである。 受信者は "x-gzip" を "gzip" と等価とみなすことが望ましい。

8.5. Content-Language

"Content-Language" ヘッダーフィールドは、表現の意図された 対象者の自然言語を記述する。これは、 表現内で使用されるすべての言語と同じとは限らないことに注意すること。

言語タグは 8.5.1節 で定義される。Content-Language の主な目的は、ユーザーが自身の優先言語に応じて 表現を識別し区別できるようにすることである。したがって、 コンテンツがデンマーク語を読める対象者のみを意図している場合、適切なフィールドは

Content-Language: da

Content-Language が指定されていない場合、デフォルトではコンテンツは すべての言語の対象者を意図している。これは、送信者が特定の 自然言語に固有とは考えていないか、どの言語を 対象としているか送信者が知らないことを意味する場合がある。

複数の対象者を意図したコンテンツには、複数の言語を 列挙してもよい。たとえば、"Treaty of Waitangi" を、 元のマオリ語版と英語版で同時に提示する場合、次のようになる

Content-Language: mi, en

ただし、表現内に複数の言語が存在するというだけで、 複数の言語対象者を意図していることにはならない。例として、 "A First Lesson in Latin" のような初心者向け言語入門書は、明らかに 英語を読める対象者による使用を意図している。この場合、Content-Language には 適切には "en" だけが含まれる。

Content-Language は任意のメディアタイプに適用してもよく、 テキスト文書に限定されない。

8.5.1. 言語タグ

[RFC5646] で定義される言語タグは、 人間が他の人間へ情報を伝達するために話す、書く、またはその他の方法で伝える 自然言語を識別する。コンピューター言語は 明示的に除外される。

HTTP は、Accept-Language および Content-Language ヘッダーフィールド内で言語タグを使用する。Accept-Language は、12.5.4節 で定義される、より広範な language-range 生成規則を使用する一方、Content-Language は以下で定義される language-tag 生成規則を使用する。

  language-tag = <Language-Tag, see [RFC5646], Section 2.1>

言語タグは、大文字小文字を区別しない一つ以上のサブタグの列であり、それぞれが ハイフン文字 ("-", %x2D) で区切られる。ほとんどの場合、言語タグは 関連する言語の広いファミリーを識別する主要言語サブタグ (例: "en" = 英語) から構成され、任意で、その言語の範囲を洗練または 狭める一連のサブタグ (例: "en-CA" = カナダで伝達される 英語の変種) が続く。言語タグ内に空白は許可されない。タグの例:

  fr, en-US, es-419, az-Arab, x-pig-latin, man-Nkoo-GN

詳細については [RFC5646] を参照すること。

8.6. Content-Length

"Content-Length" ヘッダーフィールドは、関連付けられた表現のデータ長を、 オクテット数を表す 10 進の非負整数として示す。表現を コンテンツとして転送する場合、Content-Length はフレーミングの区切りに使用できるよう、 含まれるデータ量を具体的に示す (例: [HTTP/1.1] の 6.2節)。その他の 場合、Content-Length は選択された表現の現在の長さを示し、 受信者が転送時間を推定したり、以前に保存した 表現と比較したりするために使用できる。

例:

Content-Length: 3495

メソッドが含まれるコンテンツの意味を定義しており、 Transfer-Encoding を送信していない場合、ユーザーエージェントはリクエスト内で Content-Length を送信することが望ましい。たとえば、 ユーザーエージェントは通常、値が 0 (空のコンテンツを示す) であっても POST リクエストで Content-Length を送信する。 リクエストメッセージにコンテンツが含まれず、 メソッドセマンティクスもそのようなデータを想定していない場合、ユーザーエージェントは Content-Length ヘッダーフィールドを送信しないことが望ましい。

サーバーは HEAD リクエスト (9.3.2節) へのレスポンスで Content-Length ヘッダーフィールドを送信してもよい。 同じリクエストが GET メソッドを使用した場合にレスポンスのコンテンツで送信されていた オクテット数の 10 進数とフィールド値が等しい場合を除き、 サーバーはそのようなレスポンスで Content-Length を送信してはならない。

サーバーは、条件付き GET リクエストへの 304 (Not Modified) レスポンスで Content-Length ヘッダーフィールドを送信してもよい (15.4.5節)。同じリクエストへの 200 (OK) レスポンスのコンテンツで送信されていた オクテット数の 10 進数とフィールド値が等しい場合を除き、サーバーは そのようなレスポンスで Content-Length を送信してはならない。

サーバーは、1xx (Informational) または 204 (No Content) のステータスコードを持つ いかなるレスポンスでも Content-Length ヘッダーフィールドを送信してはならない。 また、CONNECT リクエスト (9.3.6節) への 2xx (Successful) レスポンスでも、サーバーは Content-Length ヘッダーフィールドを送信してはならない。

上記で定義された場合を除き、Transfer-Encoding がなく、 完全なヘッダーセクションを送信する前にコンテンツサイズが分かっている場合、オリジンサーバーは Content-Length ヘッダーフィールドを送信することが望ましい。これにより下流の 受信者は転送進捗を測定し、受信したメッセージがいつ完了したかを知り、 追加のリクエストのために接続を再利用できる可能性がある。

0 以上の任意の Content-Length フィールド値は有効である。コンテンツ長に 事前定義された上限がないため、受信者は 潜在的に大きな 10 進数を想定し、整数 変換のオーバーフローによる解析エラーや整数変換による精度損失を防がなければならない (17.5節)。

Content-Length は HTTP/1.1 でメッセージ区切りに使用されるため、そのフィールド値は、 直近の接続が HTTP/1.1 を使用していない場合でも、 下流の受信者がメッセージをどのように解析するかに影響し得る。メッセージが下流の 仲介者によって転送される場合、受信した メッセージフレーミングと一致しない Content-Length フィールド値は、リクエストスマグリングまたはレスポンス 分割によるセキュリティ障害を引き起こす可能性がある。

したがって、送信者は、誤っていることが分かっている Content-Length ヘッダーフィールド値を持つメッセージを転送してはならない。

同様に、送信者は、上記の ABNF と一致しない Content-Length ヘッダーフィールド値を持つメッセージを転送してはならない。ただし一つ 例外がある。同じ 10 進値がコンマ区切りリストとして繰り返された Content-Length ヘッダーフィールド値 (例: "Content-Length: 42, 42") の受信者は、 メッセージを無効として拒否するか、その無効な フィールド値を単一の 10 進値に置き換えてもよい。これは、 上流のメッセージプロセッサーによって重複が生成または結合された可能性が高いためである。

8.7. Content-Location

"Content-Location" ヘッダーフィールドは、このメッセージのコンテンツ内の表現に対応する 特定のリソースの識別子として使用できる URI を参照する。 言い換えると、この メッセージ生成時点でこの URI に GET リクエストを実行したなら、200 (OK) レスポンスには このメッセージのコンテンツとして含まれるものと同じ表現が含まれる。

フィールド値は absolute-URI または partial-URI のいずれかである。後者の場合 (4節)、参照される URI は ターゲット URI に相対である ([URI], 5節)。

Content-Location 値はターゲット URI (7.1節) の代替ではない。それは 表現メタデータである。これは [RFC2557] の 4節 で MIME 本文部分に対して定義された 同名のヘッダーフィールドと同じ構文およびセマンティクスを持つ。 ただし、HTTP メッセージ内に現れることには、HTTP 受信者にとっていくつか特別な意味がある。

Content-Location が 2xx (Successful) レスポンスメッセージに含まれ、その値が (絶対 形式への変換後) ターゲット URI と同じ URI を参照する場合、受信者は メッセージ生成日時によって示された時点における、その リソースの現在の表現としてコンテンツをみなしてもよい。GET (9.3.1節) または HEAD (9.3.2節) リクエストでは、これは サーバーが Content-Location を提供しない場合のデフォルトセマンティクスと同じである。 PUT (9.3.4節) や POST (9.3.3節) のような状態変更リクエストでは、サーバーのレスポンスに そのリソースの新しい表現が含まれることを意味し、 アクションについて報告するだけの表現 (例: "It worked!") と区別する。これによりオーサリング アプリケーションは、その後の GET リクエストを必要とせずローカルコピーを更新できる。

Content-Location が 2xx (Successful) レスポンスメッセージに含まれ、そのフィールド値が ターゲット URI とは異なる URI を参照する場合、オリジンサーバーは、その URI が 含まれる表現に対応する別のリソースの識別子であると主張する。そのような主張は、 両方の識別子が同じリソース所有者を共有する場合にのみ信頼できるが、それは HTTP を介してプログラム的に判断することはできない。

  • GET または HEAD リクエストへのレスポンスでは、これはターゲット URI が コンテンツネゴシエーションの対象であるリソースを参照し、Content-Location フィールド値が 選択された表現 のより具体的な識別子であることを示す。
  • 状態変更メソッドへの 201 (Created) レスポンスでは、 Location フィールド値と同一の Content-Location フィールド値は、この コンテンツが新しく作成されたリソースの現在の表現であることを示す。
  • それ以外の場合、そのような Content-Location は、このコンテンツが 要求されたアクションの状態を報告する表現であり、同じレポートが 指定された URI で (将来 GET を使用してアクセスするために) 利用可能であることを示す。たとえば、POST リクエストによる購入トランザクションは、 200 (OK) レスポンスのコンテンツとして領収書文書を含む場合があり、Content-Location フィールド値は、将来その同じ領収書のコピーを取得するための識別子を提供する。

リクエストメッセージで Content-Location を送信するユーザーエージェントは、その値が ユーザーエージェントが元々、含まれる 表現のコンテンツを取得した場所 (そのユーザーエージェントによる変更前) を参照すると表明している。言い換えると、 ユーザーエージェントは元の表現のソースへのバックリンクを提供している。

リクエストメッセージ内の Content-Location フィールドを受信したオリジンサーバーは、 その情報を表現の一部としてそのまま保存するメタデータではなく、 一時的なリクエストコンテキストとして扱わなければならない。オリジンサーバーは、そのコンテキストをリクエスト処理の指針として使用したり、 ソースリンクやバージョニングメタデータ内など、他の用途のために保存してもよい。ただし、 オリジンサーバーはそのようなコンテキスト情報を使用して リクエストセマンティクスを変更してはならない。

たとえば、クライアントがネゴシエートされたリソースに PUT リクエストを行い、オリジン サーバーがその PUT を (リダイレクトなしで) 受け入れる場合、そのリソースの新しい状態は、 その PUT で提供された一つの表現と整合することが期待される。 Content-Location を逆方向のコンテンツ選択識別子として使用して、 ネゴシエートされた表現の一つだけを更新することはできない。ユーザーエージェントが 後者のセマンティクスを望んでいたなら、PUT を Content-Location URI に直接適用していたはずである。

8.8. バリデーターフィールド

リソースメタデータが、条件付きリクエスト (13節) を行うための 事前条件 (13.1節) 内で使用できる場合、それをバリデーターと呼ぶ。 バリデーターフィールドは、選択された 表現 (3.2節 ) の現在のバリデーターを伝える。

安全なリクエストへのレスポンスでは、バリデーターフィールドは レスポンス処理中にオリジンサーバーによって選択された表現を記述する。 メソッドおよびステータスコードのセマンティクスによっては、特定のレスポンスの選択された表現は、 レスポンスコンテンツとして含まれる表現と必ずしも同じではないことに注意すること。

状態変更リクエストへの成功レスポンスでは、バリデーターフィールドは、 リクエスト処理の結果として以前の 選択された表現 を置き換えた新しい 表現を記述する。

たとえば、201 (Created) レスポンス内の ETag フィールドは、新しく作成されたリソースの表現の entity tag を伝達し、 後の条件付きリクエストでその entity tag をバリデーターとして使用して、 「更新の喪失」問題を防げるようにする。

この仕様では、リソース状態を観測し 事前条件をテストするために一般的に使用される二つの形式のメタデータを定義する: 変更日時 (8.8.2節) および不透明な entity tag (8.8.3節)。 リソース状態を反映する追加のメタデータは、Web Distributed Authoring and Versioning [WEBDAV] など、HTTP のさまざまな拡張によって定義されているが、 この仕様の範囲外である。

8.8.1. 弱いバリデーターと強いバリデーター

バリデーターには二種類ある: 強いものと弱いもの。弱いバリデーターは生成しやすいが、 比較にははるかに役に立たない。強いバリデーターは比較に理想的だが、 効率的に生成するのが非常に難しい (場合によっては不可能な) ことがある。 すべての形式のリソースに同じ強度の バリデーターを要求する代わりに、HTTP は使用中のバリデーターの型を公開し、 弱いバリデーターを事前条件として使用できる場合に制限を課す。

強いバリデーターとは、GET への 200 (OK) レスポンスのコンテンツで観測可能な 表現データの変更が発生するたびに値が変化する表現メタデータである。

強いバリデーターは、表現 データの変更以外の理由、たとえば表現メタデータのセマンティクス上重要な部分が 変更された場合 (例: Content-Type) にも変化する可能性があるが、 リモートキャッシュやオーサリング ツールが保持する保存済みレスポンスを無効化する必要がある場合にのみ値を変更することが、 オリジンサーバーにとって最も利益になる。

キャッシュエントリーは、有効期限にかかわらず、任意に長い期間存続する場合がある。 したがって、キャッシュは遠い過去に 取得したバリデーターを使用してエントリーを検証しようとする場合がある。強いバリデーターは、 特定のリソースに関連付けられたすべての表現のすべてのバージョンにわたって一意である。ただし、 異なるリソースの表現間での一意性を意味するものではない (すなわち、 同じ強いバリデーターが同時に複数のリソースの表現で使用される場合があり、 それらの表現が等価であることを意味しない)。

実際にはさまざまな強いバリデーターが使用される。最良のものは 厳密なリビジョン管理に基づき、表現への各変更によって必ず 一意のノード名とリビジョン識別子が割り当てられ、その後に表現が GET からアクセス可能になる。表現 データに適用した衝突耐性ハッシュ関数も、レスポンスヘッダーフィールドを送信する前にデータを利用でき、 検証リクエストを受信するたびにダイジェストを再計算する必要がない場合には十分である。 ただし、リソースが、同じデータ形式を偶然共有する メディアタイプに対するコンテンツネゴシエーションなどによって、メタデータだけが異なる別個の 表現を持つ場合、オリジンサーバーは、それらの表現を 区別するためにバリデーターへ追加情報を組み込む必要がある。

対照的に、弱いバリデーターとは、表現データのすべての 変更に対して値が変化するとは限らない表現メタデータである。この弱さは、 値の計算方法の制限 (例: 時計の分解能)、リソースのすべての可能な表現について 一意性を保証できないこと、または リソース所有者が、一意のデータ列ではなく自身で決めた何らかの 等価性の集合によって表現をグループ化したいことに由来する場合がある。

オリジンサーバーは、以前の表現を現在の 表現の代替として受け入れられないとみなすたびに、弱い entity tag を変更することが望ましい。 言い換えると、オリジンサーバーがキャッシュに古いレスポンスを無効化させたいときは、 弱い entity tag を変更するべきである。

たとえば、動的な測定に基づいてコンテンツが毎秒変化する天気レポートの 表現は、同じ弱いバリデーターを持つ等価な 表現の集合 (オリジンサーバーの観点から) にグループ化され、 キャッシュされた表現が妥当な期間 (サーバー負荷や天候品質に基づいて動的に調整される場合もある) 有効となるようにする場合がある。同様に、 表現の変更時刻が 1 秒の分解能でしか定義されていない場合、 その表現が 1 秒の間に二度変更され、 その変更の間に取得される可能性があるなら、弱いバリデーターとなる場合がある。

同様に、バリデーターが同時に特定のリソースの 二つ以上の表現によって共有されている場合、それらの表現が同一の 表現データを持たない限り、そのバリデーターは弱い。たとえば、オリジンサーバーが gzip content coding を適用した表現と、content coding がない表現に 同じバリデーターを送信する場合、そのバリデーターは弱い。ただし、同時に存在する二つの 表現が、同じ表現データに対して二つの異なるメディアタイプが利用可能である場合など、 表現メタデータだけが異なるのであれば、同じ強いバリデーターを共有できる。

強いバリデーターは、キャッシュ 検証、部分コンテンツ範囲、および「更新の喪失」の回避を含むすべての条件付きリクエストで使用できる。 弱いバリデーターは、キャッシュエントリーの検証や Web 巡回を最近の変更に限定する場合など、以前に取得した 表現データとの厳密な同一性をクライアントが必要としない場合にのみ使用できる。

8.8.2. Last-Modified

レスポンス内の "Last-Modified" ヘッダーフィールドは、リクエスト処理の終了時点で判断された、 オリジンサーバーが 選択された表現 が 最後に変更されたと考える日時を示すタイムスタンプを提供する。

使用例:

Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT
8.8.2.1. 生成

最終変更日時を合理的かつ一貫して 判断できる選択された表現について、オリジンサーバーは Last-Modified を送信することが望ましい。 条件付きリクエストおよびキャッシュ鮮度の評価 ([CACHING]) に使用することで、 不要な転送を大幅に削減し、サービスの可用性および スケーラビリティを大きく向上できるためである。

表現は通常、リソース インターフェイスの背後にある多くの部分の総体である。last-modified 時刻は通常、 それらの部分のいずれかが変更された最も最近の時刻となる。特定のリソースについて その値をどのように決定するかは、この仕様の範囲外の実装詳細である。

オリジンサーバーは、 レスポンスの Date フィールド値を生成する時刻にできる限り近い時点で、表現の Last-Modified 値を取得することが望ましい。これにより、 特にレスポンスが生成される時刻付近で 表現が変化する場合、受信者は表現の 変更時刻を正確に評価できる。

時計 (5.6.7節) を持つオリジンサーバーは、 サーバーのメッセージ 生成時刻 (Date、6.6.1節) より後の Last-Modified 日時を生成してはならない。 最終 変更時刻が、オリジンサーバーの時計によると未来の時刻となる 実装固有のメタデータから導出される場合、 オリジンサーバーは、その値をメッセージ生成日時で置き換えなければならない。 これにより、未来の変更日時が キャッシュ検証に悪影響を与えることを防ぐ。

時計を持たないオリジンサーバーは、その日時値が 他のシステム (おそらく時計を持つもの) によってリソースへ割り当てられた場合を除き、 レスポンスに Last-Modified 日時を生成してはならない。

8.8.2.2. 比較

Last-Modified 時刻をリクエスト内のバリデーターとして使用する場合、 次の規則を使用して強いと推論できない限り、暗黙的に弱い:

  • バリデーターが、オリジンサーバーによって表現の実際の現在の バリデーターと比較されており、
  • そのオリジンサーバーが、提示されたバリデーターが対象とする 1 秒間に 関連する表現が二度変更されていないことを確実に知っている。

または

  • クライアントが関連する表現のキャッシュエントリーを持っているため、 バリデーターを If-Modified-Since、If-Unmodified-Since、 または If-Range ヘッダーフィールドで使用しようとしており、
  • そのキャッシュエントリーに、Last-Modified 値より少なくとも 1 秒後の Date 値が含まれ、かつ クライアントが、それらが同じ時計によって生成されたと考える理由があるか、 Last-Modified と Date 値の間に十分な差があり、 時計同期の問題が起こりにくいと考えられる。

または

  • バリデーターが中間キャッシュによって、表現について キャッシュエントリーに保存されているバリデーターと比較されており、
  • そのキャッシュエントリーに、Last-Modified 値より少なくとも 1 秒後の Date 値が含まれ、かつ キャッシュが、それらが同じ時計によって生成されたと考える理由があるか、 Last-Modified と Date 値の間に十分な差があり、 時計同期の問題が起こりにくいと考えられる。

この方法は、同じ 1 秒の間にオリジンサーバーが 二つの異なるレスポンスを送信したが、両方が同じ Last-Modified 時刻を持つ場合、 それらのレスポンスの少なくとも一つは、その Last-Modified 時刻と等しい Date 値を持つという事実に依存している。

8.8.3. ETag

レスポンス内の "ETag" フィールドは、リクエスト処理の終了時点で決定された 選択された表現 の現在の entity tag を提供する。 entity tag は、同じリソースの複数の表現を区別するための不透明な バリデーターであり、それらの複数の表現が、時間経過によるリソース状態の 変化、コンテンツネゴシエーションによって複数の表現が同時に 有効となること、またはその両方によるかどうかには依存しない。entity tag は不透明な引用文字列からなり、 任意で弱さを示す指標が接頭辞として付く。

  ETag       = entity-tag

  entity-tag = [ weak ] opaque-tag
  weak       = %s"W/"
  opaque-tag = DQUOTE *etagc DQUOTE
  etagc      = %x21 / %x23-7E / obs-text
             ; 二重引用符を除く VCHAR と obs-text

変更日時を保存することが不便な場合、 HTTP-date 値の 1 秒の分解能では不十分な場合、または変更 日時が一貫して維持されない場合、entity tag は変更日時よりも 信頼性の高い検証手段となり得る。

例:

ETag: "xyzzy"
ETag: W/"xyzzy"
ETag: ""

entity tag は弱いバリデーターまたは強いバリデーターのいずれにもなり得、 デフォルトは強いものである。オリジンサーバーが表現に entity tag を提供し、その entity tag の生成が強い バリデーター (8.8.1節) の特性をすべて満たさない場合、オリジンサーバーは 不透明な値の前に "W/" (大文字小文字を区別) を付けて、entity tag を弱いものとして マークしなければならない。

送信者はトレーラーセクション内で ETag フィールドを送信してもよい (6.5節 を参照)。ただし、 トレーラーはしばしば無視されるため、 entity tag がコンテンツ送信中に生成される場合を除き、ETag はヘッダーフィールドとして送信する方が望ましい。

8.8.3.1. 生成

entity tag の背後にある原則は、サービス作成者だけが リソースの実装を十分に理解しており、そのリソースに最も正確かつ 効率的な検証機構を選択できること、そしてそのような機構はいずれも 容易に比較できる単純なオクテット列へ対応付けられることである。 値は不透明であるため、クライアントが各 entity tag の構築方法を認識する必要はない。

たとえば、すべての変更に実装固有のバージョニングが適用される リソースは、表現間を正確に区別するため、 内部リビジョン番号を、場合によってはコンテンツネゴシエーション用の 変動識別子と組み合わせて使用する場合がある。他の実装は、 表現コンテンツの衝突耐性ハッシュ、さまざまなファイル属性の組み合わせ、または 1 秒未満の分解能を持つ変更タイムスタンプを使用する場合がある。

変更を合理的かつ一貫して 検出できる選択された表現について、オリジンサーバーは ETag を送信することが望ましい。 条件付きリクエストおよびキャッシュ鮮度の評価 ([CACHING]) で entity tag を使用することで、 不要な転送を大幅に削減し、サービスの可用性、 スケーラビリティ、および信頼性を大きく向上できるためである。

8.8.3.2. 比較

比較コンテキストで弱いバリデーターの使用が許可されるかどうかに応じて、 entity tag の比較関数は二つある:

強い比較:
二つの entity tag がどちらも弱くなく、それらの opaque-tag が 文字単位で一致する場合、等価である。
弱い比較:
一方または両方が "weak" とマークされているかどうかにかかわらず、 opaque-tag が文字単位で一致する場合、二つの entity tag は等価である。

以下の例は、entity tag のペアの集合について、 弱い比較関数と強い比較関数の両方の結果を示す:

表 3
ETag 1 ETag 2 強い比較 弱い比較
W/"1" W/"1" 不一致 一致
W/"1" W/"2" 不一致 不一致
W/"1" "1" 不一致 一致
"1" "1" 一致 一致
8.8.3.3. 例:エンティティー タグがコンテンツネゴシエーション済みリソースで変化する 場合

コンテンツネゴシエーション (12節) の対象となるリソースを考える。 GET リクエストへのレスポンスで送信される表現は、Accept-Encoding リクエスト ヘッダーフィールド (12.5.3節 ) に基づいて異なる:

>> リクエスト:

GET /index HTTP/1.1
Host: www.example.com
Accept-Encoding: gzip

この場合、レスポンスは gzip content coding を使用する場合もしない場合もある。使用しない 場合、レスポンスは次のようになる可能性がある:

>> レスポンス:

HTTP/1.1 200 OK
Date: Fri, 26 Mar 2010 00:05:00 GMT
ETag: "123-a"
Content-Length: 70
Vary: Accept-Encoding
Content-Type: text/plain

Hello World!
Hello World!
Hello World!
Hello World!
Hello World!

gzip content coding を使用する代替表現は次のようになる:

>> レスポンス:

HTTP/1.1 200 OK
Date: Fri, 26 Mar 2010 00:05:00 GMT
ETag: "123-b"
Content-Length: 43
Vary: Accept-Encoding
Content-Type: text/plain
Content-Encoding: gzip

...binary data...

9. メソッド

9.1. 概要

リクエストメソッドトークンはリクエストセマンティクスの主要な情報源であり、 クライアントがこのリクエストを行った目的と、成功した結果として クライアントが何を期待しているかを示す。

リクエストメソッドのセマンティクスは、追加のセマンティクスが メソッドと矛盾しない場合、リクエスト内に存在するいくつかの ヘッダーフィールドのセマンティクスによってさらに特化される場合がある。たとえば、クライアントは条件付きリクエストヘッダーフィールド (13.1節) を送信して、要求された アクションをターゲットリソースの現在の状態に条件付けることができる。

HTTP は分散オブジェクトシステムへのインターフェイスとして使用できるよう設計されている。リクエスト メソッドは、リモートメソッド 呼び出しを識別されたオブジェクトへ送信するのとほぼ同じ方法で、ターゲットリソース に適用するアクションを呼び出す。

メソッドトークンは、大文字小文字を区別するメソッド名を持つオブジェクトベースの システムへのゲートウェイとして使用される可能性があるため、大文字小文字を区別する。慣例として、標準化されたメソッドは すべて大文字の US-ASCII 文字で定義される。

分散オブジェクトとは異なり、HTTP の標準化されたリクエストメソッドは リソース固有ではない。統一インターフェイスは ネットワークベースのシステムにおいて、より優れた可視性と再利用を提供するためである [REST]。 一度定義された標準化メソッドは、どの リソースに適用しても同じセマンティクスを持つべきだが、各リソースはそれらのセマンティクスを 実装または許可するかどうかを自身で決定する。

この仕様では、HTTP で一般的に使用される多数の標準化メソッドを 次の表のとおり定義する。

表 4
メソッド名 説明 節
GET ターゲットリソースの現在の表現を転送する。 9.3.1
HEAD GET と同じだが、レスポンスコンテンツを転送しない。 9.3.2
POST リクエスト コンテンツに対してリソース固有の処理を実行する。 9.3.3
PUT ターゲットリソースの現在のすべての表現を リクエストコンテンツで置き換える。 9.3.4
DELETE ターゲットリソースの現在のすべての表現を削除する。 9.3.5
CONNECT ターゲット リソースによって識別されるサーバーへのトンネルを確立する。 9.3.6
OPTIONS ターゲット リソースの通信オプションを記述する。 9.3.7
TRACE ターゲットリソースまでの経路に沿って メッセージループバックテストを実行する。 9.3.8

すべての汎用サーバーは GET および HEAD メソッドをサポートしなければならない。 その他すべてのメソッドは任意である。

ターゲットリソースによって許可されるメソッドの集合は、Allow ヘッダーフィールド (10.2.1節) に列挙できる。ただし、許可される メソッドの集合は動的に変化し得る。認識できない、または実装されていないリクエストメソッドを受信した オリジンサーバーは、 501 (Not Implemented) ステータスコードで応答することが望ましい。 認識され実装されているが、 ターゲットリソースには許可されていないリクエストメソッドを受信したオリジン サーバーは、405 (Method Not Allowed) ステータスコードで応答することが望ましい。

この仕様の範囲外の追加メソッドも、 HTTP で使用するために規定されている。そのようなすべてのメソッドは、16.1節 で説明されるように、"Hypertext Transfer Protocol (HTTP) Method Registry" に登録するべきである。

9.2. 共通メソッドプロパティ

9.2.1. 安全なメソッド

リクエストメソッドは、その定義されたセマンティクスが 本質的に読み取り専用である場合、安全であるとみなされる。すなわち、クライアントは、安全なメソッドをターゲット リソースに適用した結果として、オリジンサーバー上でいかなる 状態変更も要求せず、期待もしない。同様に、安全なメソッドの合理的な使用は、 オリジンサーバーに損害、財産の損失、または異常な負担を引き起こすことを想定しない。

この安全なメソッドの定義は、安全なメソッドを呼び出している間に、 潜在的に有害な、完全には読み取り専用でない、または 副作用を引き起こす振る舞いを実装が含めることを妨げない。ただし重要なのは、 クライアントがその追加の振る舞いを要求しておらず、その責任を負わせることができない点である。 たとえば、ほとんどのサーバーはメソッドにかかわらず、 各レスポンス完了時にリクエスト情報をアクセスログファイルへ追記し、 ログ記憶域がいっぱいになってサーバー障害を引き起こす可能性があっても、それは安全とみなされる。 同様に、Web 上の広告を選択することで開始された安全なリクエストは、 広告アカウントに課金するという副作用を持つことが多い。

この仕様で定義されるリクエストメソッドのうち、GET、HEAD、OPTIONS、および TRACE メソッドは安全であると定義される。

安全なメソッドと安全でないメソッドを区別する目的は、自動化された 取得処理 (スパイダー) およびキャッシュ性能最適化 (プリフェッチ) が、 損害を引き起こす心配なく動作できるようにすることである。さらに、ユーザーエージェントが 潜在的に信頼できないコンテンツを処理するとき、安全でないメソッドの自動使用に 適切な制約を適用できるようにする。

ユーザーエージェントは、ユーザーに潜在的なアクションを提示するとき、 ユーザーが要求前に安全でないアクションを認識できるよう、 安全なメソッドと安全でないメソッドを区別することが望ましい。

ターゲット URI 内のパラメーターがアクションを選択する 効果を持つようリソースが構築されている場合、 そのアクションがリクエストメソッドセマンティクスと整合することを保証するのはリソース所有者の責任である。たとえば、 Web ベースのコンテンツ編集ソフトウェアが query パラメーター内で "page?do=delete" のようなアクションを使用することは一般的である。そのようなリソースの目的が 安全でないアクションを実行することである場合、リソース所有者は、 安全なリクエストメソッドを使用してアクセスされたとき、そのアクションを 無効化または禁止しなければならない。 そうしないと、自動化された処理が リンク保守、プリフェッチ、検索インデックスの構築などのためにすべての URI 参照に GET を実行した際、 望ましくない副作用を生じる。

9.2.2. べき等メソッド

あるメソッドによる複数の同一リクエストがサーバーに与える意図された 効果が、一つのそのようなリクエストの 効果と同じである場合、そのリクエストメソッドはべき等であるとみなされる。この 仕様で定義されるリクエストメソッドのうち、PUT、DELETE、および安全なリクエスト メソッドはべき等である。

安全の定義と同様に、べき等というプロパティはユーザーによって 要求されたものだけに適用される。サーバーは各リクエストを個別に記録したり、 リビジョン管理履歴を保持したり、各 べき等リクエストに対してその他の非べき等な副作用を実装したりしてよい。

べき等メソッドが区別されるのは、クライアントが サーバーのレスポンスを読み取れる前に通信障害が発生した場合、リクエストを自動的に繰り返せるためである。たとえば、クライアントが PUT リクエストを送信し、 レスポンスを受信する前に基盤となる接続が閉じられた場合、クライアントは 新しい接続を確立し、べき等リクエストを再試行できる。元のリクエストが 成功していたとしても、リクエストを繰り返すことで同じ意図された効果になることを知っている。 ただしレスポンスは異なる可能性がある。

クライアントは、メソッドにかかわらずリクエストセマンティクスが 実際にべき等であることを知る手段、または 元のリクエストが決して適用されなかったことを検出する手段がない限り、 非べき等メソッドを持つリクエストを自動的に再試行しないことが望ましい。

たとえば、ユーザーエージェントは、 (設計または設定を通じて) そのリソースに対してリクエストが安全であると分かっている場合、POST リクエストを自動的に繰り返せる。 同様に、バージョン管理 リポジトリを操作するために特別に設計されたユーザーエージェントは、接続障害後に ターゲットリソースのリビジョンを確認し、部分的に適用された 変更を元に戻すか修正し、その後失敗したリクエストを 自動的に再試行することで、部分障害状態から回復できる場合がある。

一部のクライアントはより危険な方法を取り、自動再試行が 可能な時期を推測しようとする。たとえば、レスポンスの一部も受信される前に 基盤となるトランスポート接続が閉じられた場合、 特にアイドル状態の永続接続が使用されていたなら、クライアントは POST リクエストを自動的に再試行することがある。

プロキシは非べき等リクエストを自動的に再試行してはならない。 クライアントは、失敗した自動 再試行を自動的に再試行しないことが望ましい。

9.2.3. メソッドとキャッシュ

キャッシュがレスポンスを保存および使用するには、関連するメソッドが キャッシュを明示的に許可し、レスポンスをどの条件で後続 リクエストの充足に使用できるかを詳細に定める必要がある。そうしていないメソッド定義はキャッシュできない。 追加要件については [CACHING] を参照。

この仕様では GET、HEAD、および POST のキャッシュセマンティクスを定義するが、 圧倒的多数のキャッシュ実装は GET および HEAD のみをサポートする。

9.3. メソッド定義

9.3.1. GET

GET メソッドは、ターゲットリソースについて、現在の 選択された表現 の転送を要求する。成功したレスポンスは、 ターゲット URI によって識別される「同一性」の性質を反映する ( [URI] の 1.2.2節)。 したがって、HTTP を介した識別可能な情報の取得は通常、その情報を 200 (OK) レスポンスで提供する可能性に関連付けられた識別子に GET リクエストを行うことで実行される。

GET は情報取得の主要な機構であり、ほぼすべての 性能最適化の中心である。重要な各 リソースについて URI を生成するアプリケーションは、それらの最適化の恩恵を受けつつ、他の アプリケーションによる再利用を可能にし、Web のさらなる拡張を促すネットワーク効果を生み出す。

リソース識別子をリモートファイルシステムのパス名、 表現をそのようなファイルの内容のコピーと考えたくなる。実際、 多くのリソースはそのように実装されている (関連する セキュリティ上の考慮事項については 17.3節 を参照)。ただし、実際にはそのような制限はない。

リソースの HTTP インターフェイスは、コンテンツオブジェクトのツリー、 さまざまなデータベースレコードに対するプログラム的ビュー、または 他の情報システムへのゲートウェイとして実装される可能性も同じくらいある。URI 対応付け機構がファイル システムに結び付けられている場合でも、オリジンサーバーは、リクエストを入力としてファイルを実行し、 ファイルを直接転送する代わりに出力を表現として送信するよう設定されている場合がある。 いずれにせよ、各リソース 識別子が実装にどのように対応し、その実装がターゲットリソースの現在の表現を どのように選択して送信するかを知る必要があるのはオリジンサーバーだけである。

クライアントは、リクエストで Range ヘッダーフィールドを送信することで、 選択された表現の一部だけの転送を要求する「範囲リクエスト」となるよう GET のセマンティクスを変更できる (14.2節)。

リクエストメッセージのフレーミングは使用されるメソッドから独立しているが、 GET リクエストで受信したコンテンツには一般的に定義されたセマンティクスがなく、 リクエストの意味またはターゲットを変更できず、リクエストスマグリング攻撃として悪用される可能性があるため、 一部の実装がリクエストを拒否して 接続を閉じることにつながる場合がある ([HTTP/1.1] の 11.2節)。クライアントは、 そのようなリクエストに目的があり適切にサポートされることを、帯域内または帯域外で以前に示した オリジンサーバーへ直接行う場合を除き、GET リクエスト内にコンテンツを 生成しないことが望ましい。オリジンサーバーは、HTTP 通信の参加者が リクエストチェーン上の仲介者を認識していないことが多いため、 コンテンツ受信について私的な取り決めに依存しないことが望ましい。

GET リクエストへのレスポンスはキャッシュ可能である。 [CACHING] の 5.2節 の Cache-Control ヘッダーフィールドによって別途示されない限り、キャッシュは 後続の GET および HEAD リクエストを満たすためにそれを使用してもよい。

GET を使用するフォームの query フィールドなど、ユーザー提供情報からターゲット URI を 構築する機構によって情報取得を実行する場合、 URI 内で開示するのに適切でない潜在的に機密性のあるデータが提供される可能性がある (17.9節 を参照)。場合によっては、 そのような情報を明らかにしないようデータをフィルタリングまたは変換できる。 その他の場合、特にレスポンスをキャッシュする利点がない場合、 GET の代わりに POST メソッド (9.3.3節) を使用することで、そのような情報を ターゲット URI 内ではなくリクエストコンテンツ内で送信できる。

9.3.3. POST

POST メソッドは、ターゲット リソースに対して、リクエスト内に含まれる表現を リソース固有のセマンティクスに従って処理することを要求する。たとえば、POST は次の 機能などに使用される:

  • HTML フォームに入力されたフィールドなどのデータブロックを、 データ処理プロセスへ提供する。
  • 掲示板、ニュースグループ、メーリングリスト、ブログ、または類似の 記事グループへメッセージを投稿する。
  • オリジンサーバーによってまだ識別されていない新しいリソースを作成する。および
  • リソースの既存の表現にデータを追加する。

オリジンサーバーは POST リクエストの処理結果に応じて適切なステータスコードを 選択することでレスポンスセマンティクスを示す。この仕様で定義されるほぼすべてのステータス コードが POST へのレスポンスとして受信され得る (例外は 206 (Partial Content)、304 (Not Modified)、および 416 (Range Not Satisfiable))。

POST リクエストの正常な処理によって オリジンサーバー上に一つ以上のリソースが作成された場合、オリジンサーバーは、 作成された主要な リソースの識別子を提供する Location ヘッダーフィールド (10.2.2節) と、新しいリソースを参照しながら リクエストの状態を記述する表現を含む 201 (Created) レスポンスを送信することが望ましい。

POST リクエストへのレスポンスは、明示的な鮮度 情報 ([CACHING] の 4.2.1節 を参照) と、 POST のターゲット URI と同じ値を持つ Content-Location ヘッダーフィールド (8.7節 ) を含む場合にのみキャッシュ可能である。キャッシュされた POST レスポンスは、後の GET または HEAD リクエストを満たすために再利用できる。対照的に、POST は潜在的に安全でないため、 POST リクエストをキャッシュされた POST レスポンスによって満たすことはできない。 [CACHING] の 4節 を参照。

POST の処理結果が既存の リソースの表現と等価になる場合、オリジンサーバーは、既存リソースの識別子を Location フィールドに含む 303 (See Other) レスポンスを送信して、ユーザー エージェントをそのリソースへリダイレクトしてもよい。これには、 ユーザーエージェントへリソース識別子を提供し、共有キャッシュにより適した方法で 表現を転送できるという利点があるが、ユーザーエージェントがその表現をすでにキャッシュしていない場合は 追加リクエストのコストがかかる。

9.3.4. PUT

PUT メソッドは、ターゲットリソースの状態を、 リクエストメッセージコンテンツに含まれる表現によって定義される状態で作成または置換することを要求する。 特定の表現に対する PUT が成功した場合、その後に同じターゲット リソースへ GET を行うと、等価な表現が 200 (OK) レスポンスで送信されることを示唆する。ただし、 ターゲットリソースが他のユーザーエージェントによって並行して操作される場合や、 後続の GET を受信する前にオリジンサーバーによる動的 処理の対象となる場合があるため、そのような状態変更が観測可能である保証はない。成功した レスポンスは、オリジンサーバーによる処理時点で ユーザーエージェントの意図が達成されたことだけを意味する。

ターゲットリソースが現在の表現を持たず、PUT が 正常に一つを作成した場合、オリジンサーバーは 201 (Created) レスポンスを送信してユーザーエージェントへ通知しなければならない。 ターゲットリソースが現在の表現を持ち、その 表現が含まれる表現の状態に従って正常に変更された場合、オリジンサーバーは、 リクエストの正常な完了を示すため、200 (OK) または 204 (No Content) のいずれかのレスポンスを送信しなければならない。

オリジンサーバーは、PUT 表現がターゲットリソースに対して設定された 制約と整合していることを検証することが望ましい。たとえば、 オリジンサーバーが URI に基づいてリソースの表現メタデータを決定する場合、 オリジンサーバーは、成功した PUT リクエストで受信したコンテンツがそのメタデータと整合していることを保証する必要がある。PUT 表現が ターゲットリソースと整合しない場合、オリジンサーバーは、 表現を変換するかリソース 設定を変更して整合させるか、表現が不適切である理由を説明する十分な 情報を含む適切なエラーメッセージで応答することが望ましい。409 (Conflict) または 415 (Unsupported Media Type) ステータスコードが推奨され、後者は Content-Type 値に対する制約に特有である。

たとえば、ターゲットリソースが常に Content-Type が "text/html" となるよう設定され、 PUT される表現の Content-Type が "image/jpeg" である場合、オリジンサーバーは 次のいずれかを行うべきである:

  1. 新しいメディアタイプを反映するようターゲットリソースを再設定する。
  2. PUT 表現をリソースの 形式と整合する形式へ変換してから、新しいリソース状態として保存する。または、
  3. ターゲットリソースが "text/html" に限定されていることを示す 415 (Unsupported Media Type) レスポンスでリクエストを拒否し、場合によっては 新しい表現に適したターゲットとなる別のリソースへのリンクを含める。

HTTP は、ユーザーエージェントリクエストの意図および オリジンサーバーレスポンスのセマンティクスで表現できるものを超えて、PUT メソッドがオリジンサーバーの状態へ どのような影響を与えるかを正確には定義しない。また、HTTP を介して提供されるインターフェイスを超えて、 「リソース」がその語のいかなる意味で何であるかも定義しない。リソース状態がどのように 「保存」されるか、そのような保存がリソース状態の変更によってどのように変化するか、 オリジンサーバーがリソース状態を 表現へどのように変換するかも定義しない。一般的に、リソース インターフェイスの背後にあるすべての実装詳細は、サーバーによって意図的に隠される。

これはヘッダーおよびトレーラーフィールドの保存方法にも及ぶ。Content-Type のような一般的なヘッダーフィールドは通常 保存され、後続の GET リクエストで返されるが、ヘッダーおよびトレーラーフィールドの処理は リクエストを受信したリソースに固有である。したがって、オリジンサーバーは、 PUT リクエストで受信した認識できないヘッダーおよびトレーラーフィールドを無視することが望ましい (すなわち、それらをリソース状態の一部として保存しない)。

リクエストの表現データがコンテンツに いかなる変換も適用されず保存された場合 (すなわち、リソースの新しい表現データが PUT リクエストで 受信したコンテンツと同一である) で、かつバリデーターフィールド値が新しい 表現を反映する場合を除き、オリジンサーバーは、成功した PUT へのレスポンスで 8.8節 のバリデーターフィールド、たとえば ETag または Last-Modified フィールドを送信してはならない。 この要件により、ユーザーエージェントは、自身が送信した (そしてメモリ内に保持している) 表現が PUT の結果である時点を知ることができ、 オリジンサーバーから再取得する必要がなくなる。レスポンスで受信した新しいバリデーターは、 偶発的な 上書きを防ぐため、将来の条件付きリクエストに使用できる (13.1節)。

POST と PUT メソッドの根本的な違いは、 含まれる表現に対する意図の違いによって明確になる。POST リクエストのターゲットリソースは、含まれる表現を リソース固有のセマンティクスに従って処理することを意図する一方、PUT リクエストに含まれる表現は、 ターゲットリソースの状態を置き換えるものとして定義される。したがって、PUT の意図は べき等であり、正確な効果はオリジンサーバーだけが知っているとしても 仲介者から見える。

PUT リクエストを正しく解釈するには、ユーザーエージェントが望ましい ターゲットリソースを知っていることが前提となる。状態変更リクエストを受信した後、 クライアントに代わって適切な URI を選択するサービスは、 PUT ではなく POST メソッドを使用して実装することが望ましい。 オリジンサーバーがターゲットリソースに要求された PUT 状態変更を 行わず、その代わりに、リソースが 別の URI へ移動した場合など、別のリソースへ適用させたい場合、オリジンサーバーは 適切な 3xx (Redirection) レスポンスを送信しなければならない。 その後、ユーザーエージェントはリクエストを リダイレクトするかどうかを自身で決定してもよい。

ターゲットリソースに適用された PUT リクエストは、他の リソースに副作用を与える場合がある。たとえば、ある記事が「現在の バージョン」(あるリソース) を識別する URI と、各特定の バージョン (ある時点では現在の バージョンリソースと同じ状態を共有していた別のリソース) を識別する URI を別々に持つ場合がある。 したがって、「現在のバージョン」URI への成功した PUT リクエストは、 ターゲットリソースの状態変更に加えて新しいバージョンリソースを作成し、 関連する リソース間にリンクを追加する場合もある。

一部のオリジンサーバーは、Content-Range ヘッダーフィールド (14.4節) を リクエスト修飾子として使用し、14.5節 で説明される部分 PUT を実行することをサポートする。

PUT メソッドへのレスポンスはキャッシュ可能ではない。成功した PUT リクエストが ターゲット URI に対して一つ以上の保存済みレスポンスを持つキャッシュを通過した場合、 それらの保存済みレスポンスは無効化される ([CACHING] の 4.4節 を参照)。

9.3.5. DELETE

DELETE メソッドは、オリジンサーバーに対し、 ターゲットリソースとその現在の 機能との関連付けを削除することを要求する。実質的に、このメソッドは UNIX の "rm" コマンドに似ており、 以前に関連付けられていた情報そのものが削除されるという期待ではなく、 オリジンサーバーの URI 対応付けに対する削除操作を表す。

ターゲットリソースが一つ以上の現在の表現を持つ場合、それらが オリジンサーバーによって破棄されるかどうか、関連する記憶域が 解放されるかどうかは、リソースの性質と オリジンサーバーによる実装 (この 仕様の範囲外) に完全に依存する。同様に、DELETE の結果として、データベースまたはゲートウェイ 接続など、リソースの他の実装側面も 無効化またはアーカイブする必要がある場合がある。一般に、オリジンサーバーは削除を実行するための 所定の機構を持つリソースに対してのみ DELETE を許可すると想定される。

DELETE メソッドを許可するリソースは比較的少なく、その主な用途は リモートオーサリング環境であり、ユーザーがその効果についてある程度制御できる場合である。たとえば、 以前 PUT リクエストで作成されたリソース、または POST リクエストへの 201 (Created) レスポンス後に Location ヘッダーフィールドで識別された リソースは、それらのアクションを取り消すために対応する DELETE リクエストを許可する場合がある。同様に、HTTP を リモート操作に使用するリビジョン管理クライアントなど、オーサリング機能を実装するカスタムユーザーエージェント実装は、 サーバーの URI 空間がバージョンリポジトリに対応するよう構築されているという前提に基づいて DELETE を使用する場合がある。

DELETE メソッドが正常に適用された場合、オリジンサーバーは次を送信することが望ましい

  • アクションが成功する可能性は高いがまだ実行されていない場合、 202 (Accepted) ステータスコード、
  • アクションが実行され、追加情報を提供しない場合、 204 (No Content) ステータスコード、または
  • アクションが実行され、レスポンスメッセージに 状態を記述する表現が含まれる場合、200 (OK) ステータスコード。

リクエストメッセージのフレーミングは使用されるメソッドから独立しているが、 DELETE リクエストで受信したコンテンツには一般的に定義されたセマンティクスがなく、 リクエストの意味またはターゲットを変更できず、リクエストスマグリング攻撃として悪用される可能性があるため、 一部の実装がリクエストを拒否して 接続を閉じることにつながる場合がある ([HTTP/1.1] の 11.2節)。クライアントは、 そのようなリクエストに目的があり適切にサポートされることを、帯域内または帯域外で以前に示した オリジンサーバーへ直接行う場合を除き、DELETE リクエスト内にコンテンツを 生成しないことが望ましい。オリジンサーバーは、HTTP 通信の参加者が リクエストチェーン上の仲介者を認識していないことが多いため、 コンテンツ受信について私的な取り決めに依存しないことが望ましい。

DELETE メソッドへのレスポンスはキャッシュ可能ではない。成功した DELETE リクエストが ターゲット URI に対して一つ以上の保存済みレスポンスを持つキャッシュを通過した場合、 それらの保存済みレスポンスは無効化される ([CACHING] の 4.4節 を参照)。

9.3.6. CONNECT

CONNECT メソッドは、受信者に対して、リクエストターゲットによって識別される宛先 オリジンサーバーへのトンネルを確立し、成功した場合、その後 トンネルが閉じられるまで、両方向でデータをブラインド転送するだけに 振る舞いを制限することを要求する。トンネルは一般に、一つ以上のプロキシを介したエンドツーエンドの仮想 接続を作成するために使用され、その後 TLS (Transport Layer Security、[TLS13]) を使用して安全化できる。

CONNECT は、このメソッドに固有の特別な形式のリクエストターゲットを使用し、 トンネル宛先の host と port 番号だけをコロンで区切ったものから構成される。デフォルト port はなく、CONNECT リクエストが port を省略した authority コンポーネントを含む URI 参照に基づいている場合でも、クライアントは port 番号を送信しなければならない (4.1節)。たとえば、

CONNECT server.example.com:80 HTTP/1.1
Host: server.example.com

サーバーは、空または無効な port 番号をターゲットとする CONNECT リクエストを、通常は 400 (Bad Request) ステータス コードで応答して拒否しなければならない。

CONNECT は HTTP 接続のリクエスト/レスポンスの性質を変更するため、 特定の HTTP バージョンでは、そのセマンティクスをプロトコルの 通信路形式へ対応付ける方法が異なる場合がある。

CONNECT はプロキシへのリクエストで使用することを意図している。受信者は、 リクエストターゲットによって識別されるサーバーへ直接接続するか、 別のプロキシを使用するよう設定されている場合、CONNECT リクエストを 次の受信方向プロキシへ転送することでトンネルを確立できる。オリジンサーバーは CONNECT リクエストを受け入れてもよいが、ほとんどのオリジンサーバーは CONNECT を実装しない。

任意の 2xx (Successful) レスポンスは、 送信者 (およびすべての受信方向プロキシ) が レスポンスヘッダーセクションの直後にトンネルモードへ切り替わることを示す。そのヘッダーセクション後に受信されたデータは、 リクエストターゲットによって識別されたサーバーからのものである。成功レスポンス以外の レスポンスは、トンネルがまだ形成されていないことを示す。

トンネル仲介者がいずれか一方の接続が閉じられたことを検出すると、トンネルは閉じられる。 仲介者は、閉じられた側から来た未送信の データを他方へ送信しようとし、両方の 接続を閉じ、その後、配信されずに残ったデータをすべて破棄しなければならない。

トンネルを作成する権限を確立するためにプロキシ認証が使用される場合がある。たとえば、

CONNECT server.example.com:443 HTTP/1.1
Host: server.example.com:443
Proxy-Authorization: basic aGVsbG86d29ybGQ=

任意のサーバーへのトンネル確立には重大なリスクがあり、 特に宛先が Web トラフィックを 意図していない周知または予約済み TCP ポートの場合に危険である。たとえば、"example.com:25" への CONNECT は、 プロキシが SMTP トラフィック用に予約されたポートへ接続することを意味する。これを許可すると、 プロキシをだましてスパムメールを中継させる可能性がある。CONNECT をサポートするプロキシは、 その使用を限られた既知のポート集合、または 設定可能な安全なリクエストターゲットのリストに制限することが望ましい。

サーバーは、CONNECT への 2xx (Successful) レスポンスで、Transfer-Encoding または Content-Length ヘッダーフィールドを 送信してはならない。クライアントは、CONNECT への成功レスポンスで受信した Content-Length または Transfer-Encoding ヘッダーフィールドを無視しなければならない。

CONNECT リクエストメッセージはコンテンツを持たない。CONNECT リクエストメッセージの ヘッダーセクション後に送信されるデータの解釈は、使用中の HTTP バージョンに固有である。

CONNECT メソッドへのレスポンスはキャッシュ可能ではない。

9.3.7. OPTIONS

OPTIONS メソッドは、オリジンサーバーまたは途中の仲介者において、 ターゲットリソースに利用可能な通信オプションに関する情報を要求する。 このメソッドにより、クライアントは、リソース アクションを暗示することなく、リソースに関連するオプションや要件、 またはサーバーの能力を判断できる。

リクエストターゲットとしてアスタリスク ("*") を持つ OPTIONS リクエスト (7.1節) は、 特定のリソースではなくサーバー全体に適用される。サーバーの 通信オプションは通常リソースに依存するため、"*" リクエストは 「ping」または「no-op」型のメソッドとしてのみ有用であり、 クライアントがサーバーの能力をテストできること以外は何もしない。たとえば、これは HTTP/1.1 への適合 (または非適合) についてプロキシをテストするために使用できる。

リクエストターゲットがアスタリスクでない場合、OPTIONS リクエストは ターゲットリソースとの通信時に利用可能なオプションに適用される。

OPTIONS への成功レスポンスを生成するサーバーは、 サーバーによって実装され、ターゲットリソースに 適用可能な任意機能を示し得るヘッダー (例: Allow) を、この仕様で定義されていない潜在的な拡張も含めて 送信することが望ましい。レスポンスコンテンツがある場合、通信 オプションを機械可読または人間可読な表現で記述する場合もある。そのような 表現の標準形式はこの仕様では定義しないが、将来の HTTP 拡張によって定義される場合がある。

クライアントは、リクエストチェーン内の 特定の受信者をターゲットとするため、OPTIONS リクエスト内で Max-Forwards ヘッダーフィールドを送信してもよい (7.6.2節 を参照)。 プロキシは、そのリクエストが Max-Forwards フィールドとともに受信された場合を除き、 リクエスト転送中に Max-Forwards ヘッダーフィールドを生成してはならない。

コンテンツを含む OPTIONS リクエストを生成するクライアントは、その表現のメディア タイプを記述する有効な Content-Type ヘッダーフィールドを送信しなければならない。この仕様では、そのようなコンテンツの用途を定義していないことに注意すること。

OPTIONS メソッドへのレスポンスはキャッシュ可能ではない。

9.3.8. TRACE

TRACE メソッドは、リクエスト メッセージのリモートなアプリケーションレベルのループバックを要求する。リクエストの最終受信者は、 以下で説明するいくつかのフィールドを除外して受信したメッセージを、200 (OK) レスポンスの コンテンツとしてクライアントへ反映することが望ましい。 "message/http" 形式 ( [HTTP/1.1] の 10.1節) は、その方法の一つである。 最終受信者は、オリジンサーバー、またはリクエスト内で Max-Forwards 値 0 (0) を最初に受信するサーバーのいずれかである (7.6.2節)。

クライアントは、レスポンスによって開示される可能性のある 機密データを含むフィールドを TRACE リクエスト内に生成してはならない。たとえば、 ユーザーエージェントが保存されたユーザー資格情報 (11節) または Cookie [COOKIE] を TRACE リクエストで送信するのは愚かなことである。リクエストの最終受信者は、 レスポンスコンテンツを生成するとき、機密データを含む可能性の高い リクエストフィールドを除外することが望ましい。

TRACE により、クライアントはリクエスト チェーンの反対側で何が受信されているかを確認し、そのデータをテストまたは診断情報に使用できる。Via ヘッダーフィールド (7.6.3節) の値は、 リクエストチェーンの追跡として機能するため特に有用である。Max-Forwards ヘッダーフィールドを使用すると、 クライアントはリクエストチェーンの長さを制限でき、 メッセージを無限ループで転送しているプロキシチェーンをテストする際に役立つ。

クライアントは TRACE リクエスト内にコンテンツを送信してはならない。

TRACE メソッドへのレスポンスはキャッシュ可能ではない。

10. メッセージ コンテキスト

10.1. リクエストコンテキストフィールド

以下のリクエストヘッダーフィールドは、リクエストの背後にある ユーザー、ユーザーエージェント、およびリソースに関する情報を含め、 リクエストコンテキストについて追加情報を提供する。

10.1.1. Expect

リクエスト内の "Expect" ヘッダーフィールドは、このリクエストを 適切に処理するためにサーバーがサポートする必要がある特定の振る舞いの集合 (期待) を示す。

Expect フィールド値は大文字小文字を区別しない。

この仕様で定義される唯一の期待は "100-continue" である (定義された パラメーターはない)。

100-continue 以外のメンバーを含む Expect フィールド値を受信したサーバーは、 予期しない期待を満たせないことを示すため、 417 (Expectation Failed) ステータスコードで応答してもよい。

100-continue 期待は、クライアントがこのリクエストで (おそらく大きな) コンテンツを送信しようとしており、 メソッド、ターゲット URI、およびヘッダーフィールドだけでは直ちに 成功、リダイレクト、またはエラーレスポンスを引き起こすのに十分でない場合、100 (Continue) 暫定レスポンスを受信したいことを受信者へ知らせる。 これによりクライアントは、実際に送信する前に コンテンツを送信する価値があるという指示を待つことができ、 データが巨大な場合や、クライアントがエラーの可能性が高いと予想する場合 (例: 以前に検証された認証資格情報なしで、 初めて状態変更メソッドを送信する場合) に効率を改善できる。

たとえば、次で始まるリクエストは

PUT /somewhere/fun HTTP/1.1
Host: origin.example.com
Content-Type: video/h264
Content-Length: 1234567890987
Expect: 100-continue

クライアントが不要なデータ転送で 通信路を満たし始める前に、オリジンサーバーが 401 (Unauthorized) や 405 (Method Not Allowed) などのエラーメッセージで即座に応答できるようにする。

クライアントに対する要件:

  • クライアントは、コンテンツを含まない リクエストで 100-continue 期待を生成してはならない。
  • リクエストコンテンツを送信する前に 100 (Continue) レスポンスを待つクライアントは、100-continue 期待を含む Expect ヘッダーフィールドを送信しなければならない。
  • 100-continue 期待を送信するクライアントは、特定の 時間待つ必要はない。そのようなクライアントは、まだレスポンスを受信していなくても コンテンツの送信を続けてもよい。さらに、 100 (Continue) レスポンスは HTTP/1.0 仲介者を通じて送信できないため、そのようなクライアントは、コンテンツ送信前に 無期限に待たないことが望ましい。
  • 100-continue 期待を含むリクエストへのレスポンスとして 417 (Expectation Failed) ステータスコードを受信したクライアントは、 100-continue 期待なしでそのリクエストを繰り返すことが望ましい。 417 レスポンスは単にレスポンスチェーンが期待をサポートしていない (例: HTTP/1.0 サーバーを通過する) ことを示すためである。

サーバーに対する要件:

  • HTTP/1.0 リクエストで 100-continue 期待を受信したサーバーは、 その期待を無視しなければならない。
  • 対応するリクエストのコンテンツの一部または 全部をすでに受信している場合、またはフレーミングが コンテンツがないことを示す場合、サーバーは 100 (Continue) レスポンスの送信を省略してもよい。
  • 100 (Continue) レスポンスを送信するサーバーは、接続が早期に閉じられない限り、 リクエストコンテンツを受信して処理した後、最終ステータスコードを 最終的に送信しなければならない。
  • リクエストコンテンツ全体を読み取る前に最終ステータスコードで応答するサーバーは、 接続を閉じる予定か (例: [HTTP/1.1] の 9.6節 を参照)、 リクエストコンテンツの読み取りを続ける予定かを示すことが望ましい。

100-continue 期待と、その後にリクエストコンテンツが続くことを示す 完全なヘッダーセクション、メソッド、およびターゲット URI を持つ HTTP/1.1 (またはそれ以降) のリクエストを受信した場合、オリジンサーバーは 次のいずれかを送信しなければならない:

  • メソッド、ターゲット URI、およびヘッダーフィールドだけを調べて ステータスを判断できる場合、最終ステータスコードを持つ即時レスポンス、または
  • クライアントにリクエストコンテンツの送信を促すための即時 100 (Continue) レスポンス。

オリジンサーバーは 100 (Continue) レスポンスを送信する前に コンテンツを待ってはならない。

100-continue 期待を含み、 リクエストコンテンツが続くことを示す完全なヘッダーセクション、メソッド、およびターゲット URI を持つ HTTP/1.1 (またはそれ以降) のリクエストを受信した場合、プロキシは次のいずれかを行わなければならない:

  • メソッド、ターゲット URI、およびヘッダーフィールドだけを調べて ステータスを判断できる場合、最終ステータスコードを持つ即時レスポンスを送信する、または
  • 対応する リクエスト行およびヘッダーセクションを次の受信方向サーバーへ送信して、リクエストをオリジンサーバーへ転送する。

プロキシが (設定または過去のやり取りから) 次の受信方向 サーバーが HTTP/1.0 だけをサポートすると考える場合、プロキシは、 クライアントにコンテンツの送信開始を促すため、即時 100 (Continue) レスポンスを 生成してもよい。

10.1.2. From

"From" ヘッダーフィールドは、リクエストを行うユーザーエージェントを 制御する人間のユーザーのインターネットメールアドレスを含む。このアドレスは、 [RFC5322] の 3.4節 の "mailbox" で定義されるように、機械で利用可能であるべきである:

  From    = mailbox

  mailbox = <mailbox, see [RFC5322], Section 3.4>

例:

From: spider-admin@example.org

From ヘッダーフィールドがロボットではないユーザーエージェントによって送信されることはまれである。 ユーザーエージェントは、ユーザーによる明示的な 設定なしに From ヘッダーフィールドを送信しないことが望ましい。 これはユーザーのプライバシー上の 利益またはサイトのセキュリティポリシーと競合する可能性があるためである。

ロボット型ユーザーエージェントは、ロボットが過剰な、不要な、または無効な リクエストを送信するなど、サーバーで問題が発生した場合、 ロボットの実行責任者へ連絡できるよう、有効な From ヘッダーフィールドを送信することが望ましい。

サーバーは From ヘッダーフィールドをアクセス 制御または認証に使用しないことが望ましい。その値はリクエストを 受信または観測する誰にでも見えることが想定され、プライバシーを期待せずにログファイルやエラー レポートへ記録されることが多いためである。

10.1.3. Referer

"Referer" [原文どおり] ヘッダーフィールドにより、ユーザーエージェントは ターゲット URI を取得した元のリソースの URI 参照を指定できる (すなわち "referrer" だが、フィールド名は誤記されている)。 Referer フィールド値を生成するとき、ユーザー エージェントは URI 参照 [URI] の fragment および userinfo コンポーネントがある場合、それらを含めてはならない。

フィールド値は absolute-URI または partial-URI のいずれかである。後者の場合 (4節)、参照される URI は ターゲット URI に相対である ([URI], 5節)。

Referer ヘッダーフィールドにより、サーバーは簡単な解析、 ログ記録、最適化されたキャッシュなどのために他のリソースへのバックリンクを生成できる。また、 保守のために古いリンクや 誤入力されたリンクを発見できる。一部のサーバーは Referer ヘッダー フィールドを、他のサイトからのリンク (いわゆる「ディープリンク」) を拒否したり、 クロスサイトリクエストフォージェリ (CSRF) を制限したりする手段として使用するが、すべてのリクエストがそれを含むわけではない。

例:

Referer: http://www.example.org/hypertext/Overview.html

ターゲット URI が自身の URI を持たないソースから取得された場合 (例: ユーザーのキーボードからの入力、またはユーザーのブックマーク/お気に入り内のエントリー)、 ユーザーエージェントは Referer ヘッダーフィールドを除外するか、 値 "about:blank" で送信しなければならない。

Referer ヘッダーフィールド値は、参照元 リソースの完全な URI を伝える必要はない。ユーザーエージェントは、参照元 オリジン以外の部分を切り詰めてもよい。

Referer ヘッダーフィールドは、参照元 リソースの識別子が個人情報 (アカウント名など) や 機密であることを意図したリソース (ファイアウォールの背後、または安全化されたサービスの 内部など) を明らかにする場合、リクエストコンテキストまたはユーザーの閲覧履歴に関する情報を 明らかにする可能性があり、プライバシー上の懸念となる。ほとんどの汎用ユーザーエージェントは、 参照元リソースがローカルの "file" または "data" URI の場合、Referer ヘッダーフィールドを送信しない。参照元リソースが 安全なプロトコルでアクセスされ、リクエストターゲットのオリジンが 参照元リソースのものと異なる場合、参照元リソースが Referer の送信を明示的に許可していない限り、ユーザー エージェントは Referer ヘッダーフィールドを送信しないことが望ましい。 参照元リソースが安全なプロトコルでアクセスされた場合、ユーザーエージェントは安全でない HTTP リクエストで Referer ヘッダーフィールドを送信してはならない。追加の セキュリティ上の考慮事項については 17.9節 を参照すること。

一部の仲介者は、送信リクエストから Referer ヘッダーフィールドを 無差別に削除することが知られている。これは、 CSRF 攻撃に対する保護を妨げるという不幸な副作用を持ち、その方がユーザーにはるかに有害となり得る。 Referer 内の情報開示を制限したい 仲介者およびユーザーエージェント拡張は、内部ドメイン名を仮名で置き換えたり、 query や path コンポーネントを切り詰めたりするなど、特定の編集に変更を限定するべきである。フィールド値が ターゲット URI と同じ scheme および host を共有する場合、仲介者は Referer ヘッダーフィールドを変更または削除しないことが望ましい。

10.1.4. TE

"TE" ヘッダーフィールドは、transfer coding およびトレーラーセクションに関するクライアントの能力を記述する。

6.5節 で説明されるように、 リクエストで送信される "trailers" メンバーを持つ TE フィールドは、クライアントがトレーラーフィールドを 破棄しないことを示す。

TE は HTTP/1.1 内でも、クライアントがレスポンスで どの transfer coding を受け入れられるかサーバーへ通知するために使用される。公開時点では、HTTP/1.1 だけが transfer coding を使用する ([HTTP/1.1] の 7節 を参照)。

TE フィールド値はメンバーのリストであり、各メンバー ("trailers" を除く) は、 その transfer coding に対する クライアントの相対的な優先度を示す任意の重み (12.4.2節) と、その transfer coding 用の任意パラメーターを持つ transfer coding 名トークンから構成される。

TE の送信者は、仲介者に このフィールドを転送しないよう知らせるため、Connection ヘッダーフィールド (7.6.1節) 内で "TE" connection option も送信しなければならない。

10.1.5. User-Agent

"User-Agent" ヘッダーフィールドは、リクエストを生成したユーザーエージェントに関する 情報を含み、報告された 相互運用性問題の範囲を特定する助け、特定の ユーザーエージェントの制限を回避するための対応またはレスポンスの調整、ブラウザーまたはオペレーティングシステム使用状況の解析によく使用される。 特別にそうしないよう設定されていない限り、ユーザーエージェントは各 リクエストで User-Agent ヘッダーフィールドを送信することが望ましい。

User-Agent フィールド値は一つ以上の product 識別子から構成され、それぞれの後に 0 個以上のコメント (5.6.5節) が続き、 全体としてユーザーエージェントソフトウェアおよびその重要なサブプロダクトを識別する。 慣例として、product 識別子は、 ユーザーエージェントソフトウェアを識別する上での重要度が高い順に列挙される。各 product 識別子は 名前と任意のバージョンから構成される。

送信者は、生成する product 識別子を製品の 識別に必要なものへ制限することが望ましく、product 識別子内に広告またはその他の不要な情報を生成してはならない。 送信者は、バージョン 識別子ではない情報を product-version に生成しないことが望ましい (すなわち、同じ製品名の連続するバージョンは、 product 識別子の product-version 部分だけが異なるべきである)。

例:

User-Agent: CERN-LineMode/2.15 libwww/2.17b3

ユーザーエージェントは、不必要に細かい詳細を含む User-Agent ヘッダーフィールドを生成しないことが望ましく、第三者による サブプロダクトの追加を制限することが望ましい。過度に長く詳細な User-Agent フィールド値はリクエスト遅延と、ユーザーが望まない形で識別される ("fingerprinting") リスクを増加させる。

同様に、実装には、他の 実装の product トークンを使用して互換性を宣言しないことが推奨される。これは フィールドの目的を回避するためである。ユーザーエージェントが別のユーザーエージェントになりすました場合、 受信者は、実際に使用されている ユーザーエージェントではうまく動作しない可能性があっても、ユーザーがその識別されたユーザーエージェント向けに調整されたレスポンスを 意図的に望んでいると仮定できる。

10.2. レスポンスコンテキストフィールド

以下のレスポンスヘッダーフィールドは、ステータスコードによって暗示されるものを超えて、 サーバー、ターゲットリソース、または関連する リソースに関する情報を含め、レスポンスについて追加情報を提供する。

10.2.1. Allow

"Allow" ヘッダーフィールドは、ターゲットリソースによってサポートされるものとして通知されたメソッドの集合を列挙する。この フィールドの目的は、リソースに関連する有効なリクエストメソッドを 受信者へ通知することだけである。

使用例:

Allow: GET, HEAD, PUT

実際に許可されるメソッドの集合は、各 リクエスト時にオリジンサーバーによって定義される。オリジンサーバーは 405 (Method Not Allowed) レスポンスで Allow ヘッダーフィールドを生成しなければならず、 その他の任意のレスポンスでもそうしてもよい。空の Allow フィールド値は リソースがいかなるメソッドも許可しないことを示し、設定によってリソースが一時的に無効化された場合、 405 レスポンスで発生する可能性がある。

プロキシは Allow ヘッダーフィールドを変更してはならない。 汎用メッセージ処理規則に従って処理するために、 示されたすべてのメソッドを理解する必要はない。

10.2.2. Location

"Location" ヘッダーフィールドは、一部のレスポンスで、レスポンスに関連する 特定のリソースを参照するために使用される。関係の型は、 リクエストメソッドとステータスコードセマンティクスの組み合わせによって定義される。

フィールド値は単一の URI-reference から構成される。 相対参照の形式である場合 ([URI], 4.2節)、 最終値はターゲット URI に対して解決することで計算される ([URI], 5節)。

201 (Created) レスポンスでは、Location 値はリクエストによって作成された主要なリソースを参照する。3xx (Redirection) レスポンスでは、Location 値はリクエストを自動的にリダイレクトするための優先 ターゲットリソースを参照する。

3xx (Redirection) レスポンスで提供された Location 値に fragment コンポーネントがない場合、ユーザーエージェントは、 その値がターゲット URI の生成に使用された URI 参照の fragment コンポーネントを継承するかのようにリダイレクトを処理しなければならない (すなわち、リダイレクトは元の参照の fragment があればそれを継承する)。

たとえば、URI 参照 "http://www.example.org/~tim" に対して生成された GET リクエストは、次のヘッダーフィールドを含む 303 (See Other) レスポンスを生じる場合がある:

Location: /People.html#tim

これはユーザーエージェントが "http://www.example.org/People.html#tim" へリダイレクトすることを示唆する。

同様に、URI 参照 "http://www.example.org/index.html#larry" に対して生成された GET リクエストは、次のヘッダーフィールドを含む 301 (Moved Permanently) レスポンスを生じる場合がある:

Location: http://www.example.net/index.html

これはユーザーエージェントが "http://www.example.net/index.html#larry" へリダイレクトし、元の fragment 識別子を保持することを示唆する。

Location 値内の fragment 識別子が 適切でない状況もある。たとえば、201 (Created) レスポンス内の Location ヘッダーフィールドは、 作成されたリソースに固有の URI を提供することを意図している。

10.2.3. Retry-After

サーバーは、ユーザーエージェントが後続リクエストを行う前に どの程度待つべきかを示すため、"Retry-After" ヘッダーフィールドを送信する。503 (Service Unavailable) レスポンスとともに送信された場合、Retry-After は サービスがクライアントに対してどの程度利用不能であると予想されるかを示す。任意の 3xx (Redirection) レスポンスとともに送信された場合、Retry-After は ユーザーエージェントがリダイレクトされた リクエストを発行する前に待つよう求められる最小時間を示す。

Retry-After フィールド値は、HTTP-date、または レスポンス受信後に遅延する秒数のいずれかにできる。

delay-seconds 値は非負の 10 進整数であり、 秒単位の時間を表す。

使用例は二つある

Retry-After: Fri, 31 Dec 1999 23:59:59 GMT
Retry-After: 120

後者の例では、遅延は 2 分である。

10.2.4. Server

"Server" ヘッダーフィールドは、リクエストを処理するためにオリジン サーバーが使用したソフトウェアに関する情報を含み、クライアントが報告された 相互運用性問題の範囲を特定する助け、特定のサーバーの制限を 回避するための対応またはリクエストの調整、サーバーまたはオペレーティング システム使用状況の解析によく使用される。オリジンサーバーは、レスポンス内に Server ヘッダー フィールドを生成してもよい。

Server ヘッダーフィールド値は一つ以上の product 識別子から構成され、それぞれの後に 0 個以上のコメント (5.6.5節 ) が続き、全体としてオリジンサーバーソフトウェアおよびその 重要なサブプロダクトを識別する。慣例として、product 識別子は オリジンサーバーソフトウェアを識別する上での重要度が高い順に列挙される。 各 product 識別子は、10.1.5節 で定義されるように、名前と任意のバージョンから構成される。

例:

Server: CERN/3.0 libwww/2.17

オリジンサーバーは、不必要に細かい詳細を含む Server ヘッダーフィールドを生成しないことが望ましく、第三者による サブプロダクトの追加を制限することが望ましい。過度に長く詳細な Server フィールド 値はレスポンス遅延を増加させ、既知の セキュリティホールを攻撃者が発見して悪用することを (わずかに) 容易にする内部実装 詳細を明らかにする可能性がある。

11. HTTP 認証

11.1. 認証スキーム

HTTP は、拡張可能なチャレンジレスポンス認証スキームの集合を介して、 アクセス制御および認証のための一般的なフレームワークを提供する。これは、 サーバーがクライアントリクエストにチャレンジし、クライアントが認証 情報を提供するために使用できる。認証スキームの識別には、大文字小文字を区別しないトークンを使用する:

  auth-scheme    = token

一般的なフレームワークを除き、この文書では認証 スキームを規定しない。新しい認証スキームおよび既存の認証スキームは独立して規定され、 "Hypertext Transfer Protocol (HTTP) Authentication Scheme Registry" に登録するべきである。たとえば、"basic" および "digest" 認証スキームは、それぞれ [RFC7617] および [RFC7616] で定義される。

11.2. 認証パラメーター

認証スキームの後には、そのスキームによる 認証を実現するために必要な追加情報が、コンマ区切りのパラメーターリスト、または base64 エンコード情報を保持できる単一の文字列として続く。

  token68        = 1*( ALPHA / DIGIT /
                       "-" / "." / "_" / "~" / "+" / "/" ) *"="

token68 構文は、66 個の予約されていない URI 文字 ([URI]) に加えていくつかの文字を許可するため、空白を除き、 パディングの有無にかかわらず base64、base64url (URL およびファイル名で安全な アルファベット)、base32、または base16 (16 進) エンコーディングを保持できる ([RFC4648])。

認証パラメーターは名前/値ペアであり、名前トークンは 大文字小文字を区別せずに照合され、各パラメーター名はチャレンジごとに一度だけ 出現しなければならない。

  auth-param     = token BWS "=" BWS ( token / quoted-string )

パラメーター値は "token" または "quoted-string" (5.6節 ) のいずれかとして表現できる。認証スキーム定義は、 受信者が認証スキームにかかわらず汎用的な解析コンポーネントを使用できるよう、 送信者と受信者の双方について両方の表記を受け入れる必要がある。

後方互換性のため、認証スキーム定義は送信者向けの形式を 二つの変種のいずれかに制限できる。配備済み実装が 二つの形式のいずれかに遭遇すると失敗することが分かっている場合、これは重要となり得る。

11.3. チャレンジとレスポンス

401 (Unauthorized) レスポンスメッセージは、 オリジンサーバーがユーザーエージェントの認可にチャレンジするために使用し、要求されたリソースに適用可能な 少なくとも一つのチャレンジを含む WWW-Authenticate ヘッダーフィールドを含む。

407 (Proxy Authentication Required) レスポンス メッセージは、プロキシがクライアントの認可にチャレンジするために使用し、要求されたリソースについてプロキシに適用可能な 少なくとも一つのチャレンジを含む Proxy-Authenticate ヘッダーフィールドを含む。

オリジンサーバーに対して自身を認証したいユーザーエージェントは、通常は 401 (Unauthorized) を受信した後だが、必ずしもそうでなくても、 リクエストに Authorization ヘッダーフィールドを含めることで認証できる。

プロキシに対して自身を認証したいクライアントは、通常は 407 (Proxy Authentication Required) を受信した後だが、必ずしもそうでなくても、リクエストに Proxy-Authorization ヘッダーフィールドを含めることで認証できる。

11.4. 資格情報

Authorization フィールド値と Proxy-Authorization フィールド 値の両方には、レスポンスで受信したチャレンジ (過去のある時点で受信した可能性もある) に基づき、 要求されているリソースの realm に対するクライアントの資格情報が含まれる。 値を作成するとき、ユーザーエージェントは、 自身が理解する auth-scheme のうち最も安全だと考えるものを持つチャレンジを選択し、 必要に応じてユーザーから資格情報を取得して作成するべきである。ヘッダー フィールド値内で資格情報を送信することには、17.16.1節 で説明されるように、基盤となる接続の機密性に関する 重大なセキュリティ上の考慮事項が伴う。

資格情報を省略した、無効な資格情報 (例: 誤ったパスワード) を含む、 または部分的な資格情報 (例: 認証スキームが複数回の往復を必要とする場合) を含む保護対象リソースへの リクエストを受信した場合、オリジンサーバーは、 要求されたリソースに適用可能な少なくとも一つの (場合によっては新しい) チャレンジを持つ WWW-Authenticate ヘッダーフィールドを含む 401 (Unauthorized) レスポンスを送信することが望ましい。

同様に、プロキシ資格情報を省略した、または無効もしくは 部分的なプロキシ資格情報を含むリクエストを受信した場合、認証を要求するプロキシは、 プロキシに適用可能な少なくとも一つの (場合によっては新しい) チャレンジを持つ Proxy-Authenticate ヘッダーフィールド を含む 407 (Proxy Authentication Required) レスポンスを生成することが望ましい。

アクセスを得るには不十分な有効な資格情報を受信したサーバーは、 403 (Forbidden) ステータスコードで応答するべきである (15.5.4節 )。

HTTP は、アクセス認証のためにアプリケーションをこの単純なチャレンジレスポンスフレームワークに 制限しない。トランスポートレベルでの認証やメッセージカプセル化を介した認証、 および認証情報を指定する追加のヘッダーフィールドなど、 追加の機構を使用できる。ただし、そのような追加の機構は この仕様では定義されない。

ユーザー認証用のさまざまなカスタム機構は、[COOKIE] で定義される Set-Cookie および Cookie ヘッダーフィールドを、認証に関連するトークンの受け渡しに使用することに注意すること。

11.5. 保護空間 の確立

realm 認証パラメーターは、保護の範囲を示すことを望む認証 スキームによる使用のために予約されている。

保護空間は、アクセスされるサーバーのオリジン (4.3.1節 を参照) と、 存在する場合は realm 値との組み合わせによって定義される。これらの realm により、サーバー上の 保護されたリソースを一組の保護空間へ分割でき、それぞれが独自の認証 スキームや認可データベースを持つことができる。realm 値は文字列であり、一般に オリジンサーバーによって割り当てられ、認証 スキーム固有の追加セマンティクスを持つ場合がある。同じ auth-scheme だが 異なる realm を持つ複数のチャレンジをレスポンスが持てることに注意すること。

保護空間は、資格情報を自動的に 適用できるドメインを決定する。以前のリクエストが認可されている場合、ユーザーエージェントは、 認証スキーム、 パラメーター、またはユーザー設定 (設定可能な非アクティブタイムアウトなど) によって決定される期間、 その保護空間内の他のすべてのリクエストに同じ資格情報を再利用してもよい。

保護空間の範囲、したがって資格情報が 自動的に適用され得るリクエストは、追加 情報なしでは必ずしもクライアントに分からない。認証スキームは、保護空間の範囲を記述する パラメーターを定義する場合がある。認証スキームによって明示的に許可されていない限り、 単一の保護空間をそのサーバーの範囲外へ拡張することはできない。

歴史的な理由により、送信者は quoted-string 構文のみを生成しなければならない。受信者は、長い間 両方の表記を受け入れてきた既存のクライアントとの最大限の相互運用性のため、 token と quoted-string の両方の 構文をサポートする必要がある場合がある。

11.6. オリジンサーバーに対するユーザー認証

11.6.1. WWW-Authenticate

"WWW-Authenticate" レスポンスヘッダーフィールドは、ターゲットリソースに適用可能な認証スキームと パラメーターを示す。

401 (Unauthorized) レスポンスを生成するサーバーは、少なくとも一つのチャレンジを含む WWW-Authenticate ヘッダーフィールドを送信しなければならない。 サーバーは、資格情報 (または異なる資格情報) を提供すると レスポンスに影響する可能性があることを示すため、その他のレスポンスメッセージでも WWW-Authenticate ヘッダーフィールドを生成してもよい。

レスポンスを転送するプロキシは、そのレスポンス内の WWW-Authenticate ヘッダーフィールドを 変更してはならない。

フィールド値には複数のチャレンジが含まれる場合があり、 各チャレンジはコンマ区切りの 認証パラメーターのリストを含む可能性があるため、ユーザーエージェントはフィールド値の解析に特に注意することが推奨される。さらに、ヘッダーフィールド自体も 複数回出現できる。

たとえば:

WWW-Authenticate: Basic realm="simple", Newauth realm="apps",
                 type=1, title="Login to \"apps\""

このヘッダーフィールドには二つのチャレンジが含まれる。一つは realm 値が "simple" の "Basic" スキーム用で、もう一つは realm 値が "apps" の "Newauth" スキーム用である。 さらに二つの追加パラメーター、"type" および "title" も含まれる。

ただし、一部のユーザーエージェントはこの形式を認識しない。その結果、 同じフィールド行上に複数のメンバーを持つ WWW-Authenticate フィールド値の送信は相互運用できない可能性がある。

11.6.2. Authorization

"Authorization" ヘッダーフィールドにより、ユーザーエージェントは オリジンサーバーに対して自身を認証できる。通常は 401 (Unauthorized) レスポンスを受信した後だが、必ずしもそうとは限らない。その値は、 要求されているリソースの realm に対するユーザーエージェントの 認証情報を含む資格情報から構成される。

リクエストが認証され、realm が指定されている場合、 同じ資格情報はこの realm 内の他のすべてのリクエストに対して有効であると 推定される (チャレンジ値に応じて異なる資格情報や同期時計の使用など、 認証スキーム自体が別のことを要求しないと仮定する)。

リクエストを転送するプロキシは、その リクエスト内の Authorization ヘッダーフィールドを変更してはならない。 HTTP キャッシュによる Authorization ヘッダーフィールドの処理に関する詳細と要件については、 [CACHING] の 3.5節 を参照すること。

11.6.3. Authentication-Info

HTTP 認証スキームは、クライアントの認証資格情報が 受け入れられた後に情報を伝達するため、"Authentication-Info" レスポンスフィールドを使用できる。 この情報にはサーバーからの最終化メッセージ (例: サーバー認証を含めることができる) が含まれる場合がある。

フィールド値は、11.3節 で定義される "auth-param" 構文を使用するパラメーター (名前/値ペア) のリストである。この仕様では 汎用形式だけを記述し、Authentication-Info を使用する認証スキームが 個々のパラメーターを定義する。たとえば "Digest" 認証スキームは、 [RFC7616] の 3.5節 で複数のパラメーターを定義する。

Authentication-Info フィールドは、リクエストメソッドおよびステータスコードとは独立して、 任意の HTTP レスポンスで使用できる。そのセマンティクスは、対応するリクエストの Authorization ヘッダーフィールド (11.6.2節) によって示される 認証スキームによって定義される。

レスポンスを転送するプロキシは、フィールド値をいかなる方法でも変更することを許可されない。

認証スキームが 明示的に許可する場合、Authentication-Info はトレーラーフィールドとして送信できる (6.5節)。

11.7. プロキシに対するクライアント認証

11.7.1. Proxy-Authenticate

"Proxy-Authenticate" ヘッダーフィールドは、このリクエストについて プロキシに適用可能な認証スキームとパラメーターを示す少なくとも一つのチャレンジから構成される。 プロキシは、自身が生成する各 407 (Proxy Authentication Required) レスポンスで、少なくとも一つの Proxy-Authenticate ヘッダーフィールドを送信しなければならない。

WWW-Authenticate とは異なり、 Proxy-Authenticate ヘッダーフィールドは、レスポンスチェーン上の次の送信方向クライアントにのみ 適用される。これは、あるプロキシを選択したクライアントだけが 認証に必要な資格情報を持つ可能性が高いためである。ただし、同じ管理ドメイン内で複数のプロキシ、 たとえば大規模企業ネットワーク内のオフィスおよび地域キャッシュ プロキシが使用される場合、資格情報を ユーザーエージェントが生成し、消費されるまで階層を通じて渡すことが一般的である。したがって、 そのような設定では、各プロキシが同じチャレンジ集合を送信するため、Proxy-Authenticate が転送されているように 見える。

WWW-Authenticate の解析に関する考慮事項はこのヘッダーフィールドにも適用されることに注意すること。詳細については 11.6.1節 を参照。

11.7.2. Proxy-Authorization

"Proxy-Authorization" ヘッダーフィールドにより、クライアントは認証を要求する プロキシに対して自身 (またはそのユーザー) を識別できる。その値は、 プロキシや要求されているリソースの realm に対する クライアントの認証情報を含む資格情報から構成される。

Authorization とは異なり、 Proxy-Authorization ヘッダーフィールドは、Proxy-Authenticate ヘッダーフィールドを使用して認証を 要求した次の受信方向プロキシにのみ適用される。チェーン内で複数のプロキシが使用される場合、 Proxy-Authorization ヘッダーフィールドは資格情報の受信を期待していた最初の受信方向 プロキシによって消費される。プロキシは、プロキシ同士が協調して特定のリクエストを認証する 機構である場合、クライアントリクエストからの資格情報を次のプロキシへ 中継してもよい。

11.7.3. Proxy-Authentication-Info

"Proxy-Authentication-Info" レスポンスヘッダーフィールドは Authentication-Info と等価だが、 プロキシ認証 (11.3節) に適用され、そのセマンティクスは 対応するリクエストの Proxy-Authorization ヘッダーフィールド (11.7.2節) によって示される認証スキームによって定義される:

ただし、Authentication-Info とは異なり、Proxy-Authentication-Info ヘッダーフィールドは レスポンスチェーン上の次の送信方向クライアントにのみ適用される。これは、 あるプロキシを選択したクライアントだけが認証に必要な資格情報を持つ可能性が高いためである。ただし、 大規模企業ネットワーク内のオフィスおよび地域キャッシュプロキシなど、 同じ管理ドメイン内で複数のプロキシが使用される場合、 資格情報をユーザーエージェントが生成し、消費されるまで階層を通じて渡すことが一般的である。 したがって、そのような設定では、各プロキシが 同じフィールド値を送信するため、Proxy-Authentication-Info が転送されているように見える。

認証スキームが 明示的に許可する場合、Proxy-Authentication-Info はトレーラーフィールドとして送信できる (6.5節)。

12. コンテンツネゴシエーション

レスポンスが成功またはエラーを示すコンテンツを伝える場合、 オリジンサーバーにはその情報を表現する複数の方法があることが多い。たとえば、 異なる形式、言語、またはエンコーディングで表現できる。同様に、異なるユーザーまたはユーザーエージェントは、 利用可能な表現のうちどれを配信するのが最適かに影響し得る 異なる能力、特性、または設定を持つ場合がある。このため、HTTP は コンテンツネゴシエーションの機構を提供する。

この仕様では、プロトコル内で可視化できるコンテンツネゴシエーションの三つのパターンを定義する。 ユーザーエージェントが表明した設定に基づいてサーバーが表現を選択する「プロアクティブ」 ネゴシエーション、サーバーがユーザーエージェントに選択させる表現リストを提供する「リアクティブ」 ネゴシエーション、およびサーバーが過去のレスポンスで表明した設定に基づき、 ユーザーエージェントが将来のリクエスト用の表現を選択する「リクエストコンテンツ」 ネゴシエーションである。

コンテンツネゴシエーションのその他のパターンには、ユーザーエージェントパラメーターに基づいて 選択的にレンダリングされる複数の部分から表現が構成される「条件付きコンテンツ」、 ユーザーエージェント特性に基づいて追加の (より 具体的な) リクエストを行うスクリプトを表現が含む「アクティブコンテンツ」、および コンテンツ選択が仲介者によって行われる "Transparent Content Negotiation" ([RFC2295]) がある。これらのパターンは相互排他的ではなく、 それぞれ適用可能性と実用性にトレードオフがある。

いずれの場合も、HTTP はリソースセマンティクスを認識しないことに注意すること。 オリジンサーバーが時間の経過およびコンテンツネゴシエーションのさまざまな次元にわたって リクエストへ応答する一貫性、したがって時間の経過に伴うリソースの観測された表現の「同一性」は、 それらのレスポンスを選択または生成する主体またはアルゴリズムによって完全に決定される。

12.1. プロアクティブネゴシエーション

ユーザーエージェントがリクエスト内でコンテンツネゴシエーション設定を送信し、 サーバー上のアルゴリズムに優先される表現の選択を促す場合、これを プロアクティブネゴシエーション (別名 サーバー駆動ネゴシエーション) と呼ぶ。 選択は、レスポンスに利用可能な表現 (言語、content coding などの 変動し得る次元) と、以下の明示的なネゴシエーションヘッダー フィールドおよびクライアントのネットワークアドレスや User-Agent フィールドの一部などの 暗黙的な特性を含む、リクエストで提供されたさまざまな情報との比較に基づく。

プロアクティブネゴシエーションは、利用可能な表現の中から選択するアルゴリズムを ユーザーエージェントに説明することが難しい場合、またはサーバーが 最初のレスポンスとともに「最善の推測」をユーザーエージェントへ送信したい場合に有利である (その「最善の推測」がユーザーに十分であれば、後続 リクエストの往復遅延を回避できる)。サーバーの推測を改善するため、ユーザーエージェントは 自身の設定を記述するリクエストヘッダーフィールドを送信してもよい。

プロアクティブネゴシエーションには重大な欠点がある:

  • 任意のユーザーにとって何が「最善」かをサーバーが正確に判断することは不可能である。 そのためにはユーザーエージェントの能力と レスポンスの意図された用途 (例: ユーザーは画面で 表示したいのか、紙に印刷したいのか?) の両方について完全な知識が必要になるためである。
  • ユーザーエージェントがすべてのリクエストで能力を記述することは、 非常に非効率になり得る (複数の 表現を持つレスポンスはごく一部しかないため) だけでなく、ユーザーのプライバシーに対する潜在的なリスクにもなる。
  • オリジンサーバーの実装および リクエストへのレスポンス生成アルゴリズムを複雑にする。および、
  • 共有キャッシュでのレスポンス再利用性を制限する。

ユーザーエージェントは、プロアクティブネゴシエーション設定が常に尊重されることには依存できない。 オリジンサーバーが要求された リソースにプロアクティブネゴシエーションを実装していない場合や、ユーザー エージェントの設定に準拠しないレスポンスを送信する方が 406 (Not Acceptable) レスポンスを送信するより良いと判断する場合があるためである。

Vary ヘッダーフィールド (12.5.5節) は、選択アルゴリズムで リクエスト情報のどの部分が使用されたかを示すため、 プロアクティブネゴシエーションの対象となるレスポンスでよく送信される。

リクエストヘッダーフィールド Accept、Accept-Charset、Accept-Encoding、および Accept-Language は、 ユーザーエージェントがレスポンスコンテンツの プロアクティブ ネゴシエーションを行うために以下で定義される。これらのフィールドで送信される設定は、 ターゲットリソースの表現、 エラーまたは処理状態の表現、および場合によってはプロトコル内に現れるさまざまな テキスト文字列を含む、レスポンス内のすべてのコンテンツに適用される。

12.2. リアクティブネゴシエーション

リアクティブネゴシエーション (別名 エージェント駆動ネゴシエーション) では、 コンテンツの選択 (ステータスコードにかかわらず) は、最初のレスポンスを受信した後に ユーザーエージェントによって行われる。リアクティブネゴシエーションの機構は、 代替表現への参照リストという単純なものである場合もある。

ユーザーエージェントが最初のレスポンスコンテンツに満足しない場合、 一つ以上の代替リソースに GET リクエストを実行して別の 表現を取得できる。そのような代替の選択は、自動的に (ユーザー エージェントによって) または手動で (例: ユーザーがハイパーテキストメニューから選択) 行われる場合がある。

サーバーは、代替リスト以外の最初の表現を送信しないことを選択し、 それによってユーザーエージェントによるリアクティブネゴシエーションが 推奨されることを示す場合がある。たとえば、300 (Multiple Choices) および 406 (Not Acceptable) ステータスコードを持つレスポンスに列挙された代替には、 利用可能な表現に関する情報が含まれ、ユーザーまたはユーザーエージェントが 選択を行って対応できるようにする。

リアクティブネゴシエーションは、レスポンスが一般的に使用される 次元 (型、言語、エンコーディングなど) によって変化する場合、 オリジンサーバーがリクエストを調べてもユーザーエージェントの能力を判断できない場合、 および一般に公開キャッシュを使用してサーバー負荷を分散しネットワーク使用量を減らす場合に有利である。

リアクティブネゴシエーションには、代替リストを ユーザーエージェントへ送信する必要があり、ヘッダーセクションで送信するとユーザーが感じる遅延が悪化すること、 および代替表現を取得するために 2 回目のリクエストが必要になるという欠点がある。 さらに、この仕様は自動 選択をサポートする機構を定義しないが、そのような機構の開発を妨げるものではない。

12.3. リクエストコンテンツネゴシエーション

コンテンツネゴシエーション設定がサーバーのレスポンス内で送信される場合、列挙された 設定は、そのリソースへの後続リクエスト用の適切なコンテンツの選択に 影響を与えることを意図しているため、リクエストコンテンツネゴシエーションと呼ばれる。 たとえば、Accept (12.5.1節) および Accept-Encoding (12.5.3節) ヘッダーフィールドをレスポンスで送信して、 そのリソースへの後続リクエストで優先されるメディアタイプと content coding を示すことができる。

同様に、[RFC5789] の 3.1節 は "Accept-Patch" レスポンスヘッダーフィールドを定義し、PATCH リクエストで どのコンテンツタイプが受け入れられるかを検出できるようにする。

12.4. コンテンツネゴシエーションフィールドの特性

12.4.1. 不在

各コンテンツネゴシエーションフィールドについて、そのフィールドを含まないリクエストは、 送信者がそのネゴシエーション次元について設定を持たないことを意味する。

コンテンツネゴシエーションヘッダーフィールドがリクエストに存在し、 レスポンスに利用可能な表現のどれも それに従って受け入れ可能とみなせない場合、オリジンサーバーは、406 (Not Acceptable) レスポンスを送信してヘッダーフィールドを尊重するか、 そのリクエストヘッダーフィールドについて レスポンスがコンテンツネゴシエーションの対象ではないかのように扱ってヘッダーフィールドを無視できる。ただし、これは クライアントがその表現を使用できることを意味しない。

12.4.2. 品質値

この仕様で定義されるコンテンツネゴシエーションフィールドは、 関連する種類のコンテンツに対する設定へ相対的な「重み」を割り当てるため、 "q" (大文字小文字を区別しない) という共通パラメーターを使用する。この重みは「品質値」(または "qvalue") と呼ばれる。これは、同じパラメーター名がサーバー設定内で、 リソースについて選択可能なさまざまな表現の相対的な品質へ 重みを割り当てるためにもよく使用されるためである。

重みは 0 から 1 の範囲の実数へ正規化され、0.001 が 最も優先度が低く、1 が最も優先度が高い。値 0 は「 受け入れ不可」を意味する。"q" パラメーターが存在しない場合、デフォルトの重みは 1 である。

  weight = OWS ";" OWS "q=" qvalue
  qvalue = ( "0" [ "." 0*3DIGIT ] )
         / ( "1" [ "." 0*3("0") ] )

qvalue の送信者は、小数点以下に 3 桁を超える数字を生成してはならない。 これらの値のユーザー設定も同様に制限するべきである。

12.4.3. ワイルドカード値

これらのヘッダーフィールドのほとんどは、示されている場合、 指定されていない値を選択するためのワイルドカード値 ("*") を定義する。 ワイルドカードが存在しない場合、フィールド内で明示的に 言及されていない値は受け入れ不可とみなされる。Vary 内では、ワイルドカード値は変動に制限がないことを意味する。

12.5. コンテンツネゴシエーションフィールド

12.5.1. Accept

"Accept" ヘッダーフィールドは、レスポンスメディアタイプに関する設定を ユーザーエージェントが指定するために使用できる。たとえば Accept ヘッダーフィールドは、 インライン画像へのリクエストの場合のように、 リクエストが特定の少数の望ましい型に限定されていることを示すために使用できる。

サーバーからレスポンスで送信された場合、Accept は、同じリソースへの 後続リクエストのコンテンツでどのコンテンツ タイプが優先されるかについて情報を提供する。

  Accept = #( media-range [ weight ] )

  media-range    = ( "*/*"
                     / ( type "/" "*" )
                     / ( type "/" subtype )
                   ) parameters

アスタリスク "*" 文字は、メディアタイプを範囲へグループ化するために使用され、 "*/*" はすべてのメディアタイプを、"type/*" はその type のすべての subtype を示す。 media-range は、その範囲に適用可能なメディアタイプパラメーターを含むことができる。

各 media-range の後には、適用可能な任意のメディアタイプパラメーター (例: charset) が続き、その後、 相対的な重みを示す任意の "q" パラメーター (12.4.2節) が続く場合がある。

以前の仕様では、weight パラメーターの後に追加の拡張パラメーターが現れることを許可していた。 accept 拡張文法 (accept-params、accept-ext) は、 定義が複雑で、実際には使用されておらず、 新しいヘッダーフィールドを介した方が容易に配備できるため削除された。weight を使用する送信者は、 "q" を最後に (すべての media-range パラメーターの後に) 送信することが望ましい。 受信者は、パラメーター順序にかかわらず、"q" という名前のパラメーターを weight として処理することが望ましい。

例

Accept: audio/*; q=0.2, audio/basic

は、「audio/basic を優先するが、品質を 80% 下げてもなお利用可能な中で最善なら 任意の audio タイプを送信してほしい」と解釈される。

より複雑な例:

Accept: text/plain; q=0.5, text/html,
       text/x-dvi; q=0.8, text/x-c

言葉で表すと、「text/html と text/x-c が同等に 優先されるメディアタイプだが、存在しない場合は text/x-dvi 表現を送信し、それも存在しない場合は text/plain 表現を送信する」と解釈される。

メディア範囲は、より具体的なメディア範囲または特定のメディアタイプによって上書きできる。 特定の type に複数のメディア範囲が適用される場合、最も具体的な参照が 優先される。たとえば、

Accept: text/*, text/plain, text/plain;format=flowed, */*

は次の優先順位を持つ:

  1. text/plain;format=flowed
  2. text/plain
  3. text/*
  4. */*

特定の type に関連付けられるメディアタイプ品質係数は、 その type に一致する最も優先順位の高いメディア範囲を見つけることで決定される。たとえば、

Accept: text/*;q=0.3, text/plain;q=0.7, text/plain;format=flowed,
       text/plain;format=fixed;q=0.4, */*;q=0.5

は次の値を関連付ける:

表 5
メディアタイプ 品質値
text/plain;format=flowed 1
text/plain 0.7
text/html 0.3
image/jpeg 0.5
text/plain;format=fixed 0.4
text/html;level=3 0.7

12.5.2. Accept-Charset

"Accept-Charset" ヘッダーフィールドは、テキストのレスポンスコンテンツでの charset に対する設定を示すため、ユーザーエージェントが送信できる。たとえば、このフィールドにより、 より包括的または特殊用途の charset を理解できる ユーザーエージェントが、それらの charset で情報を表現できるオリジンサーバーへ その能力を通知できる。

  Accept-Charset = #( ( token / "*" ) [ weight ] )

Charset 名は 8.3.2節 で定義される。 ユーザーエージェントは、12.4.2節 で定義されるように、各 charset に品質値を関連付け、 その charset に対するユーザーの相対的な設定を示してもよい。例:

Accept-Charset: iso-8859-5, unicode-1-1;q=0.8

Accept-Charset ヘッダーフィールド内に特殊値 "*" が存在する場合、 フィールド内の他の箇所で言及されていないすべての charset に一致する。

12.5.3. Accept-Encoding

"Accept-Encoding" ヘッダーフィールドは、content coding (8.4.1節 ) の使用に関する設定を示すために使用できる。

ユーザーエージェントがリクエストで送信した場合、Accept-Encoding はレスポンスで 受け入れ可能な content coding を示す。

サーバーがレスポンスで送信した場合、Accept-Encoding は、同じ リソースへの後続リクエストのコンテンツでどの content coding が優先されるかについて情報を提供する。

エンコーディングなしが優先される場合を伝えるため、 "identity" トークンが「エンコーディングなし」の同義語として使用される。

  Accept-Encoding  = #( codings [ weight ] )
  codings          = content-coding / "identity" / "*"

各 codings 値には、12.4.2節 で定義されるように、そのエンコーディングに対する設定を表す関連品質値 (weight) を与えてもよい。Accept-Encoding フィールド内のアスタリスク "*" 記号は、フィールドで明示的に列挙されていない利用可能な任意の content coding に一致する。

例:

Accept-Encoding: compress, gzip
Accept-Encoding:
Accept-Encoding: *
Accept-Encoding: compress;q=0.5, gzip;q=1.0
Accept-Encoding: gzip;q=1.0, identity; q=0.5, *;q=0

サーバーは、特定の表現の content coding が受け入れ可能かどうかを 次の規則でテストする:

  1. リクエストに Accept-Encoding ヘッダーフィールドがない場合、任意の content coding が ユーザーエージェントに受け入れ可能とみなされる。
  2. 表現に content coding がない場合、 Accept-Encoding ヘッダーフィールドで "identity;q=0" または "identity" に対するより具体的なエントリーなしの "*;q=0" によって明示的に除外されない限り、デフォルトで受け入れ可能である。
  3. 表現の content coding が Accept-Encoding フィールド値に列挙された content coding の一つである場合、qvalue 0 が伴わない限り受け入れ可能である。 (12.4.2節 で定義されるように、qvalue 0 は「 受け入れ不可」を意味する。)

表現は複数の content coding でエンコードされる場合がある。ただし、ほとんどの content coding は同じ目的 (例: データ 圧縮) を達成する代替手段である。同じ目的を持つ複数の content coding から選択するときは、 0 ではない qvalue が最も高い受け入れ可能な content coding が 優先される。

空のフィールド値を持つ Accept-Encoding ヘッダーフィールドは、 ユーザーエージェントがレスポンスでいかなる content coding も望まないことを意味する。 空でない Accept-Encoding ヘッダーフィールドがリクエストに存在し、 レスポンスに利用可能な表現のいずれも受け入れ可能として列挙された content coding を持たない場合、 identity coding が受け入れ不可と示されていない限り、オリジンサーバーは content coding なしでレスポンスを送信することが望ましい。

Accept-Encoding ヘッダーフィールドがレスポンスに存在する場合、それは関連する リクエストでリソースがどの content coding を受け入れる意思があったかを示す。 フィールド値はリクエストの場合と同じ方法で評価される。

この情報は関連するリクエスト固有であることに注意すること。同じサーバー上の他のリソースでは サポートされるエンコーディングの集合が異なる場合があり、 時間とともに変化したり、リクエストの他の側面 (リクエストメソッドなど) に依存したりする可能性がある。

サポートされていない content coding のためにリクエストを失敗させるサーバーは、 415 (Unsupported Media Type) ステータスで応答し、 そのレスポンスに Accept-Encoding ヘッダーフィールドを含め、 クライアントが content coding に関する問題とメディアタイプに関する問題を 区別できるようにするべきである。メディアタイプに関する問題との混乱を 避けるため、content coding と無関係な理由で 415 ステータスによりリクエストを失敗させるサーバーは Accept-Encoding ヘッダーフィールドを含めてはならない。

Accept-Encoding の最も一般的な用途は、クライアントが content coding を楽観的に使用したことへの レスポンスとして、415 (Unsupported Media Type) ステータスコードを持つレスポンスで使用することである。 ただし、ヘッダーフィールドは、将来の やり取りを最適化するため、content coding がサポートされていることをクライアントに示すためにも使用できる。たとえば、 リクエストコンテンツが圧縮 coding の使用を正当化するほど大きいにもかかわらず、 クライアントがそれを行わなかった場合、リソースは 2xx (Successful) レスポンスにそれを含める場合がある。

12.5.4. Accept-Language

"Accept-Language" ヘッダーフィールドは、レスポンスで優先される 自然言語の集合を示すためにユーザーエージェントが使用できる。言語タグは 8.5.1節 で定義される。

各 language-range には、12.4.2節 で定義されるように、 その範囲によって指定される言語に対するユーザーの設定の推定値を表す関連品質値を与えることができる。たとえば、

Accept-Language: da, en-gb;q=0.8, en;q=0.7

は、「デンマーク語を優先するが、イギリス英語およびその他の種類の 英語も受け入れる」という意味になる。

一部の受信者は、特に等しい 品質値 (値なしは q=1 と同じ) が割り当てられたタグについて、言語タグが列挙された順序を 優先度の降順の指標として扱うことに注意すること。ただし、この振る舞いには 依存できない。一貫性および相互運用性を最大化するため、多くのユーザーエージェントは 各言語タグに一意の品質値を割り当てると同時に、品質の 降順で列挙する。言語優先順位リストに関する追加の議論は、 [RFC4647] の 2.3節 にある。

照合について、[RFC4647] の 3節 はいくつかの 照合スキームを定義する。実装は、その要件に最も適した照合スキームを提供できる。 "Basic Filtering" スキーム ([RFC4647], 3.3.1節 ) は、[RFC2616] の 14.4節 で以前 HTTP 用に定義されていた 照合スキームと同一である。

すべてのリクエストでユーザーの完全な言語設定を含む Accept-Language ヘッダーフィールドを送信することは、 ユーザーのプライバシー期待に反する可能性がある (17.13節 )。

理解可能性は個々のユーザーに大きく依存するため、ユーザーエージェントは 言語設定をユーザーが制御できるようにする必要がある (ユーザーエージェント自身の設定を通じて、またはユーザーが制御可能なシステム設定をデフォルトにすることによって)。 そのような制御をユーザーへ提供しない ユーザーエージェントは Accept-Language ヘッダーフィールドを送信してはならない。

12.5.5. Vary

レスポンス内の "Vary" ヘッダーフィールドは、メソッドおよびターゲット URI 以外の リクエストメッセージのどの部分が、 このレスポンスのコンテンツを選択するオリジンサーバーの 処理に影響した可能性があるかを記述する。

  Vary = #( "*" / field-name )

Vary フィールド値は、ワイルドカードメンバー "*"、または このレスポンスの表現を選択する上で役割を持った可能性がある、選択ヘッダーフィールドと呼ばれるリクエストフィールド 名のリストのいずれかである。潜在的な選択ヘッダーフィールドは、 この仕様で定義されるフィールドに限定されない。

メンバー "*" を含むリストは、 メッセージ構文外の側面 (例: クライアントのネットワークアドレス) を含む可能性もある、 リクエストの他の側面がレスポンス表現の選択に役割を持った可能性があることを示す。受信者は、 リクエストをオリジンサーバーへ転送しなければ、 このレスポンスが後のリクエストに適切かどうかを判断できない。プロキシは Vary フィールド値に "*" を生成してはならない。

たとえば、次を含むレスポンス

Vary: accept-encoding, accept-language

は、オリジンサーバーが、このレスポンスのコンテンツを選択するときの決定要因として、 リクエストの Accept-Encoding および Accept-Language ヘッダーフィールド (またはそれらの不在) を使用した可能性があることを示す。

フィールド名のリストを含む Vary フィールドには二つの目的がある:

  1. 後続リクエストが元のリクエストと列挙されたヘッダーフィールドについて 同じ値を持つ ( [CACHING] の 4.1節) か、 レスポンスの再利用がオリジンサーバーによって検証されていない限り、 キャッシュ受信者はこのレスポンスを後続リクエストの充足に使用してはならないことを知らせる。 言い換えると、Vary は新しいリクエストを保存済み キャッシュエントリーに一致させるために必要なキャッシュキーを拡張する。

  2. このレスポンスがコンテンツ ネゴシエーション (12節) の対象であり、列挙されたヘッダーフィールドで他の値が 提供された場合、後続リクエストで異なる 表現が送信される可能性があることをユーザーエージェント受信者へ知らせる (プロアクティブネゴシエーション)。

オリジンサーバーは、キャッシュ可能なレスポンスを 後続リクエストに選択的に再利用してほしい場合、そのレスポンスに Vary ヘッダーフィールドを生成することが望ましい。 一般に、これは、オリジンサーバーが リクエストの Accept-Language ヘッダー フィールドに基づいてレスポンス言語を選択した場合など、 選択ヘッダーフィールドによって表明された設定により適合するようレスポンスコンテンツが調整された場合である。

コンテンツ選択の変動が、Vary がキャッシュ性能に与える影響より重要でないと オリジンサーバーが判断する場合、特に キャッシュレスポンスディレクティブ ( [CACHING] の 5.2節) によって再利用がすでに制限されている場合、 Vary は省略されることがある。

異なるユーザーに対するそのレスポンスの再利用はフィールド定義によって禁止されているため、 Vary 内で Authorization フィールド名を送信する必要はない (11.6.2節)。同様に、レスポンスコンテンツが ネットワーク地域によって選択または影響されているが、受信者がある地域から別の地域へ移動しても キャッシュされたレスポンスを再利用してほしい場合、 オリジンサーバーが Vary でそのような変動を示す必要はない。

13. 条件付きリクエスト

条件付きリクエストとは、リクエストメソッドをターゲットリソースへ適用する前に テストすべき事前条件を示す一つ以上のリクエストヘッダーフィールドを持つ HTTP リクエストである。13.2節 は、事前条件を いつ評価するか、および複数の事前条件が 存在する場合の優先順位を定義する。

条件付き GET リクエストは HTTP キャッシュ更新に最も効率的な機構である [CACHING]。条件は、 PUT や DELETE などの状態変更メソッドにも適用でき、「更新の喪失」問題、すなわち あるクライアントが並行して動作している別のクライアントの作業を誤って上書きすることを防げる。

13.1. 事前条件

事前条件は通常、ターゲットリソース全体の状態 (現在の値集合) または以前に取得した 表現で観測された状態 (その集合内の一つの値) に関して定義される。リソースが複数の現在の 表現を持ち、それぞれが独自の観測可能な状態を持つ場合、事前条件は、 各リクエストから 選択された 表現 (3.2節 ) への対応付けが時間を通じて一貫していると仮定する。いずれにせよ、対応付けが一貫しないか、 サーバーが適切な表現を選択できない場合、 事前条件が偽と評価されても害は生じない。

以下で定義される各事前条件は、ターゲットリソースの以前の表現から 得られたバリデーター集合と、選択された表現の現在の バリデーター状態 (8.8節) との比較から構成される。したがって、これらの事前条件は、 クライアントが知る特定の状態以後にターゲットリソースの状態が変化したかどうかを 評価する。そのような評価の効果は、13.2節 で定義されるように、メソッドセマンティクスおよび 条件の選択に依存する。

他の仕様によって拡張フィールドとして定義されたその他の事前条件は、 すべての受信者、ターゲットリソース全般の状態、または リソース群に条件を課す場合がある。たとえば、WebDAV の "If" ヘッダーフィールドは、 受信者がそのフィールドを理解し実装している場合、ロックなど複数のリソースのさまざまな側面に対して リクエストを条件付きにできる ([WEBDAV], 10.4節)。

事前条件の拡張性は、未知の場合でも安全に 無視できる事前条件 (If-Modified-Since のようなもの)、特定のユースケースについて配備を仮定できる場合、 またはターゲットリソースの他のプロパティによって実装が示される場合にのみ可能である。 これにより、共通標準の相互に合意された配備へ注力することが促される。

13.1.1. If-Match

"If-Match" ヘッダーフィールドは、フィールド値が "*" の場合、 受信するオリジンサーバーがターゲット リソースの現在の表現を少なくとも一つ持っていること、または フィールド値で提供された entity tag リストのメンバーと一致する entity tag を持つ ターゲットリソースの現在の表現を持っていることを、リクエストメソッドの条件とする。

クライアントはこの 事前条件によって表現データに何らかの変更があった場合にメソッド適用を防ぐことを意図しているため、 オリジンサーバーは If-Match 用の entity tag を比較するとき、 強い比較関数 (8.8.3.2節) を使用しなければならない。

  If-Match = "*" / #entity-tag

例:

If-Match: "xyzzy"
If-Match: "xyzzy", "r2d2xxxx", "c3piozzzz"
If-Match: *

If-Match は、複数のユーザーエージェントが同じリソースへ並行して作用する可能性がある場合に 誤った上書きを防ぐため、状態変更メソッド (例: POST、PUT、DELETE) とともに最もよく使用される (すなわち「更新の喪失」問題を防ぐ)。一般に、 表現の選択または変更を伴う任意のメソッドで使用でき、 選択された表現の現在の entity tag が If-Match フィールド値内のメンバーでない場合に リクエストを中止できる。

オリジンサーバーが表現を選択するリクエストを受信し、 そのリクエストに If-Match ヘッダーフィールドが含まれる場合、オリジンサーバーは、 メソッド実行前に 13.2節 に従って If-Match 条件を評価しなければならない。

受信した If-Match ヘッダーフィールドを評価するには:

  1. フィールド値が "*" の場合、オリジンサーバーが ターゲットリソースの現在の表現を持っていれば条件は真である。
  2. フィールド値が entity tag のリストの場合、列挙されたタグのいずれかが 選択された表現の entity tag と一致すれば条件は真である。
  3. それ以外の場合、条件は偽である。

If-Match 条件を評価したオリジンサーバーは、条件が偽と評価された場合、 要求されたメソッドを実行してはならない。代わりに、 オリジンサーバーは 412 (Precondition Failed) ステータスコードで応答して、条件付きリクエストが 失敗したことを示してもよい。あるいは、リクエストが、 選択された表現にすでに適用済みのように見える状態変更 操作である場合、オリジンサーバーは 2xx (Successful) ステータスコードで応答してもよい (すなわち、 ユーザーエージェントによって要求された変更はすでに成功しているが、 以前のレスポンスが失われたか、他の ユーザーエージェントによって等価な変更が行われたため、ユーザーエージェントがそれを認識していない可能性がある)。

変更リクエストがすでに適用済みに見える場合にオリジンサーバーが成功レスポンスを送信することを許可すると、 多くのオーサリングユースケースでより効率的になるが、 複数のユーザーエージェントが非常に 類似しているが協調していない変更リクエストを行っている場合にはリスクが伴う。たとえば、 複数のユーザーエージェントが共通 リソースへセマフォとして書き込む (例: 非アトミックなインクリメント) 場合、衝突して 重要な状態遷移を失う可能性が高い。そのような種類のリソースでは、 オリジンサーバーは安全でないメソッドで失敗した各 事前条件について 412 を厳格に送信する方がよい。その他の場合、 成功レスポンスから ETag フィールドを除外すると、ユーザーエージェントが次のリクエストとして GET を実行し、 リソースの現在の状態に関する混乱を解消することを促せる。

クライアントは、選択された表現が一致しない場合に 412 (Precondition Failed) レスポンスを優先することを示すため、 GET リクエスト内で If-Match ヘッダーフィールドを送信してもよい。 ただし、これは新しい表現を望まない場合に、 以前に受信した部分表現を完了するための範囲 リクエスト (14節) でのみ有用である。 クライアントが新しい表現を受信することを優先する場合、範囲リクエストには If-Range (13.1.5節 ) の方が適している。

キャッシュまたは仲介者は、その 相互運用性機能がオリジンサーバーにのみ必要であるため、If-Match を無視してもよい。

"*" とその他の値 ("*" の他のインスタンスを含む) を含むリスト値を持つ If-Match ヘッダーフィールドは、構文的に無効であり (したがって生成することは許可されず)、さらに相互運用できる可能性が低いことに注意すること。

13.1.2. If-None-Match

"If-None-Match" ヘッダーフィールドは、フィールド値が "*" の場合、 受信するキャッシュまたはオリジンサーバーがターゲット リソースの現在の表現を一つも持っていないこと、または フィールド値に列挙されたどの entity tag とも一致しない entity tag を持つ 選択された表現を持っていることを、 リクエストメソッドの条件とする。

弱い entity tag は、表現データに変更があった場合でも キャッシュ検証に使用できるため、受信者は If-None-Match 用の entity tag を比較するとき、 弱い比較関数 (8.8.3.2節) を使用しなければならない。

例:

If-None-Match: "xyzzy"
If-None-Match: W/"xyzzy"
If-None-Match: "xyzzy", "r2d2xxxx", "c3piozzzz"
If-None-Match: W/"xyzzy", W/"r2d2xxxx", W/"c3piozzzz"
If-None-Match: *

If-None-Match は主に条件付き GET リクエストで、 最小限のトランザクションオーバーヘッドでキャッシュされた情報を効率的に 更新できるようにするため使用される。クライアントが entity tag を持つ一つ以上の保存済みレスポンスを更新したい場合、 GET リクエストを行うとき、それらの entity tag のリストを含む If-None-Match ヘッダーフィールドを生成することが望ましい。これにより、 それらの保存済みレスポンスの一つが選択された表現と一致する場合、 受信サーバーは 304 (Not Modified) レスポンスを送信できる。

If-None-Match は "*" の値とともに使用して、 クライアントがリソースに現在の 表現がないと考えているとき、安全でないリクエストメソッド (例: PUT) がターゲットリソースの既存の表現を誤って変更することを防ぐこともできる (9.2.1節)。 これは、複数の クライアントがターゲットリソースの初期表現を作成しようとする場合に生じ得る「更新の喪失」問題の一変種である。

オリジンサーバーが表現を選択するリクエストを受信し、 そのリクエストに If-None-Match ヘッダーフィールドが含まれる場合、オリジンサーバーは、 メソッド実行前に 13.2節 に従って If-None-Match 条件を評価しなければならない。

受信した If-None-Match ヘッダーフィールドを評価するには:

  1. フィールド値が "*" の場合、オリジンサーバーが ターゲットリソースの現在の表現を持っていれば条件は偽である。
  2. フィールド値が entity tag のリストの場合、列挙されたタグの一つが 選択された表現の entity tag と一致すれば条件は偽である。
  3. それ以外の場合、条件は真である。

If-None-Match 条件を評価したオリジンサーバーは、 条件が偽と評価された場合、要求されたメソッドを実行してはならず、 代わりにオリジンサーバーは、リクエストメソッドが GET または HEAD の場合は a) 304 (Not Modified) ステータスコード、 その他すべてのリクエストメソッドでは b) 412 (Precondition Failed) ステータスコードで応答しなければならない。

受信した If-None-Match ヘッダーフィールドのキャッシュ処理に関する要件は、 [CACHING] の 4.3.2節 で定義される。

"*" とその他の 値 ("*" の他のインスタンスを含む) を含むリスト値を持つ If-None-Match ヘッダーフィールドは、構文的に無効であり (したがって生成することは許可されず)、さらに相互運用できる可能性が低いことに注意すること。

13.1.3. If-Modified-Since

"If-Modified-Since" ヘッダーフィールドは、選択された表現の 変更日時がフィールド値で提供された日時より新しいことを、 GET または HEAD リクエストメソッドの条件とする。 そのデータが変更されていない場合、選択された表現のデータ転送は 回避される。

フィールドの例:

If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT

リクエストに If-None-Match ヘッダー フィールドが含まれる場合、受信者は If-Modified-Since を無視しなければならない。 If-None-Match の条件は If-Modified-Since の条件をより正確に置き換えるものとみなされ、 両者は If-None-Match を実装していない可能性のある古い仲介者との 相互運用のためだけに組み合わせられる。

受信したフィールド値が有効な HTTP-date でない場合、 フィールド値に複数のメンバーがある場合、またはリクエストメソッドが GET と HEAD のどちらでもない場合、 受信者は If-Modified-Since ヘッダーフィールドを無視しなければならない。

リソースに利用可能な変更日時がない場合、 受信者は If-Modified-Since ヘッダーフィールドを無視しなければならない。

受信者は If-Modified-Since フィールド値の タイムスタンプをオリジンサーバーの時計に基づいて解釈しなければならない。

If-Modified-Since は通常、二つの異なる目的で使用される。1) entity tag を持たない キャッシュ済み表現を効率的に更新できるようにすること、および 2) Web 巡回の 範囲を最近変更されたリソースに限定することである。

キャッシュ更新に使用する場合、キャッシュは通常、キャッシュ済み メッセージの Last-Modified ヘッダーフィールドの値を 使用して If-Modified-Since のフィールド値を生成する。この振る舞いは、 時計の同期が不十分な場合や、サーバーが 厳密なタイムスタンプ一致だけを尊重することを選択している場合 (オリジンサーバーの時計が修正されたり、 アーカイブ済みバックアップから表現が復元されたりすると Last-Modified 日時が「過去に戻る」ように見える問題があるため) に最も相互運用しやすい。ただし、キャッシュは ときどき、キャッシュ済みメッセージの Date ヘッダーフィールドや、 メッセージを受信した時計時刻など、他のデータに基づいてフィールド値を生成することがある。特にキャッシュ済み メッセージに Last-Modified ヘッダーフィールドが含まれない場合である。

取得範囲を最近の時間窓に限定するために使用する場合、ユーザーエージェントは 自身の時計、または以前のレスポンスでサーバーから受信した Date ヘッダーフィールドのいずれかに基づいて If-Modified-Since フィールド値を生成する。選択された表現の Last-Modified ヘッダーフィールドに基づく厳密なタイムスタンプ一致を選択するオリジンサーバーは、 指定された時間窓で変更されたものだけに データ転送を限定するユーザーエージェントを支援できない。

オリジンサーバーが表現を選択するリクエストを受信し、 そのリクエストに If-None-Match ヘッダーフィールドなしで If-Modified-Since ヘッダーフィールドが含まれる場合、 オリジンサーバーはメソッドを実行する前に 13.2節 に従って If-Modified-Since 条件を評価することが望ましい。

受信した If-Modified-Since ヘッダーフィールドを評価するには:

  1. 選択された表現の最終変更日時が フィールド値で提供された日時以前の場合、条件は偽である。
  2. それ以外の場合、条件は真である。

If-Modified-Since 条件を評価したオリジンサーバーは、 条件が偽と評価された場合、要求されたメソッドを実行しないことが望ましく、代わりにオリジンサーバーは、 以前にキャッシュされたレスポンスを識別または更新するために有用なメタデータだけを含む 304 (Not Modified) レスポンスを 生成することが望ましい。

受信した If-Modified-Since ヘッダーフィールドのキャッシュ処理に関する要件は、 [CACHING] の 4.3.2節 で定義される。

13.1.4. If-Unmodified-Since

"If-Unmodified-Since" ヘッダーフィールドは、選択された表現の最終 変更日時がフィールド 値で提供された日時以前であることを、リクエストメソッドの条件とする。 このフィールドは、ユーザーエージェントが表現の entity tag を持たない場合に If-Match と同じ目的を達成する。

フィールドの例:

If-Unmodified-Since: Sat, 29 Oct 1994 19:43:31 GMT

リクエストに If-Match ヘッダーフィールドが含まれる場合、 受信者は If-Unmodified-Since を無視しなければならない。 If-Match の条件は If-Unmodified-Since の条件をより正確に置き換えるものとみなされ、両者は If-Match を実装していない可能性のある古い仲介者との 相互運用のためだけに組み合わせられる。

受信したフィールド値が有効な HTTP-date でない場合 (フィールド値が日時のリストのように見える場合を含む)、 受信者は If-Unmodified-Since ヘッダーフィールドを無視しなければならない。

リソースに利用可能な変更日時がない場合、 受信者は If-Unmodified-Since ヘッダーフィールドを無視しなければならない。

受信者は If-Unmodified-Since フィールド 値のタイムスタンプをオリジンサーバーの時計に基づいて解釈しなければならない。

If-Unmodified-Since は、複数のユーザーエージェントが 表現に entity tag を提供しないリソース上で並行して動作する可能性がある場合に誤った上書きを防ぐため、 状態変更メソッド (例: POST、PUT、 DELETE) とともに最もよく使用される (すなわち「更新の喪失」問題を防ぐ)。一般に、表現の選択または変更を伴う 任意のメソッドで使用でき、選択された 表現の最終変更日時が If-Unmodified-Since フィールド値で提供された日時以後に変化していた場合、リクエストを中止できる。

オリジンサーバーが表現を選択するリクエストを受信し、 そのリクエストに If-Match ヘッダーフィールドなしで If-Unmodified-Since ヘッダーフィールドが含まれる場合、 オリジンサーバーはメソッド実行前に 13.2節 に従って If-Unmodified-Since 条件を評価しなければならない。

受信した If-Unmodified-Since ヘッダーフィールドを評価するには:

  1. 選択された表現の最終変更日時が フィールド値で提供された日時以前の場合、条件は真である。
  2. それ以外の場合、条件は偽である。

If-Unmodified-Since 条件を評価したオリジンサーバーは、 条件が偽と評価された場合、要求されたメソッドを実行してはならない。代わりに、オリジンサーバーは 412 (Precondition Failed) ステータスコードで応答し、 条件付きリクエストが失敗したことを示してもよい。あるいは、 リクエストが選択された表現にすでに適用済みのように見える状態変更操作である場合、 オリジンサーバーは 2xx (Successful) ステータスコードで応答してもよい (すなわち、 ユーザーエージェントによって要求された変更はすでに成功しているが、 以前のレスポンスが失われたか、 他のユーザーエージェントによって等価な変更が行われたため、ユーザーエージェントがそれを認識していない可能性がある)。

変更リクエストがすでに適用済みに見える場合にオリジンサーバーが成功レスポンスを送信することを許可すると、 多くのオーサリングユースケースでより効率的になるが、 複数のユーザーエージェントが非常に 類似しているが協調していない変更リクエストを行っている場合にはリスクが伴う。その場合、 オリジンサーバーは安全でないメソッドで失敗した各事前条件について 412 を厳格に送信する方がよい。

クライアントは、選択された表現が変更されていた場合に 412 (Precondition Failed) レスポンスを優先することを示すため、GET リクエスト内で If-Unmodified-Since ヘッダーフィールドを送信してもよい。 ただし、これは新しい表現を望まない場合に、 以前に受信した部分表現を完了するための範囲リクエスト (14節 ) でのみ有用である。クライアントが新しい表現を受信することを優先する場合、範囲リクエストには If-Range (13.1.5節) の方が適している。

キャッシュまたは仲介者は、その 相互運用性機能がオリジンサーバーにのみ必要であるため、If-Unmodified-Since を無視してもよい。

13.1.5. If-Range

"If-Range" ヘッダーフィールドは、If-Match および If-Unmodified-Since ヘッダー フィールドに似ているが、バリデーターが一致しない場合に Range ヘッダーフィールドを無視するよう受信者へ指示し、 412 (Precondition Failed) レスポンスではなく、新しい 選択された 表現全体を転送させる、特殊な条件付きリクエスト機構を提供する。

クライアントが表現の部分コピーを持ち、 表現全体の最新コピーを取得したい場合、 条件付き GET とともに Range ヘッダーフィールドを使用できる (If-Unmodified-Since と If-Match の一方または両方を使用する)。 ただし、表現が変更されたため事前条件が 失敗した場合、クライアントはその後、現在の表現全体を取得するため 2 回目のリクエストを行う必要がある。

"If-Range" ヘッダーフィールドにより、クライアントは 2 回目のリクエストを「短絡」できる。 非公式には、その意味は次のとおりである。表現が変更されていなければ、 Range で要求している部分を送信し、それ以外なら表現全体を送信する。

有効な entity-tag は、 最初の 3 文字に DQUOTE があるか調べることで、 有効な HTTP-date と区別できる。

クライアントは、Range ヘッダー フィールドを含まないリクエストで If-Range ヘッダーフィールドを生成してはならない。 サーバーは、Range ヘッダーフィールドを含まないリクエストで受信した If-Range ヘッダーフィールドを無視しなければならない。 オリジンサーバーは、Range リクエストをサポートしないターゲットリソースへのリクエストで受信した If-Range ヘッダーフィールドを無視しなければならない。

クライアントは、弱いとマークされた entity tag を含む If-Range ヘッダーフィールドを生成してはならない。対応する表現の entity tag をクライアントが持たず、 その日時が 8.8.2.2節 で定義される意味で強いバリデーターでない限り、 クライアントは HTTP-date を含む If-Range ヘッダーフィールドを生成してはならない。

Range リクエストで If-Range ヘッダーフィールドを受信したサーバーは、 メソッド実行前に 13.2節 に従って条件を評価しなければならない。

HTTP-date を含む受信した If-Range ヘッダーフィールドを評価するには:

  1. 提供された HTTP-date バリデーターが、 8.8.2.2節 で定義される意味で強いバリデーターでない場合、条件は偽である。
  2. 提供された HTTP-date バリデーターが 選択された表現の Last-Modified フィールド値と完全に一致する場合、 条件は真である。
  3. それ以外の場合、条件は偽である。

entity-tag を含む受信した If-Range ヘッダーフィールドを評価するには:

  1. 提供された entity-tag バリデーターが、 強い比較関数 (8.8.3.2節) を使用して選択された表現の ETag フィールド値と完全に一致する場合、 条件は真である。
  2. それ以外の場合、条件は偽である。

If-Range ヘッダーフィールドの受信者は、If-Range 条件が偽と評価された場合、Range ヘッダーフィールドを無視しなければならない。 それ以外の場合、受信者は要求されたとおりに Range ヘッダーフィールドを処理することが望ましい。

If-Range の比較は、バリデーターが HTTP-date の場合を含め、完全一致によって行われるため、 If-Unmodified-Since 条件を評価するときに使用される「以前または等しい」比較とは異なることに注意すること。

13.2. 事前条件の評価

13.2.1. 評価する時点

以下で除外される場合を除き、受信者キャッシュまたはオリジンサーバーは、 通常のリクエストチェックを正常に実行した後、 リクエストコンテンツ (存在する場合) を処理するか、リクエスト メソッドに関連付けられたアクションを実行する直前に、受信したリクエストの事前条件を評価しなければならない。サーバーは、 リクエストコンテンツを処理する前に、それらの条件なしの同じリクエストへのレスポンスが 2xx (Successful) または 412 (Precondition Failed) 以外のステータスコードになる場合、受信したすべての事前条件を無視しなければならない。 言い換えると、重要な処理が行われる前に 検出できるリダイレクトおよび失敗は、事前条件の評価より優先される。

ターゲットリソースのオリジンサーバーではなく、かつ ターゲットリソースへのリクエストについてキャッシュとして動作できないサーバーは、 この仕様で定義される条件付きリクエストヘッダーフィールドを評価してはならず、リクエストを転送する場合、それらを転送しなければならない。これは生成したクライアントが、それらを 現在の表現を提供できるサーバーによって評価されることを意図しているためである。同様に、サーバーは、 CONNECT、OPTIONS、TRACE など、選択された表現の選択または変更を伴わない リクエストメソッドとともに受信した場合、この仕様で定義される 条件付きリクエストヘッダーフィールドを無視しなければならない。

プロトコル拡張は、事前条件を 評価する条件や、その評価の結果を変更できることに注意すること。たとえば、immutable キャッシュ ディレクティブ ([RFC8246] で定義) は、fresh なレスポンスを保持している場合、 条件付きリクエストの転送を省略するようキャッシュへ指示する。

条件付きリクエストヘッダーフィールドは HEAD メソッドで使用可能と定義されているが (HEAD のセマンティクスを GET と一貫させるため)、 成功レスポンスは 304 (Not Modified) レスポンスとほぼ同じサイズであり、 412 (Precondition Failed) レスポンスより有用であるため、 条件付き HEAD を送信する意味はない。

13.2.2. 事前条件の優先順位

複数の条件付きリクエストヘッダーフィールドがリクエストに存在する場合、 フィールドを評価する順序が重要になる。実際には、この文書で定義されるフィールドは 一つの論理的な順序で一貫して実装される。 「更新の喪失」事前条件はキャッシュ 検証より厳しい要件を持ち、検証済みキャッシュは部分レスポンスより効率的であり、entity tag は日付バリデーターより正確であると推定されるためである。

受信者キャッシュまたはオリジンサーバーは、この仕様で定義されるリクエスト 事前条件を次の順序で評価しなければならない:

  1. 受信者がオリジンサーバーであり、If-Match が存在する場合、If-Match 事前条件を評価する:

    • 真の場合、手順 3 へ進む
    • 偽の場合、状態変更リクエストがすでに成功したと 判断できない限り、412 (Precondition Failed) で応答する (13.1.1節 を参照)
  2. 受信者がオリジンサーバーで、If-Match が存在せず、If-Unmodified-Since が存在する場合、If-Unmodified-Since 事前条件を評価する:

    • 真の場合、手順 3 へ進む
    • 偽の場合、状態変更リクエストがすでに成功したと 判断できない限り、412 (Precondition Failed) で応答する (13.1.4節 を参照)
  3. If-None-Match が 存在する場合、If-None-Match 事前条件を評価する:

  4. メソッドが GET または HEAD で、If-None-Match が存在せず、If-Modified-Since が存在する場合、If-Modified-Since 事前条件を評価する:

  5. メソッドが GET で、Range と If-Range の両方が存在する場合、If-Range 事前条件を評価する:

  6. それ以外の場合、

    • 要求されたメソッドを実行し、その成功または 失敗に応じて応答する。

追加の条件付きリクエストヘッダーフィールドを定義する HTTP の拡張は、 そのようなフィールドを、この 文書で定義されるものおよび実際に存在し得る他の条件との関係で評価する順序を定義するべきである。

14. 範囲 リクエスト

クライアントは、キャンセルされたリクエストや 接続の切断によってデータ転送が中断されることがよくある。クライアントが部分的な表現を保存している場合、 表現全体を転送するのではなく、後続のリクエストで その表現の残りを要求できることが望ましい。同様に、ローカル記憶域が限られたデバイスは、 非常に大きな文書の 1 ページや 埋め込み画像の寸法など、大きな表現の一部分だけを要求できることで恩恵を受ける場合がある。

範囲リクエストは HTTP の任意機能であり、 この機能を実装していない (またはターゲットリソースについてサポートしていない) 受信者が、 相互運用性に影響を与えることなく通常の GET リクエストであるかのように 応答できるよう設計されている。部分 レスポンスは、この機能を実装していない可能性のあるキャッシュによって完全なレスポンスと誤認されないよう、 固有のステータスコードによって示される。

14.1. 範囲単位

表現データは、そのデータの content coding またはメディアタイプに固有の アドレス指定可能な構造単位がある場合、部分範囲に分割できる。たとえば、 オクテット (別名バイト) 境界はすべての表現データに共通する構造単位であり、 データの先頭または末尾からのあるオフセットにおけるバイト範囲として データの区画を識別できる。

この一般的な範囲単位の概念は、範囲リクエストのサポートを通知する Accept-Ranges (14.3節) レスポンスヘッダーフィールド、 要求する表現部分を指定する Range (14.2節) リクエストヘッダーフィールド、および 転送される表現部分を記述する Content-Range (14.4節) ヘッダーフィールドで使用される。

すべての範囲単位名は大文字小文字を区別せず、16.5.1節 で定義されるように、"HTTP Range Unit Registry" に登録するべきである。

範囲単位は、16.5節 で説明されるように、拡張可能であることを意図している。

14.1.1. 範囲指定子

範囲は、範囲単位と範囲指定子の集合の組み合わせとして表現される。 範囲単位名は、自身の 指定子にどの種類の range-spec が適用可能かを決定する。したがって、次の文法は汎用的であり、各範囲単位は、 int-range、 suffix-range、および other-range がいつ許可されるかについて要件を 規定することが期待される。

範囲リクエストは、単一の表現内の 単一の範囲または範囲の集合を指定できる。

int-range は、 二つの非負整数、または一つの非負整数から 表現データの末尾までとして表現される範囲である。範囲単位は整数が 何を意味するかを規定する (例: 先頭からの単位オフセット、包含的に番号付けされた 部分などを示す場合がある)。

int-range は、last-pos 値が存在し、かつ first-pos より小さい場合に無効である。

suffix-range は、指定された非負整数の最大長 (範囲単位) を持つ 表現データの接尾部として表現される範囲である。言い換えると、表現データの最後の N 単位である。

拡張性を提供するため、other-range 規則はほとんど制約のない文法であり、 アプリケーション固有または将来の範囲単位が追加の範囲指定子を定義できるようにする。

  other-range   = 1*( %x21-2B / %x2D-7E )
                ; コンマを除く 1*(VCHAR)

ranges-specifier は、 示された range-unit に対して無効または未定義の range-spec を 一つでも含む場合、無効である。

有効な ranges-specifier は、示された range-unit によって定義される意味で 充足可能な range-spec を少なくとも 一つ含む場合、充足可能である。それ以外の場合、ranges-specifier は充足不能である。

14.1.2. バイト範囲

"bytes" 範囲単位は、表現データのオクテット 列の部分範囲を表現するために使用される。各バイト範囲は、表現データの 先頭 (int-range) または 末尾 (suffix-range) を基準としたあるオフセットでの整数範囲として表現される。 バイト範囲は other-range 指定子を使用しない。

bytes int-range の first-pos 値は範囲の最初の バイトのオフセットを示す。last-pos 値は 範囲の最後のバイトのオフセットを示す。すなわち、指定されるバイト位置は 包含的である。バイトオフセットは 0 から始まる。

表現データに content coding が適用されている場合、各バイト範囲は、 復号後に得られる基盤となるバイト列ではなく、 エンコードされたバイト列に対して計算される。

bytes 範囲指定子の例:

  • 最初の 500 バイト (バイトオフセット 0-499、両端を含む):

    bytes=0-499
    
  • 2 番目の 500 バイト (バイトオフセット 500-999、両端を含む):

    bytes=500-999
    

クライアントは、選択された表現のサイズを知らなくても、要求するバイト数を制限できる。 last-pos 値が存在しない場合、または その値が表現データの現在の長さ以上の場合、バイト 範囲は表現の残りとして解釈される (すなわち、サーバーは last-pos の値を、 選択された表現の現在の長さより 1 小さい値に置き換える)。

クライアントは、suffix-range を使用して、 選択された表現の最後の N バイト (N > 0) を参照できる。選択された 表現が指定された suffix-length より短い場合、表現全体が使用される。

長さ 10000 の表現を仮定した追加例:

  • 最後の 500 バイト (バイトオフセット 9500-9999、両端を含む):

    bytes=-500
    

    または:

    bytes=9500-
    
  • 最初と最後のバイトだけ (バイト 0 と 9999):

    bytes=0-0,-1
    
  • 最初、中間、最後の各 1000 バイト:

    bytes= 0-999, 4500-5499, -1000
    
  • 2 番目の 500 バイト (バイトオフセット 500-999、両端を含む) のその他の有効な (ただし正規形ではない) 指定:

    bytes=500-600,601-999
    bytes=500-700,601-999
    

GET リクエストについて、有効な bytes range-spec は、次のいずれかであれば 充足可能である:

選択された表現の長さが 0 の場合、GET リクエスト内の range-spec で 充足可能な形式は、0 ではない suffix-length を持つ suffix-range だけである。

バイト範囲構文では、first-pos、last-pos、および suffix-length は オクテット数の 10 進数として表現される。コンテンツ長に事前定義された上限がないため、 受信者は潜在的に大きな 10 進 数値を想定し、整数変換オーバーフローによる解析エラーを防がなければならない。

14.2. Range

GET リクエストの "Range" ヘッダーフィールドは、選択された 表現全体ではなく、選択された表現データ (8.1節) の一つ以上の部分範囲だけの転送を要求するよう、 メソッドセマンティクスを変更する。

サーバーは Range ヘッダーフィールドを無視してもよい。ただし、 オリジンサーバーおよび中間キャッシュは、部分的に失敗した転送からの効率的な回復と 大きな表現の部分取得をサポートするため、可能な場合にはバイト範囲をサポートするべきである。

サーバーは、認識できないリクエスト メソッド、または範囲処理が定義されていないリクエストメソッドとともに受信した Range ヘッダーフィールドを無視しなければならない。 この仕様では、GET だけが 範囲処理を定義されているメソッドである。

オリジンサーバーは、自身が理解しない 範囲単位を含む Range ヘッダーフィールドを無視しなければならない。プロキシは、自身が理解しない範囲単位を含む Range ヘッダーフィールドを破棄してもよい。

範囲リクエストをサポートするサーバーは、無効な ranges-specifier (14.1.1節) を含む Range ヘッダーフィールド、二つを超える 重複範囲を持つ ranges-specifier、または昇順で列挙されていない多数の小さな範囲の集合を 無視または拒否してもよい。これらは壊れたクライアントまたは意図的な サービス拒否攻撃 (17.15節) の兆候だからである。クライアントは、 同じデータを包含する単一範囲より 本質的に処理および転送効率が低い複数範囲を要求しないことが望ましい。

範囲リクエストをサポートするサーバーは、選択された 表現にコンテンツがない場合 (すなわち、選択された表現のデータ長が 0 の場合)、 Range ヘッダーフィールドを無視してもよい。

複数範囲を要求するクライアントは、後の部分を 先に要求する特別な必要がない限り、それらの範囲を昇順 (完全な表現で通常受信される順序) で列挙することが望ましい。たとえば、 部分の内部カタログを持つ大きな表現を処理するユーザーエージェントは、 特に表現が逆順で保存されたページから構成され、 ユーザーエージェントが一度に 1 ページずつ転送したい場合、後の部分を最初に要求する必要がある場合がある。

Range ヘッダーフィールドは、13.1節 で定義される 事前条件ヘッダーフィールドを評価した後、かつ Range ヘッダーフィールドがない場合の結果が 200 (OK) レスポンスになる場合にのみ評価される。言い換えると、 条件付き GET が 304 (Not Modified) レスポンスとなる場合、Range は無視される。

If-Range ヘッダーフィールド (13.1.5節) は、Range ヘッダーフィールドを適用する 事前条件として使用できる。

すべての事前条件が真であり、サーバーがターゲットリソースについて Range ヘッダーフィールドをサポートし、 受信した Range フィールド値が、そのターゲットリソースでサポートされる range-unit を持つ有効な ranges-specifier を含み、 かつその ranges-specifier が 選択された表現に対して 充足可能である場合、サーバーは、 要求された充足可能な range-spec に対応する一つ以上の部分表現をコンテンツとして含む 206 (Partial Content) レスポンスを送信することが望ましい。

上記は、サーバーが要求されたすべての範囲を送信することを意味しない。場合によっては、 要求された範囲の一部だけを最初に送信することしか可能 (または効率的) でなく、 クライアントが残りの部分を依然として望む場合には 後で再要求することを期待する場合がある (15.3.7節 を参照)。

すべての事前条件が真であり、サーバーがターゲットリソースについて Range ヘッダーフィールドをサポートし、 受信した Range フィールド値が有効な ranges-specifier を含み、かつ range-unit がそのターゲット リソースでサポートされていないか、ranges-specifier が 選択された表現に対して充足不能である場合、サーバーは 416 (Range Not Satisfiable) レスポンスを送信することが望ましい。

14.3. Accept-Ranges

レスポンス内の "Accept-Ranges" フィールドは、上流サーバーが ターゲットリソースについて範囲リクエストをサポートするかどうかを示す。

たとえば、バイト範囲リクエスト (14.1.2節) をサポートするサーバーは、次のフィールドを送信できる

Accept-Ranges: bytes

これは、そのターゲットリソースについてバイト範囲リクエストをサポートすることを示し、 同じリクエストパスへの将来の部分リクエストでクライアントがそれを使用するよう促す。 範囲単位は 14.1節 で定義される。

クライアントは、Accept-Ranges フィールドを受信したかどうかにかかわらず 範囲リクエストを生成してもよい。この情報は性能を向上させ、 不要なネットワーク転送を減らすための助言を提供するだけである。

逆に、クライアントは Accept-Ranges フィールドを受信したことが、 将来の範囲リクエストが部分レスポンスを返すことを意味すると仮定してはならない。コンテンツが変化したり、サーバーが特定の時点または 特定の条件でのみ範囲リクエストをサポートしたり、別の仲介者が次のリクエストを処理したりする場合がある。

ターゲットリソースについていかなる種類の範囲リクエストもサポートしないサーバーは、 次を送信してもよい

Accept-Ranges: none

これは、同じリクエストパスで範囲リクエストを試みないようクライアントへ助言する。 範囲単位 "none" はこの目的のために予約されている。

Accept-Ranges フィールドはトレーラーセクションで送信してもよいが、 情報はコンテンツ途中 (トレーラーセクションを受信する前) で失敗した 大きな情報転送の再開に特に有用であるため、ヘッダーフィールドとして送信する方が望ましい。

14.4. Content-Range

"Content-Range" ヘッダーフィールドは、単一部分の 206 (Partial Content) レスポンスで、メッセージコンテンツとして含まれる 選択された表現の部分範囲を示すために送信され、 マルチパート 206 レスポンスの各部分では、各本文部分内に含まれる範囲を示すために送信され (14.6節)、また 416 (Range Not Satisfiable) レスポンスでは 選択された表現に関する情報を提供するために送信される。

206 (Partial Content) レスポンスが、 受信者が理解しない 範囲単位 (14.1節) を持つ Content-Range ヘッダーフィールドを含む場合、 受信者はそれを保存済み 表現と再結合しようとしてはならない。そのようなメッセージを受信したプロキシは、 下流へ転送することが望ましい。

Content-Range は、クライアントとオリジンサーバー間の私的な合意に基づき、 14.5節 で説明されるように、部分 PUT を要求する リクエスト修飾子として送信される場合もある。サーバーは、 Content-Range のサポートが定義されていないメソッドを持つリクエストで受信した Content-Range ヘッダーフィールドを無視しなければならない。

バイト範囲について、送信者は、完全な長さが 不明または判断困難でない限り、その範囲が抽出された 表現の完全な長さを示すことが望ましい。complete-length の代わりの アスタリスク文字 ("*") は、そのヘッダー フィールドが生成された時点で表現長が不明だったことを示す。

次の例は、選択された表現の完全な長さが 1234 バイトであることを送信者が知っている場合を示す:

Content-Range: bytes 42-1233/1234

次の 2 番目の例は、完全な長さが不明な場合を示す:

Content-Range: bytes 42-1233/*

Content-Range フィールド値は、range-resp において last-pos 値が first-pos 値より小さい場合、または complete-length 値が last-pos 値以下の場合に無効である。 無効な Content-Range の受信者は、 受信したコンテンツを保存済み表現と再結合しようとしてはならない。

バイト範囲リクエストに対して 416 (Range Not Satisfiable) レスポンスを生成するサーバーは、次の例のように unsatisfied-range 値を持つ Content-Range ヘッダーフィールドを送信することが望ましい:

Content-Range: bytes */1234

416 レスポンス内の complete-length は、選択された 表現の現在の長さを示す。

Content-Range ヘッダーフィールドは、そのセマンティクスを明示的に 記述しないステータスコードについて意味を持たない。この仕様では、206 (Partial Content) および 416 (Range Not Satisfiable) ステータスコードだけが Content-Range の意味を記述する。

以下は、選択された表現が 合計 1234 バイトを含む場合の Content-Range 値の例である:

  • 最初の 500 バイト:

    Content-Range: bytes 0-499/1234
    
  • 2 番目の 500 バイト:

    Content-Range: bytes 500-999/1234
    
  • 最初の 500 バイトを除くすべて:

    Content-Range: bytes 500-1233/1234
    
  • 最後の 500 バイト:

    Content-Range: bytes 734-1233/1234
    

14.5. 部分 PUT

一部のオリジンサーバーは、ユーザーエージェントがリクエスト内に Content-Range ヘッダーフィールド (14.4節) を送信した場合、 部分表現の PUT をサポートするが、 そのようなサポートは一貫しておらず、ユーザーエージェントとの私的な合意に依存する。 一般に、Content-Range 値によって示される オフセットおよび長さで、含まれるコンテンツを用いて ターゲットリソースの状態の一部を置き換えることを要求する。このオフセットは 現在の選択された表現を基準とする。

部分 PUT リクエストをサポートしないターゲットリソースへの PUT で Content-Range を受信した場合、 オリジンサーバーは 400 (Bad Request) ステータスコードで応答することが望ましい。

部分 PUT は、PUT の元の定義と後方互換ではない。コンテンツが 現在の表現の完全な置換として書き込まれる結果になる可能性がある。

部分的なリソース更新は、大きなリソースの一部と重複または 拡張する状態を持つ別個に識別されたリソースをターゲットにすること、 または部分更新専用に定義された別のメソッド (たとえば [RFC5789] で定義される PATCH メソッド) を使用することでも可能である。

14.6. メディアタイプ multipart/byteranges

206 (Partial Content) レスポンスメッセージが 複数範囲のコンテンツを含む場合、それらは メディアタイプ "multipart/byteranges" を持つマルチパートメッセージ本文 ([RFC2046], 5.1節) 内の 本文部分として転送される。

"multipart/byteranges" メディアタイプは一つ以上の本文部分を含み、それぞれ独自の Content-Type および Content-Range フィールドを持つ。必須の boundary パラメーターは各本文部分を区切るために使用される境界文字列を指定する。

実装上の注意:

  1. 本文内の最初の boundary 文字列の前に追加の CRLF が存在する場合がある。
  2. [RFC2046] は boundary 文字列の引用を許可しているが、一部の既存実装は 引用された boundary 文字列を誤って処理する。
  3. 多数のクライアントおよびサーバーは、メディアタイプとして "multipart/x-byteranges" を使用していた byteranges 仕様の初期ドラフトに基づいて実装された。これはこの型とほぼ (ただし完全には) 互換である。

名前に反して、"multipart/byteranges" メディアタイプはバイト範囲に限定されない。 次の例では "exampleunit" 範囲単位を使用する:

HTTP/1.1 206 Partial Content
Date: Tue, 14 Nov 1995 06:25:24 GMT
Last-Modified: Tue, 14 July 04:58:08 GMT
Content-Length: 2331785
Content-Type: multipart/byteranges; boundary=THIS_STRING_SEPARATES

--THIS_STRING_SEPARATES
Content-Type: video/example
Content-Range: exampleunit 1.2-4.3/25

...最初の範囲...
--THIS_STRING_SEPARATES
Content-Type: video/example
Content-Range: exampleunit 11.2-14.3/25

...2 番目の範囲
--THIS_STRING_SEPARATES--

以下の情報は、"multipart/byteranges" メディアタイプの登録フォームとして使用される。

タイプ名:
multipart
サブタイプ名:
byteranges
必須パラメーター:
boundary
任意パラメーター:
該当なし
エンコーディングに関する考慮事項:
"7bit"、"8bit"、または "binary" のみ許可される
セキュリティに関する考慮事項:
17節 を参照
相互運用性に関する考慮事項:
該当なし
公開仕様:
RFC 9110 (14.6節を参照)
このメディアタイプを使用するアプリケーション:
単一リクエスト内で複数範囲をサポートする HTTP コンポーネント
フラグメント識別子に関する考慮事項:
該当なし
追加情報:
この型の非推奨エイリアス名:
該当なし
マジックナンバー:
該当なし
ファイル拡張子:
該当なし
Macintosh ファイルタイプコード:
該当なし
詳細情報の連絡先となる人物およびメールアドレス:
著者の連絡先の節を参照。
意図された用途:
一般
使用上の制限:
該当なし
著者:
著者の連絡先の節を参照。
変更管理者:
IESG

15. ステータス コード

レスポンスのステータスコードは、リクエストの結果およびレスポンスのセマンティクスを記述する 3 桁の整数コードであり、リクエストが成功したかどうか、 およびどのコンテンツが含まれるか (存在する場合) を含む。すべての有効なステータスコードは 100 以上 599 以下の範囲にある。

ステータスコードの最初の桁はレスポンスのクラスを定義する。末尾 2 桁には 分類上の役割はない。最初の桁には五つの値がある:

HTTP ステータスコードは拡張可能である。クライアントは、登録済みのすべての ステータスコードの意味を理解する必要はないが、そのような理解は明らかに望ましい。ただし、クライアントは 最初の桁によって示される任意のステータスコードのクラスを理解しなければならず、 認識できないステータスコードをそのクラスの x00 ステータス コードと等価であるものとして扱わなければならない。

たとえば、クライアントが認識できないステータスコード 471 を受信した場合、 最初の桁からリクエストに何らかの問題があったことを判断し、 400 (Bad Request) ステータスコードを受信したかのようにレスポンスを扱える。 レスポンスメッセージには通常、状態を説明する表現が含まれる。

100..599 の範囲外の値は無効である。実装は、HTTP ではない状態 (例: ライブラリエラー) の内部通信に、その範囲外の 3 桁整数値 (すなわち 600..999) を使用することが多い。無効なステータスコードを持つレスポンスを受信したクライアントは、 5xx (サーバーエラー) ステータスコードを持つかのようにレスポンスを処理することが望ましい。

単一のリクエストには複数のレスポンスを関連付けることができる: 「情報」(1xx) 範囲のステータスコードを持つ 0 個以上の 暫定 (非最終) レスポンスの後に、 その他の範囲のいずれかのステータスコードを持つちょうど一つの最終 レスポンスが続く。

15.1. ステータスコードの概要

以下に列挙するステータスコードはこの仕様で定義される。ここに列挙する理由句は 推奨にすぎず、プロトコルへ影響を与えることなく、 ローカルな等価表現で置き換えたり完全に省略したりできる。

ヒューリスティックにキャッシュ可能と定義されたステータスコード (例: この仕様では 200、203、204、206、300、301、308、404、405、410、414、501) を持つレスポンスは、 メソッド定義または明示的なキャッシュ制御 [CACHING] によって別途示されない限り、 ヒューリスティックな有効期限を用いてキャッシュから再利用できる。その他すべてのステータスコードは ヒューリスティックにキャッシュ可能ではない。

この仕様の範囲外の追加ステータスコードも HTTP で使用するために規定されている。そのようなすべてのステータスコードは、16.2節 で説明されるように、"Hypertext Transfer Protocol (HTTP) Status Code Registry" に登録するべきである。

15.2. 情報 1xx

1xx (情報) クラスのステータスコードは、 要求されたアクションを完了して最終レスポンスを送信する前に、 接続状態またはリクエスト進捗を伝達するための暫定レスポンスを示す。HTTP/1.0 は 1xx ステータスコードを定義していなかったため、 サーバーは HTTP/1.0 クライアントへ 1xx レスポンスを送信してはならない。

1xx レスポンスはヘッダーセクションの終端で終了し、コンテンツまたは トレーラーを含めることはできない。

クライアントは、たとえ予期していなくても、最終レスポンスより前に受信した 一つ以上の 1xx レスポンスを解析できなければならない。ユーザーエージェントは、 予期しない 1xx レスポンスを無視してもよい。

プロキシ自身が 1xx レスポンスの生成を要求した場合を除き、 プロキシは 1xx レスポンスを転送しなければならない。たとえば、プロキシがリクエストを転送するとき "Expect: 100-continue" ヘッダーフィールドを追加した場合、対応する 100 (Continue) レスポンスを転送する必要はない。

15.2.1. 継続

100 (Continue) ステータスコードは、リクエストの最初の部分を 受信し、サーバーによってまだ拒否されていないことを示す。サーバーは、 リクエストを完全に受信して処理した後、最終レスポンスを送信する意図がある。

リクエストに 100-continue 期待値を含む Expect ヘッダー フィールドが含まれる場合、100 レスポンスは、 10.1.1節 で説明されるように、サーバーが リクエストコンテンツの受信を望んでいることを示す。クライアントは、 リクエスト送信を続け、100 レスポンスを破棄するべきである。

リクエストが 100-continue 期待値を含む Expect ヘッダーフィールドを含んでいなかった場合、クライアントはこの暫定レスポンスを単に破棄できる。

15.2.2. プロトコルの切り替え

101 (Switching Protocols) ステータスコードは、サーバーが、 この接続で使用されているアプリケーションプロトコルを変更するというクライアントの要求を Upgrade ヘッダーフィールド (7.8節) を介して理解し、 それに従う意思があることを示す。サーバーは、 このレスポンス後に有効となるプロトコルを示す Upgrade ヘッダーフィールドを レスポンス内に生成しなければならない。

サーバーは、そうすることが有利な場合にのみ プロトコル切り替えに同意すると仮定される。たとえば、古いバージョンより 新しいバージョンの HTTP へ切り替えることが有利な場合があり、 そのような機能を使用するリソースを配信する場合には、リアルタイムの同期プロトコルへ 切り替えることが有利な場合がある。

15.3. 成功 2xx

2xx (成功) クラスのステータスコードは、クライアントのリクエストが 正常に受信、理解、受理されたことを示す。

15.3.1. 成功

200 (OK) ステータスコードは、リクエストが成功したことを示す。200 レスポンスで送信される コンテンツはリクエストメソッドに依存する。この 仕様で定義されるメソッドについて、コンテンツの意図された意味は次のように要約できる:

表 6
リクエストメソッド レスポンスコンテンツが表現するもの:
GET ターゲット リソース
HEAD GET と同様の ターゲット リソースだが、表現 データを転送しない
POST アクションの状態、またはアクションから得られた結果
PUT, DELETE アクションの状態
OPTIONS ターゲットリソースの通信オプション
TRACE トレースを返すサーバーが受信した リクエストメッセージ

CONNECT へのレスポンスを除き、200 レスポンスは、 メッセージフレーミングがコンテンツ長 0 を明示的に示さない限り、メッセージ コンテンツを含むことが期待される。リクエストの何らかの側面が成功時にコンテンツなしを優先することを示している場合、 オリジンサーバーは代わりに 204 (No Content) レスポンスを送信するべきである。CONNECT では、 成功結果がトンネルであり、200 レスポンス ヘッダーセクションの直後に開始するため、コンテンツはない。

200 レスポンスはヒューリスティックにキャッシュ可能である。すなわち、 メソッド定義または明示的なキャッシュ制御によって別途示されない限りである ( [CACHING] の 4.2.2節 を参照)。

GET または HEAD への 200 レスポンスでは、オリジンサーバーは 選択された表現について利用可能な バリデーターフィールド (8.8節) を送信することが望ましく、 強い entity tag と Last-Modified 日時の両方が推奨される。

状態変更メソッドへの 200 レスポンスでは、レスポンスで送信される バリデーターフィールド (8.8節) は、 リクエストセマンティクスを正常に適用した結果として形成された新しい表現の 現在のバリデーターを伝える。PUT メソッド (9.3.4節) には、そのようなバリデーターの送信を 妨げる可能性のある追加要件があることに注意すること。

15.3.2. 作成済み

201 (Created) ステータスコードは、リクエストが満たされ、 一つ以上の新しいリソースが作成されたことを示す。リクエストによって作成された主要なリソースは、 レスポンスの Location ヘッダーフィールド、または Location ヘッダーフィールドを受信しなかった場合は ターゲット URI によって識別される。

201 レスポンスコンテンツは通常、作成されたリソースを記述し、 それらへのリンクを含む。レスポンスで送信されるバリデーターフィールド (8.8節 ) は、リクエストによって作成された新しい 表現の現在のバリデーターを伝える。PUT メソッド (9.3.4節) には、そのようなバリデーターの送信を 妨げる可能性のある追加要件があることに注意すること。

15.3.3. 受理済み

202 (Accepted) ステータスコードは、リクエストが 処理のために受理されたが、その処理が完了していないことを示す。リクエストは、 実際に処理されるときに許可されない可能性もあるため、最終的に実行される場合もされない場合もある。 HTTP には非同期操作からステータスコードを再送信する機能はない。

202 レスポンスは意図的に確約を行わない。その目的は、ユーザーエージェントの サーバーへの接続を処理完了まで維持する必要なく、 サーバーが他の何らかの処理 (たとえば 1 日 1 回だけ実行される バッチ指向処理) のためにリクエストを受理できるようにすることである。このレスポンスとともに送信される 表現は、リクエストの現在の状態を記述し、 リクエストがいつ満たされるかの見積もりをユーザーへ提供できる状態監視機構を指す (または埋め込む) べきである。

15.3.4. 権威のない情報

203 (Non-Authoritative Information) ステータスコードは、 リクエストは成功したが、含まれるコンテンツが変換 プロキシ (7.7節 ) によってオリジンサーバーの 200 (OK) レスポンスのものから変更されたことを示す。 このステータスコードにより、変換が適用されたときにプロキシが受信者へ通知できる。 その知識がコンテンツに関する後の判断へ影響する可能性があるためである。たとえば、 コンテンツに対する将来のキャッシュ検証リクエストは、 同じリクエストパス (同じプロキシ経由) にのみ適用可能な場合がある。

203 レスポンスはヒューリスティックにキャッシュ可能である。すなわち、 メソッド定義または明示的なキャッシュ制御によって別途示されない限りである ( [CACHING] の 4.2.2節 を参照)。

15.3.5. コンテンツなし

204 (No Content) ステータスコードは、サーバーがリクエストを正常に満たし、 レスポンスコンテンツとして送信する追加コンテンツがないことを示す。 レスポンスヘッダーフィールド内のメタデータは、要求されたアクションが適用された後の ターゲットリソースおよびその 選択された表現を参照する。

たとえば、PUT リクエストへのレスポンスとして 204 ステータスコードを受信し、 レスポンスが ETag フィールドを含む場合、PUT は成功しており、ETag フィールド値にはそのターゲットリソースの新しい 表現の entity tag が含まれる。

204 レスポンスにより、サーバーはアクションがターゲットリソースへ正常に 適用されたことを示しながら、ユーザーエージェントが現在の「文書ビュー」(存在する場合) から 移動する必要がないことを暗示できる。サーバーは、 ユーザーエージェントが自身のインターフェイスに従ってユーザーへ成功の何らかの表示を提供し、 レスポンス内の新しいまたは更新されたメタデータを アクティブな表現へ適用すると仮定する。

たとえば、204 ステータスコードは、 保存される文書をユーザーが引き続き編集できるようにする「保存」アクションに対応する 文書編集インターフェイスで一般的に使用される。また、 分散バージョン管理システム内など、自動化されたデータ転送が頻繁であると想定する インターフェイスでもよく使用される。

204 レスポンスはヘッダーセクションの終端で終了し、 コンテンツまたはトレーラーを含めることはできない。

204 レスポンスはヒューリスティックにキャッシュ可能である。すなわち、 メソッド定義または明示的なキャッシュ制御によって別途示されない限りである ( [CACHING] の 4.2.2節 を参照)。

15.3.6. コンテンツのリセット

205 (Reset Content) ステータスコードは、サーバーが リクエストを満たし、そのリクエストの送信原因となった「文書ビュー」を、 オリジンサーバーから受信した元の状態へリセットすることをユーザーエージェントに望んでいることを示す。

このレスポンスは、ユーザーが データ入力をサポートするコンテンツ (フォーム、メモ帳、キャンバスなど) を受信し、その空間でデータを入力または 操作し、入力したデータを リクエストで送信させ、その後、次の入力のためにデータ入力機構をリセットして、 ユーザーが別の入力アクションを容易に開始できるようにするという一般的なデータ入力ユースケースを支援することを意図している。

205 ステータスコードは追加コンテンツが提供されないことを意味するため、 サーバーは 205 レスポンスにコンテンツを生成してはならない。

15.3.7. 部分的なコンテンツ

206 (Partial Content) ステータスコードは、サーバーが 選択された表現の一つ以上の部分を転送することで、 ターゲットリソースへの範囲リクエストを正常に満たしていることを示す。

範囲リクエスト (14節) をサポートするサーバーは通常、 要求されたすべての範囲を満たそうとする。送信するデータが少ないと、 残りを求める別のクライアント リクエストが発生する可能性が高いためである。ただし、サーバーは、 一時的な利用不能、キャッシュ 効率、負荷分散など、自身の理由で要求されたデータの一部だけを送信したい場合がある。206 レスポンスは自己記述的であるため、 クライアントは範囲 リクエストを部分的にしか満たさないレスポンスでも理解できる。

クライアントは、どの部分が含まれているか、および追加のリクエストが必要かを判断するため、 206 レスポンスの Content-Type および Content-Range フィールドを調べなければならない。

206 レスポンスを生成するサーバーは、以下の小節で要求されるものに加えて、 同じリクエストへの 200 (OK) レスポンスでそのフィールドが送信されていた場合、次のヘッダーフィールドを生成しなければならない: Date、Cache-Control、ETag、Expires、Content-Location、および Vary。

206 レスポンスに存在する Content-Length ヘッダーフィールドは、この メッセージのコンテンツ内のオクテット数を示し、通常は選択された表現の完全な長さではない。 各 Content-Range ヘッダーフィールドには、 選択された表現の完全な長さに関する情報が含まれる。

If-Range ヘッダーフィールドを持つリクエストへの 206 レスポンスを生成する送信者は、 クライアントがすでにそれらのヘッダーフィールドを含む以前のレスポンスを持っているため、 要求されるものを超えるその他の表現ヘッダーフィールドを 生成しないことが望ましい。それ以外の場合、送信者は、 同じリクエストへの 200 (OK) レスポンスで送信される すべての表現ヘッダーフィールドを生成しなければならない。

206 レスポンスはヒューリスティックにキャッシュ可能である。すなわち、 明示的なキャッシュ制御によって別途示されない限りである ( [CACHING] の 4.2.2節 を参照)。

15.3.7.1. 単一部分

単一部分を転送する場合、206 レスポンスを生成するサーバーは、 選択された表現のどの範囲が含まれているかを記述する Content-Range ヘッダーフィールドと、その範囲から構成されるコンテンツを 生成しなければならない。たとえば:

HTTP/1.1 206 Partial Content
Date: Wed, 15 Nov 1995 06:25:24 GMT
Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT
Content-Range: bytes 21010-47021/47022
Content-Length: 26012
Content-Type: image/gif

... 26012 バイトの部分画像データ ...
15.3.7.2. 複数部分

複数部分を転送する場合、206 レスポンスを生成するサーバーは、 14.6節 で定義される "multipart/byteranges" コンテンツと、 "multipart/byteranges" メディアタイプおよび必須の boundary パラメーターを含む Content-Type ヘッダーフィールドを生成しなければならない。単一部分レスポンスとの混同を避けるため、サーバーは 複数部分レスポンスの HTTP ヘッダーセクション内に Content-Range ヘッダーフィールドを生成してはならない (このフィールドは代わりに各部分で送信される)。

マルチパートコンテンツの各本文部分のヘッダー領域内で、サーバーは その本文部分に含まれる範囲に対応する Content-Range ヘッダーフィールドを生成しなければならない。選択された表現が 200 (OK) レスポンスで Content-Type ヘッダーフィールドを持っていた場合、 サーバーは各本文部分のヘッダー領域で同じ Content-Type ヘッダーフィールドを生成することが望ましい。たとえば:

HTTP/1.1 206 Partial Content
Date: Wed, 15 Nov 1995 06:25:24 GMT
Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT
Content-Length: 1741
Content-Type: multipart/byteranges; boundary=THIS_STRING_SEPARATES

--THIS_STRING_SEPARATES
Content-Type: application/pdf
Content-Range: bytes 500-999/8000

...最初の範囲...
--THIS_STRING_SEPARATES
Content-Type: application/pdf
Content-Range: bytes 7000-7999/8000

...2 番目の範囲
--THIS_STRING_SEPARATES--

複数範囲が要求された場合、サーバーは、 対応する range-spec が受信した Range ヘッダーフィールドに現れた順序にかかわらず、 重複する範囲、または複数部分を送信するオーバーヘッドより小さい間隔で 分離されている範囲を結合してもよい。各 "multipart/byteranges" 部分間の一般的なオーバーヘッドは、 選択された表現のメディアタイプおよび選択した boundary パラメーター長に応じて約 80 バイトであるため、 多数の小さな非連続部分を転送する方が、 選択された表現全体を転送するより効率が低い場合がある。

複数部分を要求していないクライアントは マルチパートレスポンスをサポートしない可能性があるため、サーバーは単一範囲のリクエストに マルチパートレスポンスを生成してはならない。ただし、 複数範囲が要求され、充足可能な範囲が一つだけ見つかった場合、 または結合後に一つの範囲だけが残った場合、サーバーは本文部分を一つだけ持つ "multipart/byteranges" レスポンスを生成してもよい。 "multipart/byteranges" レスポンスを処理できないクライアントは、 複数範囲を要求するリクエストを生成してはならない。

マルチパートレスポンスを生成するサーバーは、 充足不能と判断された範囲または他の 範囲へ結合された範囲を除き、対応する range-spec が受信した Range ヘッダーフィールドに現れたのと同じ順序で部分を送信することが望ましい。 マルチパートレスポンスを受信したクライアントは、その本文部分にどの範囲が含まれているか判断するため、 各本文部分に存在する Content-Range ヘッダー フィールドを調べなければならない。クライアントは、要求したのと同じ範囲や、 要求したのと同じ順序で受信することに依存できない。

15.3.7.3. 部分の結合

接続が早期に閉じられた場合、またはリクエストが一つ以上の Range 指定を使用した場合、 レスポンスは表現の一部分だけを転送する場合がある。 そのような転送を数回行った後、クライアントは同じ 表現の複数の範囲を受信している場合がある。これらの範囲は、すべてが同じ 強いバリデーター (8.8.1節) を共通に持つ場合にのみ安全に結合できる。

ターゲット リソースへの GET リクエストに対して複数の部分レスポンスを受信したクライアントは、 それらが同じ強いバリデーターを共有する場合、それらのレスポンスをより大きな 連続範囲へ結合してもよい。

最新のレスポンスが不完全な 200 (OK) レスポンスである場合、そのレスポンスのヘッダーフィールドが 結合レスポンスに使用され、一致する保存済み レスポンスのものを置き換える。

最新のレスポンスが 206 (Partial Content) レスポンスであり、一致する保存済みレスポンスの少なくとも一つが 200 (OK) である場合、結合レスポンスの ヘッダーフィールドは最新の 200 レスポンスのヘッダーフィールドから構成される。一致する保存済みレスポンスがすべて 206 レスポンスである場合、最も新しいヘッダーフィールドを持つ保存済みレスポンスが 結合レスポンスのヘッダーフィールドのソースとして使用される。ただし、クライアントは、Content-Range を除き、 新しいレスポンスで提供されたその他のヘッダーフィールドを使用して、 保存済みレスポンス内の対応するヘッダーフィールドのすべてのインスタンスを置き換えなければならない。

結合レスポンスコンテンツは、新しいレスポンスと 一致するすべての保存済みレスポンス内の部分コンテンツ範囲の和集合から構成される。 和集合が表現の範囲全体から構成される場合、クライアントは、 完全な長さを反映する Content-Length ヘッダーフィールドを含め、 結合レスポンスを完全な 200 (OK) レスポンスであるかのように処理しなければならない。それ以外の場合、クライアントは連続範囲の集合を、 結合レスポンスが表現の接頭部である場合は不完全な 200 (OK) レスポンス、"multipart/byteranges" コンテンツを含む単一の 206 (Partial Content) レスポンス、 またはそれぞれ Content-Range ヘッダーフィールドによって示される一つの連続 範囲を持つ複数の 206 (Partial Content) レスポンスのいずれかとして処理しなければならない。

15.4. リダイレクト 3xx

3xx (リダイレクト) クラスのステータスコードは、リクエストを満たすために ユーザーエージェントが追加のアクションを行う必要があることを示す。 リダイレクトにはいくつかの種類がある:

  1. Location ヘッダーフィールドによって提供されるように、 このリソースが別の URI で利用可能である可能性を示すリダイレクト。たとえば ステータスコード 301 (Moved Permanently)、 302 (Found)、307 (Temporary Redirect)、および 308 (Permanent Redirect)。
  2. このリソースを表現できる一致するリソース群の中から選択肢を提供するリダイレクト。 たとえば 300 (Multiple Choices) ステータスコード。
  3. Location ヘッダーフィールドによって識別される、 リクエストへの間接的なレスポンスを表現できる別のリソースへのリダイレクト。 たとえば 303 (See Other) ステータスコード。
  4. 以前に保存された結果へのリダイレクト。たとえば 304 (Not Modified) ステータスコード。

Location ヘッダーフィールド (10.2.2節 ) が提供されている場合、ユーザーエージェントは、 特定のステータスコードを理解していなくても、Location フィールド値によって参照される URI へ リクエストを自動的にリダイレクトしてもよい。安全であると分かっていないメソッドでは、自動リダイレクトは注意して行う必要がある。 9.2.1節 で定義されるように、 ユーザーは安全でないリクエストをリダイレクトしたくない可能性があるためである。

リダイレクトされたリクエストを自動的に追跡するとき、ユーザーエージェントは 次の変更を加えて元のリクエストメッセージを再送信することが望ましい:

  1. リダイレクトレスポンスの Location ヘッダーフィールド値を元のリクエストのターゲット URI に対して 解決した後、その URI でターゲット URI を置き換える。

  2. 実装によって自動生成されたヘッダーフィールドを削除し、 新しいリクエストに適した更新済みの値で置き換える。 これには以下が含まれる:

    1. 接続固有のヘッダーフィールド (7.6.1節 を参照)、
    2. Proxy-Authorization を含むがこれに限定されない、 クライアントのプロキシ設定に固有のヘッダーフィールド、
    3. Host を含むがこれに限定されない、 オリジン固有のヘッダーフィールド (存在する場合)、
    4. 実装のキャッシュによって追加された検証ヘッダーフィールド (例: If-None-Match、If-Modified-Since)、 および
    5. Referer、Origin、Authorization、および Cookie を含むがこれに限定されない、リソース固有のヘッダーフィールド。
  3. 実装によって自動生成されていないヘッダーフィールド (すなわち、呼び出し元コンテキストによって追加されたためリクエストに存在するもの) のうち、 セキュリティ上の影響があるものを削除することを検討する。これには Authorization および Cookie が含まれるが、これらに限定されない。

  4. 該当する場合、リダイレクトするステータスコードの セマンティクスに従ってリクエストメソッドを変更する。

  5. リクエストメソッドが GET または HEAD に変更された場合、 Content-Encoding、Content-Language、Content-Location、Content-Type、Content-Length、Digest、Last-Modified を含むがこれらに限定されない、 コンテンツ固有のヘッダーフィールドを削除する。

クライアントは循環リダイレクト (すなわち「無限」リダイレクトループ) を検出して介入することが望ましい。

15.4.1. 複数の選択肢

300 (Multiple Choices) ステータスコードは、ターゲットリソースが複数の表現を持ち、それぞれが独自の より具体的な識別子を持ち、ユーザー (またはユーザーエージェント) が リクエストをそれらの識別子の一つ以上へリダイレクトすることで優先表現を選択できるよう、 代替に関する情報が提供されていることを示す。言い換えると、 サーバーはユーザーエージェントが、自身の必要に最も適した表現を選択するため、 リアクティブネゴシエーションを行うことを望んでいる (12節)。

サーバーに優先される選択肢がある場合、サーバーは、 優先される選択肢の URI 参照を含む Location ヘッダーフィールドを 生成することが望ましい。ユーザーエージェントは 自動リダイレクトに Location フィールド値を使用してもよい。

HEAD 以外のリクエストメソッドについて、サーバーは、 ユーザーまたはユーザーエージェントが最も優先するものを選択できるよう、 表現メタデータおよび URI 参照のリストを含む コンテンツを 300 レスポンスに生成することが望ましい。ユーザーエージェントは、 提供されたメディアタイプを理解する場合、そのリストから自動的に選択してもよい。HTTP は 自身のコンテンツ定義と直交することを目指しているため、自動選択の具体的な形式は この仕様では定義されない。実際には、表現は、 共通設計またはコンテンツネゴシエーションによってユーザー エージェントに受け入れ可能と考えられる容易に解析可能な形式、または一般に 受け入れられているハイパーテキスト形式で提供される。

300 レスポンスはヒューリスティックにキャッシュ可能である。すなわち、 メソッド定義または明示的なキャッシュ制御によって別途示されない限りである ( [CACHING] の 4.2.2節 を参照)。

15.4.2. 恒久的に移動

301 (Moved Permanently) ステータスコードは、ターゲットリソースに新しい恒久 URI が割り当てられており、 このリソースへの将来の参照は、含まれる URI のいずれかを使用するべきであることを示す。 サーバーは、リンク編集機能を持つユーザーエージェントが、 ターゲット URI への参照を、サーバーから送信された新しい参照のいずれかへ恒久的に置き換えられることを提案している。 ただし、この提案は通常、ユーザーエージェントが実際に 参照を編集しており (例: コンテンツのオーサリング中)、接続が安全化され、 オリジンサーバーが編集中のコンテンツについて信頼できる権威である場合を除き無視される。

サーバーは、新しい恒久 URI の優先される URI 参照を含む Location ヘッダーフィールドをレスポンスに生成することが望ましい。 ユーザーエージェントは自動リダイレクトに Location フィールド値を使用してもよい。サーバーのレスポンス コンテンツには通常、新しい URI へのハイパーリンクを持つ短いハイパーテキスト注記が含まれる。

301 レスポンスはヒューリスティックにキャッシュ可能である。すなわち、 メソッド定義または明示的なキャッシュ制御によって別途示されない限りである ( [CACHING] の 4.2.2節 を参照)。

15.4.3. 発見

302 (Found) ステータスコードは、ターゲットリソースが一時的に 別の URI の下に存在することを示す。リダイレクトは時折変更される可能性があるため、 クライアントは将来のリクエストでもターゲット URI を引き続き使用するべきである。

サーバーは、別の URI への URI 参照を含む Location ヘッダーフィールドをレスポンスに生成することが望ましい。 ユーザーエージェントは 自動リダイレクトに Location フィールド値を使用してもよい。サーバーのレスポンスコンテンツには、 通常、別の URI へのハイパーリンクを持つ短いハイパーテキスト注記が含まれる。

15.4.4. 他を参照

303 (See Other) ステータスコードは、サーバーが Location ヘッダーフィールド内の URI によって示される別のリソースへ ユーザーエージェントをリダイレクトしており、そのリソースが元のリクエストへの 間接的なレスポンスを提供することを意図していることを示す。ユーザーエージェントは その URI をターゲットとする取得リクエスト (HTTP を使用する場合は GET または HEAD リクエスト) を実行でき、 それもリダイレクトされる場合があり、最終的な結果を元の リクエストへの回答として提示できる。Location ヘッダーフィールド内の新しい URI は ターゲット URI と等価とはみなされないことに注意すること。

このステータスコードは任意の HTTP メソッドに適用できる。主に、 POST アクションの出力からユーザーエージェントを別のリソースへリダイレクトできるようにするため使用される。 そうすることで、POST レスポンスに対応する情報を、 個別に識別、ブックマーク、キャッシュ可能なリソースとして提供できるためである。

GET リクエストへの 303 レスポンスは、オリジンサーバーが HTTP 経由でサーバーから転送できる ターゲットリソースの 表現を持たないことを示す。ただし、Location フィールド値は、 ターゲットリソースを記述するリソースを参照しており、 その別のリソースに取得 リクエストを行うと、元のターゲットリソースを表すことを意味せずに、 受信者に有用な表現が得られる場合がある。何を表現できるか、 どの表現が適切か、何が有用な記述となり得るかという問題への答えは HTTP の範囲外であることに注意すること。

HEAD リクエストへのレスポンスを除き、303 レスポンスの表現には、 Location ヘッダーフィールドで提供されたのと同じ URI 参照への ハイパーリンクを持つ短いハイパーテキスト注記を含めるべきである。

15.4.5. 未変更

304 (Not Modified) ステータスコードは、条件付き GET または HEAD リクエストを 受信し、条件が偽と評価されなければ 200 (OK) レスポンスになっていたことを示す。 言い換えると、条件付きリクエストを行ったクライアントは すでに有効な表現を持っていることをリクエストが示しているため、 サーバーがターゲットリソースの表現を転送する必要はない。 したがって、サーバーは、保存された 表現を 200 (OK) レスポンスのコンテンツであるかのように使用するようクライアントをリダイレクトしている。

304 レスポンスを生成するサーバーは、同じリクエストへの 200 (OK) レスポンスで送信されていた 次のヘッダーフィールドを生成しなければならない:

304 レスポンスの目的は、受信者がすでに一つ以上のキャッシュ済み表現を持つ場合の 情報転送を最小化することであるため、送信者は、 そのメタデータがキャッシュ 更新を導く目的で存在する場合を除き、上記のフィールド以外の表現メタデータを生成しないことが望ましい (例: レスポンスに ETag フィールドがない場合、Last-Modified が 有用な場合がある)。

304 レスポンスを受信したキャッシュに対する要件は、 [CACHING] の 4.3.4節 で定義される。 条件付きリクエストが、自身のキャッシュを持つユーザーエージェントが共有プロキシへ 条件付き GET を送信する場合など、送信方向クライアントから発生した場合、 プロキシは 304 レスポンスをそのクライアントへ転送することが望ましい。

304 レスポンスはヘッダーセクションの終端で終了し、 コンテンツまたはトレーラーを含めることはできない。

15.4.6. プロキシを使用

305 (Use Proxy) ステータスコードは、この 仕様の以前のバージョンで定義され、現在は非推奨である ( [RFC7231] の付録 B)。

15.4.7. (未使用)

306 ステータスコードはこの仕様の以前のバージョンで定義されていたが、 現在は使用されておらず、このコードは予約されている。

15.4.8. 一時的なリダイレクト

307 (Temporary Redirect) ステータスコードは、ターゲットリソースが一時的に 別の URI の下に存在し、ユーザーエージェントがその URI へ自動リダイレクトする場合、 リクエストメソッドを変更してはならないことを示す。リダイレクトは 時間とともに変化する可能性があるため、クライアントは将来のリクエストでも元の ターゲット URI を引き続き使用するべきである。

サーバーは、別の URI への URI 参照を含む Location ヘッダーフィールドをレスポンスに生成することが望ましい。 ユーザーエージェントは 自動リダイレクトに Location フィールド値を使用してもよい。サーバーのレスポンスコンテンツには、 通常、別の URI へのハイパーリンクを持つ短いハイパーテキスト注記が含まれる。

15.4.9. 恒久的なリダイレクト

308 (Permanent Redirect) ステータスコードは、ターゲットリソースに新しい 恒久 URI が割り当てられており、このリソースへの将来の参照は 含まれる URI のいずれかを使用するべきであることを示す。サーバーは、 リンク編集機能を持つユーザーエージェントが、ターゲット URI への参照を サーバーから送信された新しい参照のいずれかへ恒久的に置き換えられることを提案している。ただし、 この提案は通常、ユーザーエージェントが実際に参照を編集しており (例: コンテンツのオーサリング中)、接続が安全化され、 オリジンサーバーが編集中の コンテンツについて信頼できる権威である場合を除き無視される。

サーバーは、新しい恒久 URI の優先される URI 参照を含む Location ヘッダーフィールドをレスポンスに生成することが望ましい。 ユーザーエージェントは 自動リダイレクトに Location フィールド値を使用してもよい。サーバーのレスポンスコンテンツには、 通常、新しい URI へのハイパーリンクを持つ短いハイパーテキスト注記が含まれる。

308 レスポンスはヒューリスティックにキャッシュ可能である。すなわち、 メソッド定義または明示的なキャッシュ制御によって別途示されない限りである ( [CACHING] の 4.2.2節 を参照)。

15.5. クライアントエラー 4xx

4xx (クライアントエラー) クラスのステータスコードは、クライアントが 誤ったように見えることを示す。HEAD リクエストへのレスポンスの場合を除き、サーバーは、 エラー状況と、それが一時的または恒久的な状態かどうかの説明を含む 表現を送信することが望ましい。これらのステータス コードは任意のリクエストメソッドに適用できる。ユーザーエージェントは、 含まれる表現をユーザーへ表示することが望ましい。

15.5.1. 不正なリクエスト

400 (Bad Request) ステータスコードは、クライアントエラーとみなされる何らかの問題 (例: 不正なリクエスト構文、無効なリクエストメッセージフレーミング、 または欺瞞的なリクエストルーティング) のため、サーバーが リクエストを処理できない、または処理しないことを示す。

15.5.2. 未認証

401 (Unauthorized) ステータスコードは、ターゲットリソースに対する有効な 認証資格情報がないためリクエストが適用されなかったことを示す。 401 レスポンスを生成するサーバーは、ターゲットリソースに適用可能な少なくとも一つのチャレンジを含む WWW-Authenticate ヘッダーフィールド (11.6.1節) を送信しなければならない。

リクエストが認証資格情報を含んでいた場合、401 レスポンスは、 それらの資格情報に対する認可が拒否されたことを示す。ユーザーエージェントは、 新しいまたは置換された Authorization ヘッダーフィールド (11.6.2節) とともにリクエストを繰り返してもよい。 401 レスポンスが以前のレスポンスと同じチャレンジを含み、 ユーザーエージェントがすでに少なくとも一度認証を試みている場合、 含まれる表現には通常関連する 診断情報が含まれるため、ユーザーエージェントはそれをユーザーへ提示することが望ましい。

15.5.3. 支払いが必要

402 (Payment Required) ステータスコードは将来の使用のために予約されている。

15.5.4. 禁止

403 (Forbidden) ステータスコードは、サーバーがリクエストを理解したが 満たすことを拒否していることを示す。リクエストが 禁止された理由を公開したいサーバーは、その理由をレスポンスコンテンツ (存在する場合) で記述できる。

認証資格情報がリクエストで提供された場合、サーバーはそれらを アクセス許可には不十分とみなす。クライアントは、 同じ資格情報でリクエストを自動的に繰り返さないことが望ましい。クライアントは、 新しいまたは異なる資格情報でリクエストを繰り返してもよい。 ただし、リクエストは資格情報と無関係な理由で禁止されている場合もある。

禁止された ターゲットリソースの現在の存在を「隠したい」オリジンサーバーは、 代わりに 404 (Not Found) ステータスコードで応答してもよい。

15.5.5. 見つからない

404 (Not Found) ステータスコードは、オリジンサーバーが ターゲット リソースの現在の表現を見つけられなかったか、その存在を開示する意思がないことを示す。404 ステータスコードは、 この表現の欠如が一時的か恒久的かを示さない。 オリジンサーバーが、何らかの設定可能な手段などを通じて 状態が恒久的である可能性が高いと知っている場合は、404 より 410 (Gone) ステータスコードが推奨される。

404 レスポンスはヒューリスティックにキャッシュ可能である。すなわち、 メソッド定義または明示的なキャッシュ制御によって別途示されない限りである ( [CACHING] の 4.2.2節 を参照)。

15.5.6. メソッドが許可されていない

405 (Method Not Allowed) ステータスコードは、 request-line で受信されたメソッドをオリジンサーバーは認識しているが、ターゲットリソースではサポートしていないことを示す。 オリジンサーバーは、ターゲットリソースが現在サポートするメソッドのリストを含む Allow ヘッダーフィールドを 405 レスポンスで生成しなければならない。

405 レスポンスはヒューリスティックにキャッシュ可能である。すなわち、 メソッド定義または明示的なキャッシュ制御によって別途示されない限りである ( [CACHING] の 4.2.2節 を参照)。

15.5.7. 受け入れ不可

406 (Not Acceptable) ステータスコードは、リクエストで受信した プロアクティブネゴシエーションヘッダー フィールド (12.1節) に従って、 ターゲットリソースにユーザーエージェントが受け入れ可能な現在の表現がなく、 サーバーがデフォルト表現の提供を望んでいないことを示す。

サーバーは、ユーザーまたはユーザーエージェントが最も適切なものを選択できる、 利用可能な表現の特性および対応するリソース識別子のリストを含む コンテンツを生成することが望ましい。ユーザーエージェントは、 そのリストから最も適切な選択肢を自動的に選択してもよい。 ただし、この仕様はそのような 自動選択の標準を定義していない。15.4.1節 で説明されるとおりである。

15.5.8. プロキシ認証が必要

407 (Proxy Authentication Required) ステータスコードは 401 (Unauthorized) に似ているが、 このリクエストでプロキシを使用するにはクライアントが自身を認証する必要があることを示す。 プロキシは、そのリクエストについてそのプロキシに適用可能なチャレンジを含む Proxy-Authenticate ヘッダーフィールド (11.7.1節) を送信しなければならない。 クライアントは、新しいまたは置換された Proxy-Authorization ヘッダーフィールド (11.7.2節) とともにリクエストを繰り返してもよい。

15.5.9. リクエストのタイムアウト

408 (Request Timeout) ステータスコードは、サーバーが 待機する用意のある時間内に完全なリクエストメッセージを受信しなかったことを示す。

クライアントに転送中の未完了リクエストがある場合、そのリクエストを 繰り返してもよい。現在の接続が利用不能な場合 (例: リクエスト区切りが失われる HTTP/1.1 の場合)、新しい接続が使用される。

15.5.10. 競合

409 (Conflict) ステータスコードは、ターゲットリソースの現在の状態との 競合のためリクエストを完了できなかったことを示す。このコードは、 ユーザーが競合を解決してリクエストを再送信できる可能性がある状況で使用される。 サーバーは、ユーザーが競合の原因を認識するのに十分な情報を含む コンテンツを生成することが望ましい。

競合は PUT リクエストへのレスポンスで最も発生しやすい。たとえば、 バージョニングが使用され、PUT される表現が、 以前の (第三者による) リクエストによる変更と競合するリソースへの変更を含む場合、 オリジンサーバーはリクエストを完了できないことを示すため 409 レスポンスを使用する場合がある。この場合、レスポンス表現には、 リビジョン履歴に基づいて差分をマージするのに有用な情報が含まれる可能性が高い。

15.5.11. 消失

410 (Gone) ステータスコードは、ターゲットリソースへのアクセスがオリジンサーバーで利用できなくなり、 この状態が恒久的である可能性が高いことを示す。オリジンサーバーが、 状態が恒久的かどうかを知らない、または判断する手段を持たない場合、 代わりにステータスコード 404 (Not Found) を使用するべきである。

410 レスポンスは主に、リソースが意図的に利用不能であり、 サーバー所有者がそのリソースへのリモートリンクを削除してほしいことを 受信者へ通知することで、Web 保守作業を支援することを意図している。そのような事象は、 期間限定の販促サービスや、 オリジンサーバーのサイトと関係しなくなった個人に属するリソースでよく発生する。 恒久的に利用不能なすべてのリソースを "gone" としてマークしたり、そのマークを任意の 期間維持したりする必要はなく、それはサーバー所有者の判断に委ねられる。

410 レスポンスはヒューリスティックにキャッシュ可能である。すなわち、 メソッド定義または明示的なキャッシュ制御によって別途示されない限りである ( [CACHING] の 4.2.2節 を参照)。

15.5.12. 長さが必要

411 (Length Required) ステータスコードは、定義された Content-Length (8.6節) なしでは サーバーがリクエストを受け入れることを拒否していることを示す。 クライアントは、リクエストコンテンツの長さを含む有効な Content-Length ヘッダーフィールドを追加する場合、リクエストを繰り返してもよい。

15.5.13. 事前条件の失敗

412 (Precondition Failed) ステータスコードは、リクエストヘッダーフィールドで与えられた 一つ以上の条件が、サーバーでテストされた際に偽と評価されたことを示す (13節)。 このレスポンスステータスコードにより、クライアントは現在の リソース状態 (現在の表現およびメタデータ) に事前条件を課し、その結果、 ターゲットリソースが予期しない状態にある場合にリクエストメソッドが適用されるのを防ぐことができる。

15.5.14. コンテンツが大きすぎる

413 (Content Too Large) ステータスコードは、 リクエストコンテンツがサーバーが処理する意思または能力のあるサイズより大きいため、 サーバーがリクエストの処理を拒否していることを示す。使用中のプロトコルバージョンが許可する場合、サーバーは リクエストを終了してもよく、それ以外の場合、サーバーは 接続を閉じてもよい。

状態が一時的である場合、サーバーは、それが一時的であることと、 クライアントがいつ再試行してもよいかを示すため、Retry-After ヘッダーフィールドを生成することが望ましい。

15.5.15. URI が長すぎる

414 (URI Too Long) ステータスコードは、ターゲット URI が サーバーが解釈する意思のある長さより長いため、サーバーがリクエストへのサービス提供を拒否していることを示す。 このまれな状態は、クライアントが長い query 情報を持つ POST リクエストを 不適切に GET リクエストへ変換した場合、クライアントが 無限のリダイレクトループ (例: 自身の接尾部を指すリダイレクト URI 接頭辞) に陥った場合、または潜在的なセキュリティホールを悪用しようとする クライアントによる攻撃をサーバーが受けている場合にのみ発生する可能性が高い。

414 レスポンスはヒューリスティックにキャッシュ可能である。すなわち、 メソッド定義または明示的なキャッシュ制御によって別途示されない限りである ( [CACHING] の 4.2.2節 を参照)。

15.5.16. 未対応のメディア型

415 (Unsupported Media Type) ステータスコードは、コンテンツが ターゲットリソースに対するこのメソッドでサポートされない形式であるため、 オリジンサーバーがリクエストへのサービス提供を拒否していることを示す。

形式の問題は、リクエストで示された Content-Type または Content-Encoding に起因する場合も、 データを直接調べた結果である場合もある。

問題がサポートされていない content coding によって生じた場合、 Accept-Encoding レスポンスヘッダー フィールド (12.5.3節) を使用して、 リクエストでどの content coding が受け入れられたか (ある場合) を示すべきである。

一方、原因がサポートされていないメディアタイプである場合、 Accept レスポンスヘッダーフィールド (12.5.1節 ) を使用して、リクエストでどのメディアタイプが受け入れられたかを示すことができる。

15.5.17. 範囲を満たせない

416 (Range Not Satisfiable) ステータスコードは、リクエストの Range ヘッダーフィールド (14.2節) 内の範囲集合が、要求された範囲のどれも充足可能でないため、 またはクライアントが過剰な数の小さなもしくは重複する範囲 (潜在的なサービス拒否攻撃) を要求したため拒否されたことを示す。

各範囲単位は、自身の範囲集合が充足可能となるために必要な条件を定義する。 たとえば、14.1.2節 は、 bytes 範囲集合を充足可能にする条件を定義する。

バイト範囲リクエストへの 416 レスポンスを生成するサーバーは、 選択された表現の現在の長さを指定する Content-Range ヘッダーフィールド (14.4節) を生成することが望ましい。

例:

HTTP/1.1 416 Range Not Satisfiable
Date: Fri, 20 Jan 2012 15:41:54 GMT
Content-Range: bytes */47022

15.5.18. 期待が満たされない

417 (Expectation Failed) ステータスコードは、リクエストの Expect ヘッダーフィールド (10.1.1節 ) で与えられた期待を、少なくとも一つの受信方向サーバーが満たせなかったことを示す。

15.5.19. (未使用)

[RFC2324] は、HTTP が悪用されていたさまざまな方法を風刺した 4 月 1 日の RFC であった。 その悪用の一つはアプリケーション固有の 418 ステータスコードの定義であり、 冗談として十分に広く配備されたため、このコードは将来の用途には使用不能になった。

したがって、418 ステータスコードは IANA HTTP Status Code Registry で予約されている。 これは、このステータスコードを現在 他のアプリケーションへ割り当てられないことを示す。将来の状況で使用が必要になった場合 (例: 4NN ステータス コードの枯渇)、別の用途へ再割り当てできる。

15.5.20. 誤った宛先のリクエスト

421 (Misdirected Request) ステータスコードは、ターゲット URI に対する 権威あるレスポンスを生成できない、または生成する意思のないサーバーへリクエストが向けられたことを示す。 オリジンサーバー (またはオリジンサーバーの代理として動作するゲートウェイ) は、 サーバーが設定されている オリジン (4.3.1節) と一致しない、 またはリクエストを受信した接続コンテキスト (7.4節) と一致しないターゲット URI を拒否するため 421 を送信する。

421 (Misdirected Request) レスポンスを受信したクライアントは、 リクエストメソッドがべき等かどうかにかかわらず、 ターゲットリソースのオリジン専用の新しい接続などの別の接続、 または代替サービス [ALTSVC] を介してリクエストを再試行してもよい。

プロキシは 421 レスポンスを生成してはならない。

15.5.21. 処理できないコンテンツ

422 (Unprocessable Content) ステータスコードは、サーバーが リクエストコンテンツのコンテンツタイプを理解しており (したがって 415 (Unsupported Media Type) ステータスコードは不適切)、かつ リクエストコンテンツの構文は正しいが、含まれる 命令を処理できなかったことを示す。たとえば、XML リクエストコンテンツが 整形式 (すなわち構文的に正しい) だが、セマンティクス上誤った XML 命令を含む場合、このステータスコードを送信できる。

15.5.22. アップグレードが必要

426 (Upgrade Required) ステータスコードは、サーバーが現在の プロトコルを使用したリクエストの実行を拒否するが、クライアントが別のプロトコルへ アップグレードした後であれば実行する意思がある可能性を示す。サーバーは、 必要なプロトコルを示すため、426 レスポンスに Upgrade ヘッダーフィールドを 送信しなければならない (7.8節)。

例:

HTTP/1.1 426 Upgrade Required
Upgrade: HTTP/3.0
Connection: Upgrade
Content-Length: 53
Content-Type: text/plain

このサービスでは HTTP/3.0 プロトコルの使用が必要です。

15.6. サーバーエラー 5xx

5xx (サーバーエラー) クラスのステータスコードは、サーバーが自身の エラーを認識しているか、要求されたメソッドを実行できないことを示す。HEAD リクエストへのレスポンスの場合を除き、 サーバーは、エラー状況と、それが一時的または 恒久的な状態かどうかの説明を含む表現を送信することが望ましい。ユーザーエージェントは、 含まれる表現をユーザーへ表示することが望ましい。これらのステータスコードは任意のリクエストメソッドに適用できる。

15.6.1. サーバー内部エラー

500 (Internal Server Error) ステータスコードは、サーバーが リクエストを満たすことを妨げる予期しない状態に遭遇したことを示す。

15.6.2. 未実装

501 (Not Implemented) ステータスコードは、サーバーが リクエストを満たすために必要な機能をサポートしていないことを示す。これは、 サーバーがリクエストメソッドを認識せず、 いかなるリソースについてもそれをサポートできない場合の適切なレスポンスである。

501 レスポンスはヒューリスティックにキャッシュ可能である。すなわち、 メソッド定義または明示的なキャッシュ制御によって別途示されない限りである ( [CACHING] の 4.2.2節 を参照)。

15.6.3. 不正なゲートウェイ

502 (Bad Gateway) ステータスコードは、ゲートウェイまたは プロキシとして動作しているサーバーが、リクエストを満たそうとしてアクセスした 受信方向サーバーから無効なレスポンスを受信したことを示す。

15.6.4. サービス利用不可

503 (Service Unavailable) ステータスコードは、一時的な過負荷または予定された保守のため、 サーバーが現在 リクエストを処理できず、ある程度の遅延後には解消される可能性が高いことを示す。サーバーは、 クライアントがリクエストを再試行するまで待つ適切な時間を提案するため、 Retry-After ヘッダーフィールド (10.2.3節) を送信してもよい。

15.6.5. ゲートウェイのタイムアウト

504 (Gateway Timeout) ステータスコードは、ゲートウェイまたは プロキシとして動作しているサーバーが、リクエストを完了するためにアクセスする必要のあった 上流サーバーから適時のレスポンスを受信しなかったことを示す。

15.6.6. HTTP バージョン未対応

505 (HTTP Version Not Supported) ステータスコードは、サーバーが リクエストメッセージで使用された HTTP のメジャーバージョンを サポートしていない、またはサポートすることを拒否していることを示す。サーバーは、2.5節 で説明されるように、 このエラーメッセージ以外では、クライアントと同じメジャーバージョンを使用して リクエストを完了できない、または完了する意思がないことを示している。サーバーは、 そのバージョンがサポートされない理由と、そのサーバーがサポートする他のプロトコルを記述する 表現を 505 レスポンスに生成することが望ましい。

16. HTTP の 拡張

HTTP は、新しいバージョンを導入することなくプロトコルへ機能を 導入するために使用できる多数の汎用拡張ポイントを定義している。これにはメソッド、ステータスコード、フィールド 名、および認証 スキームやキャッシュディレクティブなど、定義済みフィールド内のさらなる拡張ポイントが含まれる ( [CACHING] の 5.2.3節 の Cache-Control 拡張を参照)。HTTP のセマンティクスは バージョン付けされないため、これらの拡張ポイントは永続的であり、使用中のプロトコルバージョンは そのセマンティクスに影響しない。

バージョン非依存の拡張は、使用中の 特定のプロトコルバージョンに依存したり相互作用したりしないことが推奨される。これが避けられない場合は、 その拡張がバージョン間でどのように相互運用できるかを慎重に検討する必要がある。

さらに、HTTP の特定のバージョンには独自の拡張ポイントがある場合がある。たとえば HTTP/1.1 の転送コーディング ( [HTTP/1.1] の 6.1節) や HTTP/2 の SETTINGS またはフレームタイプ ([HTTP/2]) である。これらの拡張ポイントは、それが存在する プロトコルバージョンに固有である。

バージョン固有の拡張は、そのプロトコル要素によって明示的に 許可されていない限り、バージョン非依存の機構または拡張ポイント (メソッドやヘッダーフィールドなど) のセマンティクスを上書きまたは変更できない。たとえば、CONNECT メソッド (9.3.6節) はこれを許可している。

これらのガイドラインにより、経路の一部が 異なるバージョンの HTTP を実装している場合でも、プロトコルが正しく予測可能に動作することが保証される。

16.1. メソッドの拡張性

16.1.1. メソッドレジストリ

IANA が https://www.iana.org/assignments/http-methods で管理する "Hypertext Transfer Protocol (HTTP) Method Registry" は、 method 名を登録する。

HTTP メソッドの登録には、次のフィールドを含めなければならない:

  • メソッド名 (9節を参照)
  • 安全 ("yes" または "no"、9.2.1節 を参照)
  • べき等 ("yes" または "no"、9.2.2節を参照)
  • 仕様本文への参照

この名前空間に追加する値には IETF Review が必要である ([RFC8126], 4.8節を参照)。

16.1.2. 新しいメソッドに関する考慮事項

標準化されたメソッドは汎用的である。すなわち、特定の 一つのメディアタイプ、リソースの種類、またはアプリケーションだけでなく、任意の リソースに適用できる可能性がある。そのため、直交する技術には 直交する仕様がふさわしいので、新しいメソッドは単一のアプリケーションまたはデータ形式に 固有ではない文書で登録することが望ましい。

メッセージ解析 (6節) は、HEAD へのレスポンスを除きメソッド セマンティクスから独立している必要があるため、新しいメソッドの定義は 解析アルゴリズムを変更したり、リクエストまたは レスポンスメッセージでコンテンツの存在を禁止したりできない。新しいメソッドの定義は、 値 "0" の Content-Length ヘッダーフィールドを要求することで、長さ 0 の コンテンツだけが許可されると規定できる。

同様に、新しいメソッドは、それぞれ CONNECT および OPTIONS で許可されている特別な host:port およびアスタリスク形式の リクエストターゲットを使用できない (7.1節)。ターゲット URI には絶対 形式の完全な URI が必要であり、これはリクエストターゲットを 絶対形式で送信するか、他のメソッドと同じ方法でリクエスト コンテキストからターゲット URI を再構成する必要があることを意味する。

新しいメソッドの定義は、それが安全か (9.2.1節)、べき等か (9.2.2節)、 キャッシュ可能か (9.2.3節 )、リクエストコンテンツ (存在する場合) にどのようなセマンティクスを関連付けるか、 およびメソッドがヘッダーフィールドまたはステータスコードの セマンティクスへどのような限定を加えるかを示す必要がある。新しいメソッドがキャッシュ可能な場合、その定義は、 キャッシュがどのように、またどの条件下でレスポンスを保存し、 後続リクエストを満たすために使用できるかを記述するべきである。新しいメソッドは、 条件付きにできるか (13.1節)、また できる場合、条件が偽のときサーバーがどのように応答するかを記述するべきである。同様に、新しい メソッドが部分レスポンスセマンティクス (14.2節) を利用する可能性がある場合、 それについても文書化するべきである。

16.2. ステータスコードの拡張性

16.2.1. ステータスコードレジストリ

IANA が管理する "Hypertext Transfer Protocol (HTTP) Status Code Registry" は https://www.iana.org/assignments/http-status-codes で ステータスコード番号を登録する。

登録には次のフィールドを含めなければならない:

  • ステータスコード (3 桁)
  • 短い説明
  • 仕様本文への参照

HTTP ステータスコード名前空間へ追加する値には IETF Review が必要である ([RFC8126], 4.8節を参照)。

16.2.2. 新しいステータスコードに関する考慮事項

現在のステータスコードで定義されていないレスポンスのセマンティクスを表現する必要がある場合、 新しいステータスコードを登録できる。ステータスコードは汎用的であり、 特定の一つのメディアタイプ、 リソースの種類、または HTTP のアプリケーションだけでなく、任意のリソースに適用できる可能性がある。そのため、新しいステータス コードは単一のアプリケーションに固有ではない文書で登録することが望ましい。

新しいステータスコードは、15節 で定義されるカテゴリのいずれかに属する必要がある。既存の パーサーがレスポンスメッセージを処理できるよう、新しいステータスコードはコンテンツを禁止できないが、 長さ 0 のコンテンツを義務付けることはできる。

まだ広く配備されていない新しいステータスコードの提案では、 登録されるという明確な合意が得られるまでは、 コードに特定の番号を割り当てないことが望ましい。その代わり、初期ドラフトでは "4NN" や "3N0" .. "3N9" のような表記を使用して、番号を 時期尚早に消費することなく提案されたステータスコードのクラスを示すことができる。

新しいステータスコードの定義は、そのステータスコードを含む レスポンスを引き起こすリクエスト条件 (例: リクエスト ヘッダーフィールドやメソッドの組み合わせ) と、レスポンスヘッダー フィールドへの依存関係 (例: どのフィールドが必須か、どのフィールドがセマンティクスを変更できるか、および 新しいステータスコードとともに使用した際にどのフィールドセマンティクスがさらに限定されるか) を説明するべきである。

デフォルトでは、ステータスコードは、そのコードが含まれるレスポンスに対応するリクエストにのみ適用される。 ステータスコードがより広い適用範囲 — たとえば、対象リソースへのすべてのリクエストやサーバーへのすべてのリクエスト — に適用される場合、 それを明示的に規定しなければならない。その際、新しいステータスコードを理解しない可能性があるため、 すべてのクライアントがより広い範囲を 一貫して適用できるとは限らないことに注意するべきである。

新しい最終ステータスコードの定義は、それが ヒューリスティックにキャッシュ可能かどうかを規定するべきである。最終ステータスコードを持つ任意のレスポンスは、 明示的な鮮度情報を持つ場合にキャッシュできることに注意すること。 ヒューリスティックにキャッシュ可能と定義されたステータスコードは、明示的な鮮度 情報なしでもキャッシュすることが許可される。同様に、must-understand キャッシュディレクティブが使用される場合、 ステータスコードの定義はキャッシュ動作へ制約を課すことができる。詳細については [CACHING] を参照。

最後に、新しいステータスコードの定義は、コンテンツが 識別されたリソースと何らかの暗黙の関連を持つかどうかを示すべきである (6.4.2節)。

16.3. フィールドの拡張性

HTTP で最も広く使用される拡張ポイントは、新しいヘッダーおよびトレーラー フィールドの定義である。

新しいフィールドは、受信者が理解した場合、 以前に定義されたフィールドの解釈を上書きまたは拡張し、 リクエスト評価に事前条件を定義し、またはレスポンスの意味を限定するよう定義できる。

ただし、フィールドを定義しても、受信者による配備または認識が保証されるわけではない。 ほとんどのフィールドは、受信者が認識しないフィールドを安全に無視 (ただし下流へ転送) できることを期待して設計される。それ以外の場合、 特定のフィールドを理解する送信者の能力は、以前の通信、 おそらく以前のメッセージで送信したプロトコルバージョンまたはフィールド、あるいは特定の メディアタイプの使用によって示される場合がある。同様に、導入されるフィールドとともに そのような検査が定義されている場合、OPTIONS リクエストや定義済みの well-known URI [RFC8615] との対話を通じて、 サポートを直接検査できる場合もある。

16.3.1. フィールド名レジストリ

"Hypertext Transfer Protocol (HTTP) Field Name Registry" は、HTTP フィールド名の 名前空間を定義する。

任意の当事者が HTTP フィールドの登録を要求できる。新しい HTTP フィールドを作成する際に 考慮すべき事項については、16.3.2節 を参照。

"Hypertext Transfer Protocol (HTTP) Field Name Registry" は https://www.iana.org/assignments/http-fields/ にある。 登録要求は、そこに記載された手順に従うか、 "ietf-http-wg@w3.org" メーリングリストへメールを送信して行える。

フィールド名は、指定専門家 (IESG またはその代理者によって任命) の助言に基づいて登録される。 ステータスが 'permanent' のフィールドには Specification Required が適用される ([RFC8126], 4.6節)。

登録要求は次の情報から構成される:

フィールド名:
要求するフィールド名。5.1節 で定義される field-name 構文に適合しなければならず、 最初の文字を英字とし、英字、 数字、およびハイフン ('-') 文字だけに制限することが望ましい。
ステータス:
"permanent"、"provisional"、"deprecated"、または "obsoleted"。
仕様文書:
フィールドを規定する文書への参照。文書のコピーを取得するために使用できる URI を 含むことが望ましい。暫定登録では任意だが推奨される。 関連する節を示すこともできるが、必須ではない。

さらに任意で:

コメント:
予約済みエントリーに関する情報などの追加情報。

専門家は、コミュニティと協議して、レジストリで収集する追加フィールドを定義できる。

標準で定義された名前は "permanent" ステータスを持つ。その他の名前も、 専門家がコミュニティと協議し、それらが使用中であると判断した場合、permanent として 登録できる。その他の名前は "provisional" として登録するべきである。

暫定エントリーは、専門家がコミュニティと協議して 使用されていないと判断した場合、専門家によって削除できる。専門家は、 暫定エントリーのステータスをいつでも permanent に変更できる。

未登録の名前が広く配備されており、それ以外では 適時に登録される可能性が低いと専門家が判断した場合、第三者 (専門家自身を含む) が名前を登録できることに注意すること。

16.3.2. 新しいフィールドに関する考慮事項

HTTP ヘッダーおよびトレーラーフィールドは、プロトコルで広く使用される拡張ポイントである。 アドホックに使用することもできるが、より広範な使用を意図したフィールドは、 相互運用性を確保するため慎重に文書化する必要がある。

特に、新しいフィールドを定義する仕様の著者には、 次の側面を検討し、適切な場合には文書化することが推奨される:

  • どの条件でフィールドを使用できるか。例: レスポンスまたは リクエストだけ、すべてのメッセージ、特定のリクエストメソッドへのレスポンスだけ、 など。
  • 特定のリクエストメソッドやステータスコードでの使用など、 コンテキストによってフィールドセマンティクスがさらに限定されるか。
  • 伝達される情報の適用範囲。デフォルトでは、フィールドは 関連付けられたメッセージだけに適用されるが、一部のレスポンスフィールドは、 リソースのすべての表現、リソース自体、または さらに広い範囲に適用されるよう設計される。レスポンスフィールドの範囲を拡大する仕様は、 コンテンツネゴシエーション、適用期間、 および (場合によっては) マルチテナントサーバー配備などの問題を慎重に検討する必要がある。
  • どの条件で仲介者がフィールド値を挿入、削除、または変更できるか。
  • フィールドがトレーラーで許可されるか。デフォルトでは許可されない (6.5.1節 を参照)。
  • フィールド名を Connection ヘッダーフィールドへ列挙することが適切か、または必須であるか (すなわち、フィールドが hop-by-hop である場合。7.6.1節を参照)。
  • フィールドが、プライバシー関連データの開示など、 追加のセキュリティ上の考慮事項を導入するか。

リクエストヘッダーフィールドには、デフォルト動作が適切でない場合に 文書化する必要がある追加の考慮事項がある:

  • フィールド名を Vary レスポンスヘッダーフィールドへ列挙することが適切か (例: リクエストヘッダー フィールドがオリジンサーバーのコンテンツ選択アルゴリズムで使用される場合。12.5.5節 を参照)。
  • PUT リクエストで受信された際にフィールドを保存することを意図しているか (9.3.4節を参照)。
  • セキュリティ上の懸念によりリクエストを自動リダイレクトする際に フィールドを削除するべきか (15.4節を参照)。
16.3.2.1. 新しいフィールド 名に関する考慮事項

新しいフィールドを定義する仕様の著者には、短いが 説明的なフィールド名を選択することが推奨される。短い名前は不要なデータ転送を避け、 説明的な名前は混乱や、より 広範な用途を持ち得る名前の「占有」を避ける。

そのため、限定用途のフィールド (単一の アプリケーションまたはユースケースに限定されたヘッダーなど) には、その用途 (または 略語) を接頭辞として含む名前を使用することが推奨される。たとえば、Foo Application に Description フィールドが必要な場合、"Foo-Desc" を使用できる。"Description" は汎用的すぎ、 "Foo-Description" は不必要に長い。

field-name 構文は任意の token 文字を許可するよう定義されているが、実際には 一部の実装は field-name で受け入れる文字に制限を設ける。 相互運用可能にするため、新しいフィールド名は英数字、"-"、"." に 制限することが望ましく、英字で始めることが望ましい。たとえば、アンダースコア ("_") 文字は、HTTP 以外のゲートウェイ インターフェイスを通過するときに問題となる場合がある (17.10節を参照)。

フィールド名には "X-" を接頭辞として付けるべきではない。詳細については [BCP178] を参照。

HTTP フィールド名では他の接頭辞も使用される場合がある。たとえば、"Accept-" は 多くのコンテンツネゴシエーションヘッダーで使用され、"Content-" は 6.4節 で説明されるように使用される。これらの接頭辞は フィールドの目的を認識する助けにすぎず、自動的な 処理を引き起こさない。

16.3.2.2. 新しいフィールド 値に関する考慮事項

新しい HTTP フィールドの定義における主要な作業は、 フィールド値構文、すなわち送信者が何を生成するべきか、および受信者が 受信したものからどのようにセマンティクスを推論するべきかを規定することである。

著者には、新しいフィールド値の構文を定義するため、 この仕様の ABNF 規則または [RFC8941] の規則を使用することが推奨される (ただし必須ではない)。

著者には、複数のフィールド 行の結合がどのような影響を与えるか慎重に検討することが推奨される (5.3節 を参照)。送信者が誤って複数の値を送信する場合があり、 仲介者と HTTP ライブラリの両方が自動的に結合を実行できるため、 これは単一の値だけが想定される場合でも、すべてのフィールド値に適用される。

したがって著者には、コンマを含む値を区切る、またはエンコードすることが推奨される (例: 5.6.4節 の quoted-string 規則、[RFC8941] の String データ型、または フィールド固有のエンコーディング)。これにより、フィールドデータ内のコンマが リスト値を区切るコンマと混同されないことを保証できる。

たとえば、Content-Type フィールド値は引用文字列内でのみコンマを許可するため、複数の値が存在しても 確実に解析できる。Location フィールド値は模倣すべきでない反例である。 URI はコンマを含められるため、コンマを含む単一の値と二つの値を 確実に区別することはできない。

単一値を持つフィールド (5.5節を参照) の著者には、複数のメンバーが存在する メッセージをどのように扱うかも文書化することが推奨される (妥当なデフォルトはフィールドを無視することだが、必ずしも常に正しい選択とは限らない)。

16.4. 認証スキームの拡張性

16.4.1. 認証スキームレジストリ

"Hypertext Transfer Protocol (HTTP) Authentication Scheme Registry" は、 チャレンジおよび資格情報内の認証スキームの名前空間を定義する。これは https://www.iana.org/assignments/http-authschemes で管理される。

登録には次のフィールドを含めなければならない:

  • 認証スキーム名
  • 仕様本文への参照
  • 注記 (任意)

この名前空間に追加する値には IETF Review が必要である ([RFC8126], 4.8節を参照)。

16.4.2. 新しい認証 スキームに関する考慮事項

HTTP 認証フレームワークには、新しい認証スキームがどのように動作できるかを 制約する特定の側面がある:

  • HTTP 認証はステートレスであると想定される。リクエストを認証するために 必要なすべての情報は、サーバーが以前のリクエストを 記憶していることへ依存するのではなく、リクエスト内で提供されなければならない。 基盤となる接続に基づく、または接続へ束縛された認証はこの仕様の範囲外であり、 認証されたユーザー以外のいかなる当事者も接続を使用できないよう保証する措置を 講じない限り、本質的に欠陥がある (3.3節を参照)。

  • 認証パラメーター "realm" は、11.5節 で説明される保護 空間の定義のために予約されている。新しいスキームは、その定義と互換性のない 方法で使用してはならない。

  • "token68" 表記は既存の 認証スキームとの互換性のために導入され、チャレンジまたは 資格情報ごとに一度しか使用できない。したがって、新しいスキームは、 そうしなければ将来の拡張が不可能になるため、代わりに auth-param 構文を使用するべきである。

  • チャレンジおよび資格情報の解析はこの 仕様によって定義され、新しい認証スキームによって変更できない。 auth-param 構文を使用する場合、すべてのパラメーターは token と quoted-string の両方の構文をサポートするべきであり、構文上の制約は 解析後のフィールド値 (すなわち quoted-string 処理後) に対して定義するべきである。これは、受信者がすべての 認証スキームに適用可能な汎用パーサーを使用できるようにするため必要である。

    注: "realm" パラメーターの値構文を quoted-string に制限したことは悪い設計上の選択であり、新しい パラメーターで繰り返すべきではない。

  • 新しいスキームの定義は、未知の 拡張パラメーターの扱いを定義するべきである。一般に、"must-understand" 規則より "must-ignore" 規則が望ましい。そうでなければ、古い受信者が存在する状況で 新しいパラメーターを導入することが困難になるためである。さらに、新しいパラメーターを 定義する方針 ("仕様を更新する" や "このレジストリを使用する" など) を記述するとよい。

  • 認証スキームは、 オリジンサーバー認証 (すなわち WWW-Authenticate を使用)、 および/またはプロキシ認証 (すなわち Proxy-Authenticate を使用) で使用可能かどうかを文書化する必要がある。

  • Authorization ヘッダーフィールドで運ばれる資格情報はユーザー エージェントに固有であり、そのため、それらが現れるリクエストの範囲内で、 "private" キャッシュレスポンスディレクティブ ( [CACHING] の 5.2.2.7節) と同じ効果を HTTP キャッシュに対して持つ。

    したがって、資格情報を Authorization ヘッダーフィールドで運ばないことを選択する 新しい認証スキーム (例: 新しく 定義されたヘッダーフィールドを使用) は、キャッシュレスポンスディレクティブ (例: "private") の使用を義務付けることで、キャッシュを明示的に禁止する必要がある。

  • Authentication-Info、Proxy-Authentication-Info、またはその他の 認証関連レスポンスヘッダーフィールドを使用するスキームは、 関連するセキュリティ上の考慮事項を検討し、 文書化する必要がある (17.16.4節を参照)。

16.5. 範囲単位の拡張性

16.5.1. 範囲単位レジストリ

"HTTP Range Unit Registry" は範囲単位名の名前空間を定義し、 対応する仕様を参照する。これは https://www.iana.org/assignments/http-parameters で管理される。

HTTP Range Unit の登録には、次の フィールドを含めなければならない:

  • 名前
  • 説明
  • 仕様本文への参照

この名前空間に追加する値には IETF Review が必要である ([RFC8126], 4.8節を参照)。

16.5.2. 新しい範囲単位に関する考慮事項

ページ、節、レコード、行、時間などの形式固有境界のような他の範囲単位も、 アプリケーション固有の目的で HTTP で使用できる可能性があるが、 実際には一般的に使用されていない。代替範囲単位の実装者は、 content coding や汎用 仲介者とどのように動作するかを検討するべきである。

16.6. コンテンツコーディングの拡張性

16.6.1. コンテンツコーディングレジストリ

IANA が https://www.iana.org/assignments/http-parameters/ で管理する "HTTP Content Coding Registry" は、 content-coding 名を登録する。

コンテンツコーディングの登録には次の フィールドを含めなければならない:

  • 名前
  • 説明
  • 仕様本文への参照

コンテンツコーディング名は、エンコーディング変換が同一の場合 (8.4.1節 で定義される圧縮 コーディングの場合のように) を除き、転送コーディング名 ("HTTP Transfer Coding Registry"、https://www.iana.org/assignments/http-parameters/ に所在) と重複してはならない。

この名前空間に追加する値には IETF Review が必要であり ( [RFC8126] の 4.8節)、 8.4.1節 で定義される content coding の目的に適合しなければならない。

16.6.2. 新しいコンテンツ コーディングに関する考慮事項

新しい content coding は、可能な限り自己記述的であるべきであり、 任意パラメーターは、転送中に失われる可能性のある 外部メタデータに依存するのではなく、コーディング形式自体の中で発見できるようにするべきである。

16.7. アップグレードトークンレジストリ

"Hypertext Transfer Protocol (HTTP) Upgrade Token Registry" は、 Upgrade ヘッダーフィールドでプロトコルを識別するために使用される protocol-name トークンの名前空間を定義する。このレジストリは https://www.iana.org/assignments/http-upgrade-tokens で管理される。

登録された各プロトコル名には、連絡先情報と、 接続がアップグレードされた後にどのように処理されるかを詳述する任意の仕様集合が関連付けられる。

登録は "First Come First Served" に基づいて行われ ( [RFC8126] の 4.4節を参照)、 次の規則に従う:

  1. protocol-name トークンは、一度登録されると永久に登録されたままとなる。
  2. protocol-name トークンは大文字小文字を区別せず、送信者が 生成する推奨の大文字小文字形式で登録される。
  3. 登録は、その登録の責任当事者を指定しなければならない。
  4. 登録は連絡先を指定しなければならない。
  5. 登録は、そのトークンに関連付けられる仕様の集合を指定してもよい。 そのような仕様は公開されている必要はない。
  6. 登録は、登録時点でそのトークンに関連付けられると予想される "protocol-version" トークンの集合を指定することが望ましい。
  7. 責任当事者は登録をいつでも 変更してもよい。IANA はそのようなすべての変更の記録を保持し、要求に応じて 利用可能にする。
  8. IESG はプロトコルトークンの責任を再割り当てしてもよい。 通常、これは責任当事者へ 連絡できない場合にのみ使用される。

17. セキュリティに関する考慮事項

この節は、HTTP セマンティクスおよびインターネット上で 情報を転送するためのその使用に関連する既知の セキュリティ上の懸念を、開発者、情報提供者、およびユーザーへ知らせることを目的としている。 キャッシュに関連する考慮事項は [CACHING] の 7節 で、HTTP/1.1 メッセージ構文および解析に関連する考慮事項は [HTTP/1.1] の 11節 で論じられる。

以下の考慮事項の一覧は網羅的ではない。HTTP セマンティクスに関連するセキュリティ上の懸念の大部分は、プロトコル自体のセキュリティではなく、 サーバー側アプリケーション (HTTP インターフェイスの背後にあるコード) の保護、 HTTP 経由で受信したコンテンツに対するユーザーエージェント処理の保護、または一般的なインターネットの 安全な使用に関するものである。HTTP の動作に不可欠な URI のセキュリティ上の考慮事項は、 [URI] の 7節 で論じられる。さまざまな 組織が、Web アプリケーション セキュリティに関する最新研究へのリンクとトピック別情報を維持している (例: [OWASP])。

17.1. 権威の確立

HTTP は権威あるレスポンスという概念に依存する。これは、 レスポンスメッセージ生成時点のターゲットリソースの状態を考慮したとき、 そのリクエストに最も適切なレスポンスであると、 ターゲット URI 内で識別されるオリジンサーバーによって (またはその指示の下で) 判断されたレスポンスである。

authority コンポーネントで登録名が使用される場合、"http" URI スキーム (4.2.1節) は、 権威あるレスポンスをどこで見つけられるか判断するため、ユーザーの ローカル名前解決サービスに依存する。これは、ユーザーのネットワークホストテーブル、キャッシュ済み名前、または名前 解決ライブラリへの任意の攻撃が、"http" URI に対する権威確立への攻撃経路になることを意味する。同様に、Domain Name Service (DNS) 用にユーザーが選択したサーバー、および 解決結果を取得するサーバー階層は、 アドレス対応付けの真正性に影響する可能性がある。DNS Security Extensions (DNSSEC、[RFC4033]) は 真正性を改善する一つの方法であり、より安全な転送プロトコル上で DNS リクエストを行う さまざまな機構も同様である。

さらに、IP アドレスを取得した後でも、"http" URI に対する権威確立は インターネットプロトコルルーティングへの攻撃に対して脆弱である。

"https" スキーム (4.2.2節) は、 ネゴシエートされた接続が安全化され、クライアントが 通信先サーバーのアイデンティティがターゲット URI の authority コンポーネントと一致することを適切に検証する場合 (4.3.4節 )、権威確立へのこれらの潜在的な攻撃の多くを 防止 (または少なくとも明らかに) することを意図している。そのような検証を正しく実装することは困難な場合がある ([Georgiev] を参照)。

特定のオリジンサーバーに対する権威は、プロトコル拡張を通じて委任できる。たとえば [ALTSVC] がある。同様に、 接続が権威を持つとみなされるサーバー集合は、[RFC8336] のようなプロトコル拡張によって変更できる。

共有プロキシキャッシュなど、権威のないソースからレスポンスを提供することは、 性能と可用性の改善に役立つことが多いが、 そのソースを信頼できる、または信頼されないレスポンスを安全に使用できる範囲に限られる。

残念ながら、権威をユーザーへ伝えることは難しい場合がある。たとえば、 フィッシングは、ユーザーの権威認識への攻撃であり、 ハイパーテキストで類似のブランド表示を提示することでその認識を誤らせる場合があり、 authority コンポーネントを曖昧化する userinfo がそれを助ける可能性がある (4.2.1節を参照)。ユーザーエージェントは、 アクションを行う前にターゲット URI を容易に確認できるようにし、 userinfo が存在するときに目立つよう区別 (または拒否) し、 参照元文書が未知または 信頼されていないソース由来の場合に保存済み資格情報や Cookie を送信しないことで、 フィッシング攻撃の影響を軽減できる。

17.2. 仲介者のリスク

HTTP 仲介者は本質的に on-path 攻撃に適した位置にある。仲介者が実行される システムが侵害されると、深刻なセキュリティおよびプライバシー 問題につながる可能性がある。仲介者は、セキュリティ関連情報、個々のユーザーや組織に関する 個人情報、およびユーザーやコンテンツ提供者に属する独自情報へ アクセスできる場合がある。侵害された仲介者、またはセキュリティやプライバシー上の考慮事項を無視して 実装または設定された仲介者は、幅広い潜在的攻撃の実行に使用される可能性がある。

共有キャッシュを含む仲介者は、[CACHING] の 7節 で説明されるように、 キャッシュポイズニング攻撃に特に脆弱である。

実装者は、自身の設計および コーディング上の判断、ならびに運用者へ提供する設定オプション (特にデフォルト設定) のプライバシーおよびセキュリティ上の影響を考慮する必要がある。

仲介者の信頼性は、それを運用する人々および方針以上のものではなく、 HTTP はこの問題を解決できない。

17.3. ファイル名およびパス名に基づく攻撃

オリジンサーバーは、ターゲット URI からリソース表現への対応付けを管理するため、 ローカルファイルシステムを頻繁に使用する。ほとんどのファイルシステムは、悪意のある ファイル名やパス名から保護するよう設計されていない。したがって、オリジンサーバーは、 ターゲット リソースをファイル、フォルダー、またはディレクトリへ対応付ける際、 システムにとって特別な意味を持つ名前へのアクセスを避ける必要がある。

たとえば、UNIX、Microsoft Windows、およびその他のオペレーティングシステムは ".." を 現在のディレクトリより一つ上の階層を示すパス コンポーネントとして使用し、特別な名前のパスやファイル名を使用してシステムデバイスへデータを送信する。 類似の命名規則は他の種類の記憶システム内にも存在する場合がある。同様に、ローカル記憶システムには、 無効または予期しない文字、分解された文字の再合成、 大文字小文字を区別しない名前の正規化を扱うときに、セキュリティより ユーザー利便性を優先する厄介な傾向がある。

そのような特殊名に基づく攻撃は、サービス拒否 (例: サーバーに COM ポートから読み取るよう指示する) または、 提供されることを意図していない設定ファイルやソース ファイルの開示のいずれかに焦点を当てる傾向がある。

17.4. コマンド、コード、またはクエリインジェクションに基づく攻撃

オリジンサーバーは、システム サービスの識別、データベースエントリーの選択、またはデータソースの選択手段として URI 内のパラメーターを使用することが多い。ただし、 リクエストで受信したデータは信頼できない。攻撃者は、リクエストデータ 要素 (メソッド、ターゲット URI、ヘッダーフィールド、またはコンテンツ) のいずれかを、 コマンド呼び出し、 言語インタープリター、またはデータベースインターフェイスへ渡された際に コマンド、コード、またはクエリとして誤解され得るデータを含むよう構築できる。

たとえば、SQL インジェクションは、ターゲット URI またはヘッダーフィールド (例: Host、Referer など) の一部に追加のクエリ言語を 挿入する一般的な攻撃である。受信したデータが SELECT 文内で直接使用される場合、 クエリ言語は単純な文字列値ではなくデータベースコマンドとして解釈される可能性がある。 この種の実装上の脆弱性は、防ぐのが容易であるにもかかわらず非常に一般的である。

一般に、リソース実装は、命令として 処理または解釈されるコンテキストでリクエストデータを使用することを避けるべきである。パラメーターは固定 文字列と比較し、その比較結果に基づいて処理するべきであり、 信頼できないデータを想定していないインターフェイスへ渡すべきではない。固定パラメーターに基づかない 受信データは、誤解されることを避けるため慎重にフィルターまたはエンコードするべきである。

同様の考慮事項は、リクエストデータが保存され後で処理される場合にも適用される。 たとえばログファイル、監視ツール内、または埋め込み スクリプトを許可するデータ形式内に含まれる場合である。

17.5. プロトコル要素の長さを介した攻撃

HTTP は主にテキスト形式の文字区切りフィールドを使用するため、パーサーは、 非常に長い (または非常に遅い) データストリームを送信する攻撃に対して 脆弱であることが多い。特に、実装が事前定義された 長さを持たないプロトコル要素を想定している場合である (2.3節)。

相互運用性を促進するため、フィールドの最小サイズ制限について具体的な推奨事項が示される (5.4節)。これらは、 リソースが限られた実装でもサポートできるよう選択された最小推奨値であり、 ほとんどの実装はかなり高い 制限を選択すると予想される。

サーバーは、長すぎるターゲット URI を持つメッセージ (15.5.15節 ) や、大きすぎるリクエストコンテンツ (15.5.14節) を拒否できる。 容量制限に関連する追加のステータスコードは HTTP の拡張によって定義されている [RFC6585]。

受信者は、リクエストメソッド、レスポンスステータス句、フィールド 名、数値、およびチャンク長を含む (ただしこれらに限定されない) その他のプロトコル 要素を処理する範囲を慎重に制限するべきである。そのような処理を制限しないと、 バッファーまたは算術オーバーフローによる任意コード実行や、 サービス拒否攻撃への脆弱性増大につながる可能性がある。

17.6. 共有辞書圧縮を使用する攻撃

暗号化プロトコルへの一部の攻撃は、動的 圧縮によって生じるサイズ差を使用して機密情報を明らかにする。たとえば [BREACH] がある。これらの攻撃は、 攻撃者が制御するコンテンツと機密 情報との間に冗長性を作り出し、両方のコンテンツで同じ辞書を使用する 動的圧縮アルゴリズムが、攻撃者制御のコンテンツが機密コンテンツの 一部と一致するときに、より効率的に圧縮することへ依存する。

HTTP メッセージは、TLS 圧縮、 content coding、transfer coding、およびその他の拡張またはバージョン固有の機構を含む、さまざまな方法で圧縮できる。

このリスクに対する最も効果的な緩和策は、機密データの圧縮を無効にすること、 または機密データと攻撃者制御データを厳密に分離して、 同じ圧縮辞書を共有できないようにすることである。慎重に設計すれば、圧縮スキームは、 HPACK ([HPACK]) のように、 限定されたユースケースで悪用可能とはみなされない方法で設計できる。

17.7. 個人情報の開示

クライアントは、リソースと対話するためユーザーが提供した情報 (例: ユーザーの名前、 所在地、メールアドレス、パスワード、暗号化キーなど) と、 長期間にわたるユーザーの閲覧活動に関する情報 (例: 履歴、ブックマークなど) の両方を含む、 大量の個人情報を知る立場にあることが多い。実装は、 個人情報の意図しない開示を防ぐ必要がある。

17.8. サーバーログ情報のプライバシー

サーバーは、時間の経過に伴うユーザーのリクエストに関する個人データを保存できる立場にあり、 それによって閲覧パターンや関心分野が識別される可能性がある。特に、仲介者で収集されたログ 情報には、複数のサイトにまたがるユーザーエージェントの 対話履歴が含まれることが多く、個々のユーザーまで追跡できる。

HTTP ログ情報は本質的に機密であり、その取扱いは法律や 規制によって制約されることが多い。ログ情報は安全に保存し、その分析には適切なガイドラインに 従う必要がある。個々の エントリー内の個人情報の匿名化は有用だが、一般に、他のアクセス特性との相関に基づいて 実際のログトレースが再識別されることを防ぐには十分ではない。そのため、特定のクライアントに 紐付けられたアクセス トレースは、キーが仮名であっても公開するのは安全ではない。

盗難または誤公開のリスクを最小化するため、ログ情報から、 ユーザー識別子、IP アドレス、 ユーザー提供の query パラメーターを含む個人識別可能情報を、 セキュリティ、監査、または不正対策の運用上の必要性を 支援するために不要になった時点で速やかに削除するべきである。

17.9. URI 内の機密情報の開示

URI は、安全なリソースを識別する場合でも、保護するのではなく共有することを意図している。 URI は画面に表示されることが多く、ページが印刷されるときテンプレートへ追加され、 さまざまな保護されていないブックマークリストに保存される。多くのサーバー、プロキシ、およびユーザーエージェントは ターゲット URI を第三者から見える可能性がある場所へ ログ記録または表示する。したがって、機密性が高い、個人を 識別可能、または開示にリスクがある情報を URI 内に含めるのは賢明ではない。

アプリケーションが、GET を使用するフォームの query フィールドなど、 ユーザー提供情報からターゲット URI を構築するクライアント側機構を使用する場合、 URI 内で開示するには不適切な、潜在的に 機密性の高いデータが提供される場合がある。そのような場合、POST は通常 URI を構築しないため 好まれることが多い。代わりに、フォームの POST は潜在的に機密性の高いデータをリクエストコンテンツで送信する。 ただし、これはキャッシュを妨げ、そうでなければ 安全なリクエストとなるものに安全でないメソッドを使用する。別の回避策には、URI を構築する前に ユーザー提供データを変換すること、または機密性のない 一般的な値だけを含めるようデータをフィルタリングすることが含まれる。同様に、クエリ結果を別の (サーバー生成) URI へリダイレクトすることで、後のリンクから潜在的に機密性の高いデータを削除し、 後で再利用できるキャッシュ可能な レスポンスを提供できる。

Referer ヘッダーフィールドは、リクエストを 生じさせたコンテキストをターゲット サイトへ伝えるため、ユーザーの直前の閲覧履歴および 参照元リソースの URI に含まれ得る個人情報を明らかにする可能性がある。Referer ヘッダー フィールドの制限は、そのセキュリティ上の考慮事項の一部へ対処するため、10.1.3節 で説明される。

17.10. フィールド名のアプリケーション処理

サーバーは、受信した リクエストを処理しレスポンス用コンテンツを生成するため、HTTP 以外のゲートウェイインターフェイスやフレームワークを使用することが多い。 歴史的な理由により、そのようなインターフェイスは、 環境変数に適した名前対応付けを使用して、受信したフィールド名を外部変数名として渡すことが多い。

たとえば、[RFC3875] の 4.1.18節 で定義される Common Gateway Interface (CGI) のプロトコル固有 メタ変数への対応付けは、CGI の標準 変数の一つに対応しない受信ヘッダーフィールドへ適用される。この対応付けは各名前の前に "HTTP_" を付け、 ハイフン ("-") のすべてのインスタンスをアンダースコア ("_") へ変更する。同じ対応付けは、 アプリケーションをある プラットフォームから次へ移動することを容易にするため、多くの他のアプリケーションフレームワークにも継承されている。

CGI では、受信した Content-Length フィールドは、 受信したフィールド値と一致する文字列値を持つメタ変数 "CONTENT_LENGTH" として渡される。 対照的に、受信した "Content_Length" ヘッダーフィールドは プロトコル固有メタ変数 "HTTP_CONTENT_LENGTH" として渡され、 アプリケーションがデフォルトのものではなくプロトコル固有メタ変数を 誤って読み取ると混乱につながる可能性がある。(この歴史的慣行が、16.3.2.1節 で アンダースコアを含む新しいフィールド名の作成が推奨されない理由である。)

残念ながら、対応付けが不完全または曖昧な場合、フィールド名を異なるインターフェイス名へ 対応付けることでセキュリティ上の 脆弱性につながる場合がある。たとえば、攻撃者が "Transfer_Encoding" という名前のフィールドを送信した場合、 単純なインターフェイスはそれを "Transfer-Encoding" フィールドと同じ変数名へ対応付け、潜在的なリクエスト スマグリング脆弱性につながる可能性がある ([HTTP/1.1] の 11.2節)。

関連するリスクを軽減するため、そのような対応付けを実行する実装には、 名前として受信し得るオクテットの全範囲 (HTTP 文法で推奨されない、または禁止されるものを含む) に対して、 対応付けを曖昧さなく完全にすることが推奨される。たとえば、異常な名前文字を持つフィールドでは、 リクエストをブロックする、特定のフィールドを削除する、または他のフィールドと区別するため 異なる接頭辞を付けて名前を渡す場合がある。

17.11. リダイレクト後のフラグメントの開示

URI 参照内で使用されるフラグメント識別子はリクエストで送信されないが、 実装者は、それらがユーザーエージェントおよびレスポンスの結果として実行される 任意の拡張機能またはスクリプトから見えることを認識するべきである。特に、 リダイレクトが発生し、元のリクエストのフラグメント識別子が Location (10.2.2節 ) の新しい参照へ継承される場合、あるサイトのフラグメントが別の サイトへ開示される効果を持つ可能性がある。最初のサイトがフラグメント内で個人情報を使用する場合、 他サイトへのリダイレクトに (空でもよい) フラグメントコンポーネントを含め、 その継承を阻止することが望ましい。

17.12. 製品情報の開示

User-Agent (10.1.5節)、Via (7.6.3節)、および Server (10.2.4節) ヘッダーフィールドは、 それぞれの送信者のソフトウェアシステムに関する情報を明らかにすることが多い。理論上、これは 攻撃者が既知のセキュリティホールを悪用しやすくする可能性がある。実際には、攻撃者は 使用中と見えるソフトウェアバージョンにかかわらず、すべての潜在的な穴を試す傾向がある。

ネットワークファイアウォールを通過するポータルとして機能するプロキシは、 ファイアウォール背後のホストを識別する可能性があるヘッダー情報の転送について 特別な注意を払うべきである。Via ヘッダーフィールドにより、 仲介者は機密性の高いマシン名を仮名へ置き換えられる。

17.13. ブラウザーフィンガープリンティング

ブラウザーフィンガープリンティングは、一意の特性集合によって 長期間にわたり特定のユーザーエージェントを識別する技法の集合である。これらの特性には、 基盤となるトランスポートプロトコルの使用方法、機能 能力、およびスクリプト環境に関する情報が含まれる可能性があるが、ここで特に関心があるのは HTTP を介して伝達され得る一意の特性集合である。フィンガープリンティングは、 他の形式のデータ 収集 (例: Cookie) に対してユーザーが持ち得る対応する制御なしに、 長期間にわたりユーザーエージェントの振る舞いを追跡できるため、プライバシー上の懸念とみなされる ([Bujlow])。 多くの汎用ユーザーエージェント (すなわち Web ブラウザー) は フィンガープリントを減らす措置を講じている。

サーバーへ、フィンガープリンティングを可能にするほど 一意な情報を明らかにする可能性のあるリクエストヘッダーフィールドはいくつかある。From ヘッダーフィールドが最も明白だが、 From はユーザーが自己識別を望む場合にのみ送信されると想定される。同様に、Cookie ヘッダーフィールドは再識別を可能にするよう意図的に設計されているため、フィンガープリンティングの 懸念は Cookie がユーザー エージェントの設定によって無効化または制限されている状況にのみ適用される。

User-Agent ヘッダーフィールドは、 通常は他の特性と組み合わせたとき、特定のデバイスを一意に識別するのに 十分な情報を含む場合がある。特に、ユーザーエージェントがユーザーの システムまたは拡張機能について過剰な詳細を送信する場合である。ただし、 ユーザーが最も予期しない一意情報のソースは プロアクティブ ネゴシエーション (12.1節) であり、これには Accept、Accept-Charset、Accept-Encoding、および Accept-Language ヘッダーフィールドが含まれる。

フィンガープリンティングの懸念に加え、Accept-Language ヘッダーフィールドを詳細に使用すると、 ユーザーが私的とみなす可能性のある情報を明らかにする場合がある。たとえば、 ある言語集合を理解できることは、特定の民族集団への 所属と強く相関する可能性がある。そのようなプライバシー損失を制限する方法として、 言語ネゴシエーションが有用である可能性を示す Vary ヘッダーフィールドを検出した後の対話などによって明示的に 許可されたサイトを除き、ユーザーエージェントが Accept-Language の送信を省略する方法が考えられる。

プライバシー強化のためにプロキシを使用する環境では、ユーザーエージェントは プロアクティブネゴシエーションヘッダーフィールドの送信を控えめにするべきである。高度な ヘッダーフィールド設定機能を提供する汎用ユーザーエージェントは、 詳細を過剰に提供した場合に生じ得るプライバシー損失についてユーザーへ知らせるべきである。極端な プライバシー対策として、プロキシは中継する リクエスト内のプロアクティブネゴシエーションヘッダーフィールドをフィルターできる。

17.14. バリデーターの保持

この仕様で定義されるバリデーターは、表現の妥当性を保証したり、 悪意のある変更から保護したり、on-path 攻撃を検出したりすることを意図していない。最良の場合、 すべての 参加者が適切に振る舞っているとき、より効率的なキャッシュ更新と楽観的並行書き込みを可能にする。最悪の場合でも、 条件が失敗し、クライアントは条件付き リクエストなしの HTTP 交換より害の大きくないレスポンスを受信する。

entity tag は、プライバシーリスクを生じさせる方法で悪用される可能性がある。たとえば、サイトが ユーザーまたは ユーザーエージェントに固有の、セマンティクス上無効な entity tag を意図的に作成し、 長い鮮度期間を持つキャッシュ可能なレスポンスで送信し、その後、 そのユーザーまたはユーザーエージェントを再識別する手段として、後の条件付きリクエストで その entity tag を読み取る場合がある。そのような識別タグは、 ユーザーエージェントが元のキャッシュエントリーを保持する限り永続的な識別子となる。 表現をキャッシュするユーザーエージェントは、ユーザーが保存済み Cookie を消去したり プライベート閲覧モードへ切り替えたりするなど、プライバシー維持の操作を行うたびに、 キャッシュが消去または置換されることを保証するべきである。

17.15. Range を使用するサービス拒否攻撃

制約のない複数範囲リクエストはサービス拒否攻撃の影響を受けやすい。 同じデータの多数の重複範囲を要求するために必要な労力は、 要求されたデータを多数の部分として提供しようとする際に消費される時間、メモリ、および帯域幅と比較して ごく小さいためである。サーバーは、二つを超える重複範囲や、 単一集合内の多数の小さな 範囲を要求する場合など、悪質な範囲リクエストを無視、結合、または拒否するべきである。 特に、明らかな理由なく範囲が順不同で要求される場合である。マルチパート範囲リクエストはランダムアクセスを支援するよう設計されていない。

17.16. 認証に関する考慮事項

HTTP 認証という主題のすべてがセキュリティ上の考慮事項であるため、 以下の考慮事項一覧は網羅的ではない。さらに、特定の認証スキームについて あり得るすべての考慮事項を論じるのではなく、一般的な認証フレームワークに関する セキュリティ上の考慮事項に限定される (それらはスキームを定義する仕様で文書化するべきである)。さまざまな 組織が、Web アプリケーションセキュリティに関する最新研究へのリンクとトピック別情報 (例: [OWASP]) を維持しており、 実際に見られる認証スキームの実装および使用における一般的な落とし穴も含まれる。

17.16.1. 資格情報の機密性

HTTP 認証フレームワークは、資格情報の 機密性を維持する単一の機構を定義しない。代わりに、各認証スキームが 送信前に資格情報をどのようにエンコードするかを定義する。これは将来の 認証スキーム開発に柔軟性を提供する一方、自身では機密性を提供しない、 またはリプレイ攻撃に対して十分に保護しない既存スキームの 保護には不十分である。さらに、サーバーが 個々のユーザーそれぞれに固有の資格情報を期待する場合、その資格情報の交換は、 資格情報内のコンテンツが機密のままであっても、そのユーザーを識別する効果を持つ。

HTTP は、フィールドの機密送信を提供するため、 基盤となるトランスポートレベルまたはセッションレベル 接続のセキュリティ特性に依存する。個々のユーザー認証に依存するサービスは、 資格情報を交換する前に 安全化された接続を必要とする (4.2.2節)。

17.16.2. 資格情報とアイドル状態のクライアント

既存の HTTP クライアントおよびユーザーエージェントは通常、認証情報を 無期限に保持する。HTTP は、オリジンサーバーが クライアントにこれらのキャッシュ済み資格情報を破棄するよう指示する機構を提供しない。 プロトコルは、ユーザーエージェントが資格情報をどのように取得または管理するかを認識しないためである。 資格情報を期限切れまたは失効させる機構は、認証 スキーム定義の一部として規定できる。

資格情報のキャッシュがアプリケーションの セキュリティモデルを妨げる可能性がある状況には、次が含まれるがこれらに限定されない:

  • 長期間アイドル状態であったクライアント。その後サーバーは、 クライアントに資格情報をユーザーへ再度求めさせたい場合がある。
  • セッション終了の表示 (ページ上の "logout" または "commit" ボタンなど) を含むアプリケーション。その後、アプリケーションのサーバー側は、 クライアントが資格情報を保持するさらなる理由がないことを 「知っている」。

資格情報をキャッシュするユーザーエージェントには、ユーザーの制御下で キャッシュ済み資格情報を破棄するための容易にアクセス可能な機構を提供することが推奨される。

17.16.3. 保護空間

保護空間の確立に "realm" 機構だけへ依存する 認証スキームは、オリジンサーバー上のすべてのリソースへ資格情報を公開する。 あるリソースに対して認証済みリクエストを正常に行ったクライアントは、 同じオリジンサーバー上の他のリソースにも同じ認証資格情報を使用できる。 これにより、別のリソースが他のリソース用の認証 資格情報を収集することが可能になる。

これは、オリジンサーバーが同じオリジンの下で複数の 当事者向けリソースをホストする場合に特に懸念される (11.5節)。考えられる 緩和策には、認証 資格情報への直接アクセスを制限すること (すなわち、Authorization リクエストヘッダーフィールドの内容を利用可能にしないこと)、 および各当事者に異なるホスト名 (またはポート番号) を使用して 保護空間を分離することが含まれる。

17.16.4. 追加レスポンスフィールド

暗号化されていない通信路で送信されるレスポンスへ情報を追加すると、 セキュリティおよびプライバシーに影響する可能性がある。Authentication-Info および Proxy-Authentication-Info ヘッダーフィールドが存在するだけで、 HTTP 認証が使用中であることを示す。認証スキーム固有パラメーターの内容によって 追加情報が公開される可能性があるため、これは それらのスキーム定義で検討する必要がある。

18. IANA に関する考慮事項

次の登録の変更管理者は "IETF (iesg@ietf.org) - Internet Engineering Task Force" である。

18.1. URI スキームの登録

IANA は、4.2節 の 表 2 に列挙された恒久スキームを用いて、 [BCP35] の "Uniform Resource Identifier (URI) Schemes" レジストリ https://www.iana.org/assignments/uri-schemes/ を更新した。

18.2. メソッドの登録

IANA は、16.1.1節 の登録手順および 次の表に要約されたメソッド名を用いて、https://www.iana.org/assignments/http-methods の "Hypertext Transfer Protocol (HTTP) Method Registry" を更新した。

表 7
メソッド 安全 べき等 節
CONNECT いいえ いいえ 9.3.6
DELETE いいえ はい 9.3.5
GET はい はい 9.3.1
HEAD はい はい 9.3.2
OPTIONS はい はい 9.3.7
POST いいえ いいえ 9.3.3
PUT いいえ はい 9.3.4
TRACE はい はい 9.3.8
* いいえ いいえ 18.2

メソッド名 "*" は、メソッド名として "*" を使用すると、 一部のフィールド (例: "Access-Control-Request-Method") におけるワイルドカードとしての使用と競合するため予約されている。

18.3. ステータスコードの登録

IANA は、16.2.1節 の登録手順および 次の表に要約されたステータスコード値を用いて、https://www.iana.org/assignments/http-status-codes の "Hypertext Transfer Protocol (HTTP) Status Code Registry" を更新した。

表 8
値 説明 節
100 Continue 15.2.1
101 Switching Protocols 15.2.2
200 OK 15.3.1
201 Created 15.3.2
202 Accepted 15.3.3
203 Non-Authoritative Information 15.3.4
204 No Content 15.3.5
205 Reset Content 15.3.6
206 Partial Content 15.3.7
300 Multiple Choices 15.4.1
301 Moved Permanently 15.4.2
302 Found 15.4.3
303 See Other 15.4.4
304 Not Modified 15.4.5
305 Use Proxy 15.4.6
306 (未使用) 15.4.7
307 Temporary Redirect 15.4.8
308 Permanent Redirect 15.4.9
400 Bad Request 15.5.1
401 Unauthorized 15.5.2
402 Payment Required 15.5.3
403 Forbidden 15.5.4
404 Not Found 15.5.5
405 Method Not Allowed 15.5.6
406 Not Acceptable 15.5.7
407 Proxy Authentication Required 15.5.8
408 Request Timeout 15.5.9
409 Conflict 15.5.10
410 Gone 15.5.11
411 Length Required 15.5.12
412 Precondition Failed 15.5.13
413 Content Too Large 15.5.14
414 URI Too Long 15.5.15
415 Unsupported Media Type 15.5.16
416 Range Not Satisfiable 15.5.17
417 Expectation Failed 15.5.18
418 (未使用) 15.5.19
421 Misdirected Request 15.5.20
422 Unprocessable Content 15.5.21
426 Upgrade Required 15.5.22
500 Internal Server Error 15.6.1
501 Not Implemented 15.6.2
502 Bad Gateway 15.6.3
503 Service Unavailable 15.6.4
504 Gateway Timeout 15.6.5
505 HTTP Version Not Supported 15.6.6

18.4. フィールド名の登録

この仕様は、[RFC3864] で定義される既存のメッセージヘッダー フィールド登録手順のうち HTTP 関連の側面を更新する。 新しい登録手順を定義し、HTTP フィールド定義を別個のレジストリへ移動することにより、 HTTP に関係する古い手順を置き換える。

IANA は、16.3.1節 で示される "Hypertext Transfer Protocol (HTTP) Field Name Registry" という新しいレジストリを作成した。

IANA は、"Permanent Message Header Field Names" および "Provisional Message Header Field Names" レジストリ (https://www.iana.org/assignments/message-headers/ を参照) のうちプロトコルが 'http' のすべてのエントリーをこのレジストリへ移動し、次の変更を適用した:

  1. 'Applicable Protocol' フィールドは省略された。
  2. ステータスが 'standard'、'experimental'、'reserved'、または 'informational' であったエントリーは、ステータス 'permanent' とされた。
  3. ステータスのない暫定エントリーは、 ステータス 'provisional' とされた。
  4. ステータスのない恒久エントリーは (登録 文書がステータスを定義していないことを確認した後)、ステータス 'provisional' とされた。 専門家は、別のステータスの方が適切である証拠がある場合、 エントリーのステータスを更新することを選択できる。

IANA は、HTTP フィールド名 登録が移動したことを示すため、"Permanent Message Header Field Names" および "Provisional Message Header Field Names" レジストリへ次の注記を追加した:

IANA は、次の表に列挙されたフィールド名を用いて、 "Hypertext Transfer Protocol (HTTP) Field Name Registry" を更新した。

表 9
フィールド名 ステータス 節 コメント
Accept 恒久 12.5.1
Accept-Charset 非推奨 12.5.2
Accept-Encoding 恒久 12.5.3
Accept-Language 恒久 12.5.4
Accept-Ranges 恒久 14.3
Allow 恒久 10.2.1
Authentication-Info 恒久 11.6.3
Authorization 恒久 11.6.2
Connection 恒久 7.6.1
Content-Encoding 恒久 8.4
Content-Language 恒久 8.5
Content-Length 恒久 8.6
Content-Location 恒久 8.7
Content-Range 恒久 14.4
Content-Type 恒久 8.3
Date 恒久 6.6.1
ETag 恒久 8.8.3
Expect 恒久 10.1.1
From 恒久 10.1.2
Host 恒久 7.2
If-Match 恒久 13.1.1
If-Modified-Since 恒久 13.1.3
If-None-Match 恒久 13.1.2
If-Range 恒久 13.1.5
If-Unmodified-Since 恒久 13.1.4
Last-Modified 恒久 8.8.2
Location 恒久 10.2.2
Max-Forwards 恒久 7.6.2
Proxy-Authenticate 恒久 11.7.1
Proxy-Authentication-Info 恒久 11.7.3
Proxy-Authorization 恒久 11.7.2
Range 恒久 14.2
Referer 恒久 10.1.3
Retry-After 恒久 10.2.3
Server 恒久 10.2.4
TE 恒久 10.1.4
Trailer 恒久 6.6.2
Upgrade 恒久 7.8
User-Agent 恒久 10.1.5
Vary 恒久 12.5.5
Via 恒久 7.6.3
WWW-Authenticate 恒久 11.6.1
* 恒久 12.5.5 (予約済み)

フィールド名 "*" は、 その名前を HTTP ヘッダーフィールドとして使用すると、Vary ヘッダーフィールド (12.5.5節) における特殊なセマンティクスと競合する可能性があるため予約されている。

IANA は、新しいレジストリの "Content-MD5" エントリーの ステータスを 'obsoleted' とし、 [RFC2616] の 14.15節 (ヘッダーフィールドの定義) および [RFC7231] の付録 B (更新された仕様からフィールド定義を削除したもの) への参照を追加した。

18.5. 認証スキームの登録

IANA は、16.4.1節 の登録手順を用いて、 https://www.iana.org/assignments/http-authschemes の "Hypertext Transfer Protocol (HTTP) Authentication Scheme Registry" を更新した。 この文書では認証スキームを定義しない。

18.6. コンテンツコーディングの登録

IANA は、16.6.1節 の登録手順および下の表に 要約された content coding 名を用いて、https://www.iana.org/assignments/http-parameters/ の "HTTP Content Coding Registry" を更新した。

表 10
名前 説明 節
compress UNIX "compress" データ形式 [Welch] 8.4.1.1
deflate "zlib" データ形式 ([RFC1950]) 内の "deflate" 圧縮データ ([RFC1951]) 8.4.1.2
gzip GZIP ファイル形式 [RFC1952] 8.4.1.3
identity 予約済み 12.5.3
x-compress 非推奨 (compress のエイリアス) 8.4.1.1
x-gzip 非推奨 (gzip のエイリアス) 8.4.1.3

18.7. 範囲単位の登録

IANA は、16.5.1節 の登録手順および下の表に要約された 範囲単位名を用いて、https://www.iana.org/assignments/http-parameters/ の "HTTP Range Unit Registry" を更新した。

表 11
範囲単位名 説明 節
bytes オクテットの範囲 14.1.2
none 範囲リクエストが サポートされないことを示すキーワードとして予約済み 14.3

18.8. メディアタイプの登録

IANA は、メディアタイプ "multipart/byteranges" について 14.6節 の登録情報を用いて、 https://www.iana.org/assignments/media-types の "Media Types" レジストリを更新した。

IANA は、"q" パラメーターに関するレジストリ注記を、 この文書の 12.5.1節 へのリンクで更新した。

18.9. ポート 登録

IANA は、UDP または TCP を使用するポート 80 および 443 のサービスについて、 https://www.iana.org/assignments/service-names-port-numbers/ の "Service Name and Transport Protocol Port Number Registry" を次のように更新した:

  1. この文書を "Reference" として使用し、
  2. 現在未指定の場合、"Assignee" を "IESG"、"Contact" を "IETF_Chair" に設定する。

18.10. アップグレードトークンの登録

IANA は、16.7節 で説明される登録手順および 次の表に要約された upgrade トークン名を用いて、https://www.iana.org/assignments/http-upgrade-tokens の "Hypertext Transfer Protocol (HTTP) Upgrade Token Registry" を更新した。

表 12
名前 説明 想定されるバージョントークン 節
HTTP ハイパーテキスト転送プロトコル 任意の DIGIT.DIGIT (例: "2.0") 2.5

19. 参考文献

19.1. 規範的参考文献

[CACHING]
Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, Ed., “HTTP キャッシュ”, STD 98, RFC 9111, DOI 10.17487/RFC9111, 2022年6月。
[RFC1950]
Deutsch, P. and J-L. Gailly, “ZLIB 圧縮データ形式 仕様 バージョン 3.3”, RFC 1950, DOI 10.17487/RFC1950, 1996年5月, <https://www.rfc-editor.org/info/rfc1950>。
[RFC1951]
Deutsch, P., “DEFLATE 圧縮データ形式仕様 バージョン 1.3”, RFC 1951, DOI 10.17487/RFC1951, 1996年5月, <https://www.rfc-editor.org/info/rfc1951>。
[RFC1952]
Deutsch, P., “GZIP ファイル形式 仕様 バージョン 4.3”, RFC 1952, DOI 10.17487/RFC1952, 1996年5月, <https://www.rfc-editor.org/info/rfc1952>。
[RFC2046]
Freed, N. and N. Borenstein, “多目的インターネットメール 拡張 (MIME) 第2部: メディアタイプ”, RFC 2046, DOI 10.17487/RFC2046, 1996年11月, <https://www.rfc-editor.org/info/rfc2046>。
[RFC2119]
Bradner, S., “RFC において 要求レベルを示すために使用するキーワード”, BCP 14, RFC 2119, DOI 10.17487/RFC2119, 1997年3月, <https://www.rfc-editor.org/info/rfc2119>。
[RFC4647]
Phillips, A., Ed. and M. Davis, Ed., “言語 タグの照合”, BCP 47, RFC 4647, DOI 10.17487/RFC4647, 2006年9月, <https://www.rfc-editor.org/info/rfc4647>。
[RFC4648]
Josefsson, S., “Base16、 Base32、および Base64 データエンコーディング”, RFC 4648, DOI 10.17487/RFC4648, 2006年10月, <https://www.rfc-editor.org/info/rfc4648>。
[RFC5234]
Crocker, D., Ed. and P. Overell, “構文 仕様のための拡張 BNF: ABNF”, STD 68, RFC 5234, DOI 10.17487/RFC5234, 2008年1月, <https://www.rfc-editor.org/info/rfc5234>。
[RFC5280]
Cooper, D., Santesson, S., Farrell, S., Boeyen, S., Housley, R., and W. Polk, “インターネット X.509 公開鍵 基盤 証明書および証明書失効リスト (CRL) プロファイル”, RFC 5280, DOI 10.17487/RFC5280, 2008年5月, <https://www.rfc-editor.org/info/rfc5280>。
[RFC5322]
Resnick, P., Ed., “インターネット メッセージ形式”, RFC 5322, DOI 10.17487/RFC5322, 2008年10月, <https://www.rfc-editor.org/info/rfc5322>。
[RFC5646]
Phillips, A., Ed. and M. Davis, Ed., “言語を識別するための タグ”, BCP 47, RFC 5646, DOI 10.17487/RFC5646, 2009年9月, <https://www.rfc-editor.org/info/rfc5646>。
[RFC6125]
Saint-Andre, P. and J. Hodges, “Transport Layer Security (TLS) の文脈における X.509 (PKIX) 証明書を使用したインターネット公開 鍵基盤内でのドメインベースアプリケーションサービス識別子の表現と 検証”, RFC 6125, DOI 10.17487/RFC6125, 2011年3月, <https://www.rfc-editor.org/info/rfc6125>。
[RFC6365]
Hoffman, P. and J. Klensin, “IETF における 国際化で使用される用語”, BCP 166, RFC 6365, DOI 10.17487/RFC6365, 2011年9月, <https://www.rfc-editor.org/info/rfc6365>。
[RFC7405]
Kyzivat, P., “ABNF における 大文字小文字を区別する文字列のサポート”, RFC 7405, DOI 10.17487/RFC7405, 2014年12月, <https://www.rfc-editor.org/info/rfc7405>。
[RFC8174]
Leiba, B., “RFC 2119 キーワードにおける 大文字と小文字の曖昧さ”, BCP 14, RFC 8174, DOI 10.17487/RFC8174, 2017年5月, <https://www.rfc-editor.org/info/rfc8174>。
[TCP]
Postel, J., “Transmission Control Protocol”, STD 7, RFC 793, DOI 10.17487/RFC0793, 1981年9月, <https://www.rfc-editor.org/info/rfc793>。
[TLS13]
Rescorla, E., “Transport Layer Security (TLS) プロトコル バージョン 1.3”, RFC 8446, DOI 10.17487/RFC8446, 2018年8月, <https://www.rfc-editor.org/info/rfc8446>。
[URI]
Berners-Lee, T., Fielding, R., and L. Masinter, “Uniform Resource Identifier (URI): 汎用構文”, STD 66, RFC 3986, DOI 10.17487/RFC3986, 2005年1月, <https://www.rfc-editor.org/info/rfc3986>。
[USASCII]
American National Standards Institute, “符号化文字集合 -- 7 ビット米国 情報交換用標準コード”, ANSI X3.4, 1986.
[Welch]
Welch, T., “高性能 データ圧縮のための技法”, IEEE Computer 17(6), DOI 10.1109/MC.1984.1659158, 1984年6月, <https://ieeexplore.ieee.org/document/1659158/>。

19.2. 参考情報

[ALTSVC]
Nottingham, M., McManus, P., and J. Reschke, “HTTP 代替 サービス”, RFC 7838, DOI 10.17487/RFC7838, 2016年4月, <https://www.rfc-editor.org/info/rfc7838>。
[BCP13]
Freed, N. and J. Klensin, “多目的インターネットメール 拡張 (MIME) 第4部: 登録手順”, BCP 13, RFC 4289, DOI 10.17487/RFC4289, 2005年12月。
Freed, N., Klensin, J., and T. Hansen, “メディアタイプの仕様と 登録手順”, BCP 13, RFC 6838, DOI 10.17487/RFC6838, 2013年1月。
<https://www.rfc-editor.org/info/bcp13>
[BCP178]
Saint-Andre, P., Crocker, D., and M. Nottingham, “アプリケーションプロトコルにおける "X-" 接頭辞 および類似構造の非推奨化”, BCP 178, RFC 6648, DOI 10.17487/RFC6648, 2012年6月。
<https://www.rfc-editor.org/info/bcp178>
[BCP35]
Thaler, D., Ed., Hansen, T., and T. Hardie, “URI スキームのガイドラインと登録 手順”, BCP 35, RFC 7595, DOI 10.17487/RFC7595, 2015年6月。
<https://www.rfc-editor.org/info/bcp35>
[BREACH]
Gluck, Y., Harris, N., and A. Prado, “BREACH: CRIME 攻撃の復活”, 2013年7月, <http://breachattack.com/resources/BREACH%20-%20SSL,%20gone%20in%2030%20seconds.pdf>。
[Bujlow]
Bujlow, T., Carela-Español, V., Solé-Pareta, J., and P. Barlet-Ros, “Web トラッキングに関する調査: 機構、影響、および防御”, DOI 10.1109/JPROC.2016.2637878, Proceedings of the IEEE 105(8), 2017年8月。
Barth, A., “HTTP 状態 管理機構”, RFC 6265, DOI 10.17487/RFC6265, 2011年4月, <https://www.rfc-editor.org/info/rfc6265>。
[Err1912]
RFC Errata, 正誤表 ID 1912, RFC 2978, <https://www.rfc-editor.org/errata/eid1912>。
[Err5433]
RFC Errata, 正誤表 ID 5433, RFC 2978, <https://www.rfc-editor.org/errata/eid5433>。
[Georgiev]
Georgiev, M., Iyengar, S., Jana, S., Anubhai, R., Boneh, D., and V. Shmatikov, “世界で 最も危険なコード: 非ブラウザー ソフトウェアにおける SSL 証明書の検証”, DOI 10.1145/2382196.2382204, 2012 ACM Conference on Computer and Communications Security (CCS '12) 論文集, pp. 38-49, 2012年10月。
[HPACK]
Peon, R. and H. Ruellan, “HPACK: HTTP/2 のヘッダー圧縮”, RFC 7541, DOI 10.17487/RFC7541, 2015年5月, <https://www.rfc-editor.org/info/rfc7541>。
[HTTP/1.0]
Berners-Lee, T., Fielding, R., and H. Frystyk, “ハイパーテキスト転送プロトコル -- HTTP/1.0”, RFC 1945, DOI 10.17487/RFC1945, 1996年5月, <https://www.rfc-editor.org/info/rfc1945>。
[HTTP/1.1]
Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, Ed., “HTTP/1.1”, STD 99, RFC 9112, DOI 10.17487/RFC9112, 2022年6月。
[HTTP/2]
Thomson, M., Ed. and C. Benfield, Ed., “HTTP/2”, RFC 9113, DOI 10.17487/RFC9113, 2022年6月, <https://www.rfc-editor.org/info/rfc9113>。
[HTTP/3]
Bishop, M., Ed., “HTTP/3”, RFC 9114, DOI 10.17487/RFC9114, 2022年6月, <https://www.rfc-editor.org/info/rfc9114>。
[ISO-8859-1]
International Organization for Standardization, “情報技術 -- 8 ビット 単一バイト符号化図形文字集合 -- 第1部: ラテンアルファベット No. 1”, ISO/IEC 8859-1:1998, 1998.
[Kri2001]
Kristol, D., “HTTP Cookie: 標準、 プライバシー、および政治”, ACM Transactions on Internet Technology 1(2), 2001年11月, <http://arxiv.org/abs/cs.SE/0105018>。
[OWASP]
Open Web Application Security Project, <https://www.owasp.org/>。
[REST]
Fielding, R., “ネットワークベースの ソフトウェアアーキテクチャのアーキテクチャスタイルと設計”, 博士論文, University of California, Irvine, 2000年9月, <https://roy.gbiv.com/pubs/dissertation/top.htm>。
[RFC1919]
Chatel, M., “古典的 IP プロキシと 透過 IP プロキシ”, RFC 1919, DOI 10.17487/RFC1919, 1996年3月, <https://www.rfc-editor.org/info/rfc1919>。
[RFC2047]
Moore, K., “MIME (多目的 インターネットメール拡張) 第3部: 非 ASCII テキスト用メッセージヘッダー拡張”, RFC 2047, DOI 10.17487/RFC2047, 1996年11月, <https://www.rfc-editor.org/info/rfc2047>。
[RFC2068]
Fielding, R., Gettys, J., Mogul, J., Frystyk, H., and T. Berners-Lee, “ハイパーテキスト転送プロトコル -- HTTP/1.1”, RFC 2068, DOI 10.17487/RFC2068, 1997年1月, <https://www.rfc-editor.org/info/rfc2068>。
[RFC2145]
Mogul, J., Fielding, R., Gettys, J., and H. Frystyk, “HTTP バージョン番号の使用と解釈”, RFC 2145, DOI 10.17487/RFC2145, 1997年5月, <https://www.rfc-editor.org/info/rfc2145>。
[RFC2295]
Holtman, K. and A. Mutz, “HTTP における透過的コンテンツ ネゴシエーション”, RFC 2295, DOI 10.17487/RFC2295, 1998年3月, <https://www.rfc-editor.org/info/rfc2295>。
[RFC2324]
Masinter, L., “ハイパーテキスト コーヒーポット制御プロトコル (HTCPCP/1.0)”, RFC 2324, DOI 10.17487/RFC2324, 1998年4月1日, <https://www.rfc-editor.org/info/rfc2324>。
[RFC2557]
Palme, J., Hopmann, A., and N. Shelness, “HTML (MHTML) などの 複合文書の MIME カプセル化”, RFC 2557, DOI 10.17487/RFC2557, 1999年3月, <https://www.rfc-editor.org/info/rfc2557>。
[RFC2616]
Fielding, R., Gettys, J., Mogul, J., Frystyk, H., Masinter, L., Leach, P., and T. Berners-Lee, “ハイパーテキスト 転送プロトコル -- HTTP/1.1”, RFC 2616, DOI 10.17487/RFC2616, 1999年6月, <https://www.rfc-editor.org/info/rfc2616>。
[RFC2617]
Franks, J., Hallam-Baker, P., Hostetler, J., Lawrence, S., Leach, P., Luotonen, A., and L. Stewart, “HTTP 認証: Basic および Digest アクセス認証”, RFC 2617, DOI 10.17487/RFC2617, 1999年6月, <https://www.rfc-editor.org/info/rfc2617>。
[RFC2774]
Nielsen, H., Leach, P., and S. Lawrence, “HTTP 拡張 フレームワーク”, RFC 2774, DOI 10.17487/RFC2774, 2000年2月, <https://www.rfc-editor.org/info/rfc2774>。
[RFC2818]
Rescorla, E., “TLS 上の HTTP”, RFC 2818, DOI 10.17487/RFC2818, 2000年5月, <https://www.rfc-editor.org/info/rfc2818>。
[RFC2978]
Freed, N. and J. Postel, “IANA Charset 登録手順”, BCP 19, RFC 2978, DOI 10.17487/RFC2978, 2000年10月, <https://www.rfc-editor.org/info/rfc2978>。
[RFC3040]
Cooper, I., Melve, I., and G. Tomlinson, “インターネット Web 複製および キャッシュの分類”, RFC 3040, DOI 10.17487/RFC3040, 2001年1月, <https://www.rfc-editor.org/info/rfc3040>。
[RFC3864]
Klyne, G., Nottingham, M., and J. Mogul, “メッセージヘッダーフィールドの 登録手順”, BCP 90, RFC 3864, DOI 10.17487/RFC3864, 2004年9月, <https://www.rfc-editor.org/info/rfc3864>。
[RFC3875]
Robinson, D. and K. Coar, “Common Gateway Interface (CGI) バージョン 1.1”, RFC 3875, DOI 10.17487/RFC3875, 2004年10月, <https://www.rfc-editor.org/info/rfc3875>。
[RFC4033]
Arends, R., Austein, R., Larson, M., Massey, D., and S. Rose, “DNS セキュリティの概要と 要件”, RFC 4033, DOI 10.17487/RFC4033, 2005年3月, <https://www.rfc-editor.org/info/rfc4033>。
[RFC4559]
Jaganathan, K., Zhu, L., and J. Brezak, “Microsoft Windows における SPNEGO ベース Kerberos および NTLM HTTP 認証”, RFC 4559, DOI 10.17487/RFC4559, 2006年6月, <https://www.rfc-editor.org/info/rfc4559>。
[RFC5789]
Dusseault, L. and J. Snell, “HTTP の PATCH メソッド”, RFC 5789, DOI 10.17487/RFC5789, 2010年3月, <https://www.rfc-editor.org/info/rfc5789>。
[RFC5905]
Mills, D., Martin, J., Ed., Burbank, J., and W. Kasch, “Network Time Protocol バージョン 4: プロトコルおよびアルゴリズム仕様”, RFC 5905, DOI 10.17487/RFC5905, 2010年6月, <https://www.rfc-editor.org/info/rfc5905>。
[RFC6454]
Barth, A., “Web オリジン 概念”, RFC 6454, DOI 10.17487/RFC6454, 2011年12月, <https://www.rfc-editor.org/info/rfc6454>。
[RFC6585]
Nottingham, M. and R. Fielding, “追加の HTTP ステータス コード”, RFC 6585, DOI 10.17487/RFC6585, 2012年4月, <https://www.rfc-editor.org/info/rfc6585>。
[RFC7230]
Fielding, R., Ed. and J. Reschke, Ed., “ハイパーテキスト転送プロトコル (HTTP/1.1): メッセージ構文とルーティング”, RFC 7230, DOI 10.17487/RFC7230, 2014年6月, <https://www.rfc-editor.org/info/rfc7230>。
[RFC7231]
Fielding, R., Ed. and J. Reschke, Ed., “ハイパーテキスト転送プロトコル (HTTP/1.1): セマンティクスとコンテンツ”, RFC 7231, DOI 10.17487/RFC7231, 2014年6月, <https://www.rfc-editor.org/info/rfc7231>。
[RFC7232]
Fielding, R., Ed. and J. Reschke, Ed., “ハイパーテキスト転送プロトコル (HTTP/1.1): 条件付きリクエスト”, RFC 7232, DOI 10.17487/RFC7232, 2014年6月, <https://www.rfc-editor.org/info/rfc7232>。
[RFC7233]
Fielding, R., Ed., Lafon, Y., Ed., and J. Reschke, Ed., “ハイパーテキスト転送プロトコル (HTTP/1.1): 範囲リクエスト”, RFC 7233, DOI 10.17487/RFC7233, 2014年6月, <https://www.rfc-editor.org/info/rfc7233>。
[RFC7234]
Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, Ed., “ハイパーテキスト転送プロトコル (HTTP/1.1): キャッシュ”, RFC 7234, DOI 10.17487/RFC7234, 2014年6月, <https://www.rfc-editor.org/info/rfc7234>。
[RFC7235]
Fielding, R., Ed. and J. Reschke, Ed., “ハイパーテキスト転送プロトコル (HTTP/1.1): 認証”, RFC 7235, DOI 10.17487/RFC7235, 2014年6月, <https://www.rfc-editor.org/info/rfc7235>。
[RFC7538]
Reschke, J., “ハイパーテキスト 転送プロトコル ステータスコード 308 (恒久的リダイレクト)”, RFC 7538, DOI 10.17487/RFC7538, 2015年4月, <https://www.rfc-editor.org/info/rfc7538>。
[RFC7540]
Belshe, M., Peon, R., and M. Thomson, Ed., “ハイパーテキスト転送プロトコル バージョン 2 (HTTP/2)”, RFC 7540, DOI 10.17487/RFC7540, 2015年5月, <https://www.rfc-editor.org/info/rfc7540>。
[RFC7578]
Masinter, L., “フォームから 値を返す: multipart/form-data”, RFC 7578, DOI 10.17487/RFC7578, 2015年7月, <https://www.rfc-editor.org/info/rfc7578>。
[RFC7615]
Reschke, J., “HTTP Authentication-Info および Proxy-Authentication-Info レスポンスヘッダーフィールド”, RFC 7615, DOI 10.17487/RFC7615, 2015年9月, <https://www.rfc-editor.org/info/rfc7615>。
[RFC7616]
Shekh-Yusef, R., Ed., Ahrens, D., and S. Bremer, “HTTP Digest アクセス 認証”, RFC 7616, DOI 10.17487/RFC7616, 2015年9月, <https://www.rfc-editor.org/info/rfc7616>。
[RFC7617]
Reschke, J., “'Basic' HTTP 認証スキーム”, RFC 7617, DOI 10.17487/RFC7617, 2015年9月, <https://www.rfc-editor.org/info/rfc7617>。
[RFC7694]
Reschke, J., “ハイパーテキスト 転送プロトコル (HTTP) クライアント開始 Content-Encoding”, RFC 7694, DOI 10.17487/RFC7694, 2015年11月, <https://www.rfc-editor.org/info/rfc7694>。
[RFC8126]
Cotton, M., Leiba, B., and T. Narten, “RFC における IANA Considerations 節の記述ガイドライン”, BCP 26, RFC 8126, DOI 10.17487/RFC8126, 2017年6月, <https://www.rfc-editor.org/info/rfc8126>。
[RFC8187]
Reschke, J., “HTTP ヘッダーフィールドパラメーターの 文字エンコーディングと言語の指定”, RFC 8187, DOI 10.17487/RFC8187, 2017年9月, <https://www.rfc-editor.org/info/rfc8187>。
[RFC8246]
McManus, P., “HTTP Immutable レスポンス”, RFC 8246, DOI 10.17487/RFC8246, 2017年9月, <https://www.rfc-editor.org/info/rfc8246>。
[RFC8288]
Nottingham, M., “Web Linking”, RFC 8288, DOI 10.17487/RFC8288, 2017年10月, <https://www.rfc-editor.org/info/rfc8288>。
[RFC8336]
Nottingham, M. and E. Nygren, “ORIGIN HTTP/2 フレーム”, RFC 8336, DOI 10.17487/RFC8336, 2018年3月, <https://www.rfc-editor.org/info/rfc8336>。
[RFC8615]
Nottingham, M., “Well-Known Uniform Resource Identifier (URI)”, RFC 8615, DOI 10.17487/RFC8615, 2019年5月, <https://www.rfc-editor.org/info/rfc8615>。
[RFC8941]
Nottingham, M. and P-H. Kamp, “HTTP の構造化フィールド値”, RFC 8941, DOI 10.17487/RFC8941, 2021年2月, <https://www.rfc-editor.org/info/rfc8941>。
[Sniffing]
WHATWG, “MIME スニッフィング”, <https://mimesniff.spec.whatwg.org>。
[WEBDAV]
Dusseault, L., Ed., “Web 分散オーサリングとバージョニング (WebDAV) のための HTTP 拡張”, RFC 4918, DOI 10.17487/RFC4918, 2007年6月, <https://www.rfc-editor.org/info/rfc4918>。

付録 A. 集約 ABNF

以下の集約 ABNF では、リスト規則は 5.6.1節 に従って展開されている。

Accept = [ ( media-range [ weight ] ) *( OWS "," OWS ( media-range [
  weight ] ) ) ]
Accept-Charset = [ ( ( token / "*" ) [ weight ] ) *( OWS "," OWS ( (
  token / "*" ) [ weight ] ) ) ]
Accept-Encoding = [ ( codings [ weight ] ) *( OWS "," OWS ( codings [
  weight ] ) ) ]
Accept-Language = [ ( language-range [ weight ] ) *( OWS "," OWS (
  language-range [ weight ] ) ) ]
Accept-Ranges = acceptable-ranges
Allow = [ method *( OWS "," OWS method ) ]
Authentication-Info = [ auth-param *( OWS "," OWS auth-param ) ]
Authorization = credentials

BWS = OWS

Connection = [ connection-option *( OWS "," OWS connection-option )
 ]
Content-Encoding = [ content-coding *( OWS "," OWS content-coding )
 ]
Content-Language = [ language-tag *( OWS "," OWS language-tag ) ]
Content-Length = 1*DIGIT
Content-Location = absolute-URI / partial-URI
Content-Range = range-unit SP ( range-resp / unsatisfied-range )
Content-Type = media-type

Date = HTTP-date

ETag = entity-tag
Expect = [ expectation *( OWS "," OWS expectation ) ]

From = mailbox

GMT = %x47.4D.54 ; GMT

HTTP-date = IMF-fixdate / obs-date
Host = uri-host [ ":" port ]

IMF-fixdate = day-name "," SP date1 SP time-of-day SP GMT
If-Match = "*" / [ entity-tag *( OWS "," OWS entity-tag ) ]
If-Modified-Since = HTTP-date
If-None-Match = "*" / [ entity-tag *( OWS "," OWS entity-tag ) ]
If-Range = entity-tag / HTTP-date
If-Unmodified-Since = HTTP-date

Last-Modified = HTTP-date
Location = URI-reference

Max-Forwards = 1*DIGIT

OWS = *( SP / HTAB )

Proxy-Authenticate = [ challenge *( OWS "," OWS challenge ) ]
Proxy-Authentication-Info = [ auth-param *( OWS "," OWS auth-param )
 ]
Proxy-Authorization = credentials

RWS = 1*( SP / HTAB )
Range = ranges-specifier
Referer = absolute-URI / partial-URI
Retry-After = HTTP-date / delay-seconds

Server = product *( RWS ( product / comment ) )

TE = [ t-codings *( OWS "," OWS t-codings ) ]
Trailer = [ field-name *( OWS "," OWS field-name ) ]

URI-reference = <URI-reference, see [URI], Section 4.1>
Upgrade = [ protocol *( OWS "," OWS protocol ) ]
User-Agent = product *( RWS ( product / comment ) )

Vary = [ ( "*" / field-name ) *( OWS "," OWS ( "*" / field-name ) )
 ]
Via = [ ( received-protocol RWS received-by [ RWS comment ] ) *( OWS
  "," OWS ( received-protocol RWS received-by [ RWS comment ] ) ) ]

WWW-Authenticate = [ challenge *( OWS "," OWS challenge ) ]

absolute-URI = <absolute-URI, see [URI], Section 4.3>
absolute-path = 1*( "/" segment )
acceptable-ranges = range-unit *( OWS "," OWS range-unit )
asctime-date = day-name SP date3 SP time-of-day SP year
auth-param = token BWS "=" BWS ( token / quoted-string )
auth-scheme = token
authority = <authority, see [URI], Section 3.2>

challenge = auth-scheme [ 1*SP ( token68 / [ auth-param *( OWS ","
  OWS auth-param ) ] ) ]
codings = content-coding / "identity" / "*"
comment = "(" *( ctext / quoted-pair / comment ) ")"
complete-length = 1*DIGIT
connection-option = token
content-coding = token
credentials = auth-scheme [ 1*SP ( token68 / [ auth-param *( OWS ","
  OWS auth-param ) ] ) ]
ctext = HTAB / SP / %x21-27 ; '!'-'''
  / %x2A-5B ; '*'-'['
  / %x5D-7E ; ']'-'~'
  / obs-text

date1 = day SP month SP year
date2 = day "-" month "-" 2DIGIT
date3 = month SP ( 2DIGIT / ( SP DIGIT ) )
day = 2DIGIT
day-name = %x4D.6F.6E ; Mon
  / %x54.75.65 ; Tue
  / %x57.65.64 ; Wed
  / %x54.68.75 ; Thu
  / %x46.72.69 ; Fri
  / %x53.61.74 ; Sat
  / %x53.75.6E ; Sun
day-name-l = %x4D.6F.6E.64.61.79 ; Monday
  / %x54.75.65.73.64.61.79 ; Tuesday
  / %x57.65.64.6E.65.73.64.61.79 ; Wednesday
  / %x54.68.75.72.73.64.61.79 ; Thursday
  / %x46.72.69.64.61.79 ; Friday
  / %x53.61.74.75.72.64.61.79 ; Saturday
  / %x53.75.6E.64.61.79 ; Sunday
delay-seconds = 1*DIGIT

entity-tag = [ weak ] opaque-tag
etagc = "!" / %x23-7E ; '#'-'~'
  / obs-text
expectation = token [ "=" ( token / quoted-string ) parameters ]

field-content = field-vchar [ 1*( SP / HTAB / field-vchar )
  field-vchar ]
field-name = token
field-value = *field-content
field-vchar = VCHAR / obs-text
first-pos = 1*DIGIT

hour = 2DIGIT
http-URI = "http://" authority path-abempty [ "?" query ]
https-URI = "https://" authority path-abempty [ "?" query ]

incl-range = first-pos "-" last-pos
int-range = first-pos "-" [ last-pos ]

language-range = <language-range, see [RFC4647], Section 2.1>
language-tag = <Language-Tag, see [RFC5646], Section 2.1>
last-pos = 1*DIGIT

mailbox = <mailbox, see [RFC5322], Section 3.4>
media-range = ( "*/*" / ( type "/*" ) / ( type "/" subtype ) )
  parameters
media-type = type "/" subtype parameters
method = token
minute = 2DIGIT
month = %x4A.61.6E ; Jan
  / %x46.65.62 ; Feb
  / %x4D.61.72 ; Mar
  / %x41.70.72 ; Apr
  / %x4D.61.79 ; May
  / %x4A.75.6E ; Jun
  / %x4A.75.6C ; Jul
  / %x41.75.67 ; Aug
  / %x53.65.70 ; Sep
  / %x4F.63.74 ; Oct
  / %x4E.6F.76 ; Nov
  / %x44.65.63 ; Dec

obs-date = rfc850-date / asctime-date
obs-text = %x80-FF
opaque-tag = DQUOTE *etagc DQUOTE
other-range = 1*( %x21-2B ; '!'-'+'
  / %x2D-7E ; '-'-'~'
 )

parameter = parameter-name "=" parameter-value
parameter-name = token
parameter-value = ( token / quoted-string )
parameters = *( OWS ";" OWS [ parameter ] )
partial-URI = relative-part [ "?" query ]
path-abempty = <path-abempty, see [URI], Section 3.3>
port = <port, see [URI], Section 3.2.3>
product = token [ "/" product-version ]
product-version = token
protocol = protocol-name [ "/" protocol-version ]
protocol-name = token
protocol-version = token
pseudonym = token

qdtext = HTAB / SP / "!" / %x23-5B ; '#'-'['
  / %x5D-7E ; ']'-'~'
  / obs-text
query = <query, see [URI], Section 3.4>
quoted-pair = "\" ( HTAB / SP / VCHAR / obs-text )
quoted-string = DQUOTE *( qdtext / quoted-pair ) DQUOTE
qvalue = ( "0" [ "." *3DIGIT ] ) / ( "1" [ "." *3"0" ] )

range-resp = incl-range "/" ( complete-length / "*" )
range-set = range-spec *( OWS "," OWS range-spec )
range-spec = int-range / suffix-range / other-range
range-unit = token
ranges-specifier = range-unit "=" range-set
received-by = pseudonym [ ":" port ]
received-protocol = [ protocol-name "/" ] protocol-version
relative-part = <relative-part, see [URI], Section 4.2>
rfc850-date = day-name-l "," SP date2 SP time-of-day SP GMT

second = 2DIGIT
segment = <segment, see [URI], Section 3.3>
subtype = token
suffix-length = 1*DIGIT
suffix-range = "-" suffix-length

t-codings = "trailers" / ( transfer-coding [ weight ] )
tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" / "+" / "-" / "." /
  "^" / "_" / "`" / "|" / "~" / DIGIT / ALPHA
time-of-day = hour ":" minute ":" second
token = 1*tchar
token68 = 1*( ALPHA / DIGIT / "-" / "." / "_" / "~" / "+" / "/" )
 *"="
transfer-coding = token *( OWS ";" OWS transfer-parameter )
transfer-parameter = token BWS "=" BWS ( token / quoted-string )
type = token

unsatisfied-range = "*/" complete-length
uri-host = <host, see [URI], Section 3.2.2>

weak = %x57.2F ; W/
weight = OWS ";" OWS "q=" qvalue

year = 4DIGIT

付録 B. 以前の RFC からの変更

B.1. RFC 2818 からの変更

なし。

B.2. RFC 7230 からの変更

HTTP の設計目標、歴史、アーキテクチャ、適合性 基準、プロトコルバージョニング、URI、メッセージルーティング、およびヘッダーフィールドを導入する節は、 ここへ移動された。

セマンティクス上の適合性に関する要件は、実装固有の障害を無視または 回避することを許可する規定へ置き換えられた。(2.2節)

オリジンおよびオリジンサーバーへの権威あるアクセスの説明は、 "http" と "https" URI の両方について、代替サービスおよび必ずしも TCP に 基づかない安全化された接続を考慮するよう拡張された。(4.2.1、4.2.2、4.3.1、 および 7.3.3節)

ターゲット URI スキームのセマンティクスを確認し、 関連する要件を満たさないリクエストを拒否するための明示的な要件が追加された。(7.4節)

メディアタイプ、メディア範囲、および期待値のパラメーターは、一つ以上の 末尾のセミコロンによって空にできる。(5.6.6節)

"Field value" は現在、複数のフィールド行をコンマで結合した後の値を指す — 圧倒的に最も一般的な用法である。単一のヘッダー行の値を指す場合は "field line value" を使用する。(6.3節)

トレーラーフィールドのセマンティクスは、chunked transfer coding の詳細を超えるものとなった。 トレーラーフィールドの使用はさらに制限され、送信者がそのフィールドがトレーラーフィールドとしての使用を定義していると 知っている場合にのみトレーラーフィールドとして生成でき、ヘッダー セクションへの結合は、受信者が対応するフィールド定義がそれを許可し、 結合方法を定義していると知っている場合にのみ許可される。それ以外のすべての場合、 実装にはトレーラー フィールドを結合するのではなく、別個に保存するか破棄することが推奨される。(6.5.1節 )

オリジンサーバーにおいて、リクエスト URI の絶対形式を Host ヘッダーフィールドより 優先することが、プロキシ処理と整合するよう明示された。(7.2節)

Via フィールドの "received-by" に関する文法定義は、RFC 7230 で、 host の URI 文法変更 [URI] により拡張されたが、 Via には望ましくない。簡潔さのため、received-by 生成規則から uri-host を削除した。既存の pseudonym 文法で包含できるためである。特に、 この変更により received-by のホスト名で許可される文字集合からコンマが削除された。 (7.6.3節 )

B.3. RFC 7231 からの変更

実装がサポートするべき URI の最小長が推奨されるようになった。(4.1節)

次の点が明確化された。フィールド値内の CR および NUL は拒否するか SP に対応付け、フィールド値の先頭および末尾の空白は、 使用される前に取り除く必要がある。(5.5節 )

メディアタイプ、メディア範囲、および期待値のパラメーターは、一つ以上の 末尾のセミコロンによって空にできる。(5.6.6節)

HTTP メッセージの抽象データ型が導入され、[HTTP/1.1] の HTTP/1.1 固有の構文形式ではなく、 複数の HTTP バージョンにまたがる抽象化としてメッセージの構成要素とそのセマンティクスを定義し、 メッセージ解析後の内容を反映する。これにより、 コンテンツに対する要件 (何が伝達されるか) とメッセージング 構文に対する要件 (どのように伝達されるか) を区別しやすくなり、 初期プロトコルバージョンの制限を HTTP の将来へ固定化することを避けられる。(6節)

"payload" および "payload body" という用語は、他の場所での使用 (例: フィールド名) とより整合し、HTTP/2 および HTTP/3 のフレーム ペイロードとの混同を避けるため、"content" へ置き換えられた。(6.4節)

"effective request URI" という用語は "target URI" へ置き換えられた。(7.1節)

クライアントの再試行に関する制限は、実装動作を反映するため緩和された。(9.2.2節)

GET、HEAD、および DELETE のリクエスト本文が相互運用可能でないことが 明確化された。(9.3.1、9.3.2、および 9.3.5節)

PUT でのリクエスト修飾子として 14.4節 の Content-Range ヘッダーフィールドを 使用することが許可された。(9.3.4節)

Content-Length の設定に関する冗長な要件が OPTIONS メソッドの説明から削除された。(9.3.7節)

TRACE レスポンスで "message/http" メディアタイプを使用する規範的要件が 削除された。(9.3.8節)

RFC 2616 との互換性のため、Expect のリストベース文法が復元された 。(10.1.1節)

Accept および Accept-Encoding はレスポンスメッセージで許可される。後者は [RFC7694] により導入された。 (12.3節 )

"Accept Parameters" (accept-params および accept-ext ABNF 生成規則) は、 Accept フィールドの定義から削除された。(12.5.1節)

Accept-Charset フィールドは現在非推奨である。(12.5.2節)

他の値が存在する場合の Vary ヘッダーフィールド内の "*" のセマンティクスが明確化された。(12.5.5節)

範囲単位は大文字小文字を区別せずに比較される。(14.1節)

Accept-Ranges フィールドの使用はオリジンサーバーに限定されない。(14.3節)

リダイレクトされたリクエストを作成する処理が明確化された。(15.4節)

ステータスコード 308 (以前は [RFC7538] で定義) は、ステータスコード 301、302、および 307 に近い場所で定義されるよう追加された。(15.4.9節 )

ステータスコード 421 (以前は [RFC7540] の 9.1.2節 で定義) は 一般的な適用可能性のため追加された。421 は、レスポンスが接続 (ターゲットリソースではない) に固有であるため、もはやヒューリスティックにキャッシュ可能とは定義されない。(15.5.20節)

ステータスコード 422 (以前は [WEBDAV] の 11.2節) は一般的な適用可能性のため追加された。(15.5.21節)

B.4. RFC 7232 からの変更

以前の HTTP 改訂版では、 Date と Last-Modified 値が異なる時計から、またはレスポンス準備中の わずかに異なる時刻に生成される可能性へ対処するため、Last-Modified が強いバリデーターかどうかの判断に 任意の 60 秒制限を課していた。この仕様では、 合理的な裁量を許可するよう緩和された。(8.8.2.2節)

If-Match および If-Unmodified-Since に関する特殊ケースの要件が削除された。 これは変更リクエストがすでに適用されているため 検証が失敗した場合、2xx レスポンスでバリデーターを送信しないことを要求していた。(13.1.1 および 13.1.4節)

If-Unmodified-Since が変更時刻の概念を持たないリソースには適用されないことが 明確化された。(13.1.4節 )

事前条件は、レスポンスが他の場合に成功するまで待つのではなく、 リクエストコンテンツが処理される前に評価できるようになった。(13.2節)

B.5. RFC 7233 からの変更

range-unit および ranges-specifier 文法を再構成し、bytes とその他の (拡張) 範囲単位との人為的な区別を簡素化・削減した。range unit を一般に token として定義し、 拡張を range-spec (other-range) の範囲内へ配置することで、 other-range-unit の重複する文法を削除した。これにより、拡張範囲単位を含む すべての範囲集合で、一つより多い範囲の range-set を示す リスト構文 (コンマ) の役割が明確になる。拡張文法を range 指定子へ移動することで、バイト範囲固有のプロトコルを別個に規定することも可能になる。

拡張メソッドで Range 処理を定義できるようになった。(14.2節)

部分 PUT を実行するためのリクエスト修飾子として Content-Range ヘッダー フィールド (14.4節) を使用することを記述した。(14.5節)

B.6. RFC 7235 からの変更

なし。

B.7. RFC 7538 からの変更

なし。

B.8. RFC 7615 からの変更

なし。

B.9. RFC 7694 からの変更

この仕様は [RFC7694] で定義された拡張を含むが、例および配備上の考慮事項は省略している。

謝辞

現在の編集者に加えて、以下の人々は HTTP の初期の側面およびその中核仕様への 貢献について特に称賛されるに値する: Marc Andreessen, Tim Berners-Lee, Robert Cailliau, Daniel W. Connolly, Bob Denny, John Franks, Jim Gettys, Jean-François Groff, Phillip M. Hallam-Baker, Koen Holtman, Jeffery L. Hostetler, Shel Kaphan, Dave Kristol, Yves Lafon, Scott D. Lawrence, Paul J. Leach, Håkon W. Lie, Ari Luotonen, Larry Masinter, Rob McCool, Jeffrey C. Mogul, Lou Montulli, David Morris, Henrik Frystyk Nielsen, Dave Raggett, Eric Rescorla, Tony Sanders, Lawrence C. Stewart, Marc VanHeyningen, and Steve Zilles.

この文書は、以下を含む過去の HTTP 仕様に寄せられた多くの貢献を基礎としている: [HTTP/1.0], [RFC2068], [RFC2145], [RFC2616], [RFC2617], [RFC2818], [RFC7230], [RFC7231], [RFC7232], [RFC7233], [RFC7234], and [RFC7235]. これらの文書内の謝辞も引き続き適用される。

2014 年以降、以下の貢献者がバグの報告、的確な質問、文章の起草またはレビュー、 および問題の評価によって、この仕様の改善に協力した:

Alan Egerton, Alex Rousskov, Amichai Rothman, Amos Jeffries, Anders Kaseorg, Andreas Gebhardt, Anne van Kesteren, Armin Abfalterer, Aron Duby, Asanka Herath, Asbjørn Ulsberg, Asta Olofsson, Attila Gulyas, Austin Wright, Barry Pollard, Ben Burkert, Benjamin Kaduk, Björn Höhrmann, Brad Fitzpatrick, Chris Pacejo, Colin Bendell, Cory Benfield, Cory Nelson, Daisuke Miyakawa, Dale Worley, Daniel Stenberg, Danil Suits, David Benjamin, David Matson, David Schinazi, Дилян Палаузов (Dilyan Palauzov), Eric Anderson, Eric Rescorla, Éric Vyncke, Erik Kline, Erwin Pe, Etan Kissling, Evert Pot, Evgeny Vrublevsky, Florian Best, Francesca Palombini, Igor Lubashev, James Callahan, James Peach, Jeffrey Yasskin, Kalin Gyokov, Kannan Goundan, 奥 一穂 (Kazuho Oku), Ken Murchison, Krzysztof Maczyński, Lars Eggert, Lucas Pardue, Martin Duke, Martin Dürst, Martin Thomson, Martynas Jusevičius, Matt Menke, Matthias Pigulla, Mattias Grenfeldt, Michael Osipov, Mike Bishop, Mike Pennisi, Mike Taylor, Mike West, Mohit Sethi, Murray Kucherawy, Nathaniel J. Smith, Nicholas Hurley, Nikita Prokhorov, Patrick McManus, Piotr Sikora, Poul-Henning Kamp, Rick van Rein, Robert Wilton, Roberto Polli, Roman Danyliw, Samuel Williams, Semyon Kholodnov, Simon Pieters, Simon Schüppel, Stefan Eissing, Taylor Hunt, Todd Greer, Tommy Pauly, Vasiliy Faronov, Vladimir Lashchev, Wenbo Zhu, William A. Rowe Jr., Willy Tarreau, Xingwei Liu, Yishuai Li, and Zaheduzzaman Sarker.

索引

1 2 3 4 5 A B C D E F G H I K L M N O P R S T U V W X

著者の連絡先

Roy T. Fielding (編集者)
Adobe
345 Park Ave
San Jose, CA 95110
アメリカ 合衆国
メール: fielding@gbiv.com
URI: https://roy.gbiv.com/
Mark Nottingham (編集者)
Fastly
Prahran
オーストラリア
メール: mnot@mnot.net
URI: https://www.mnot.net/
Julian Reschke (編集者)
greenbytes GmbH
Hafenweg 16
48155 Münster
ドイツ
メール: julian.reschke@greenbytes.de
URI: https://greenbytes.de/tech/webdav/