Internet Engineering Task Force (IETF) R. Fielding, Editor
Request for Comments: 9110 Adobe
Obsoletes: 2818, 7230, 7231, 7232, 7233, 7235, 7538, 7615, 7694 M. Nottingham, Editor
STD: 97 Fastly
Updates: 3864 J. Reschke, Editor
Category: Standards Track greenbytes
ISSN: 2070-1721 June 2022

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年の登場以来、ワールドワイドウェブの主要な情報転送プロトコルとなっています。当初は低遅延リクエストのための簡単な仕組みであり、指定されたパス名で識別される想定ハイパーテキスト文書の転送を要求する単一のメソッド(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を利用することで、並行メッセージ間の独立性がさらに高まりました。

これら3つの主要なHTTPバージョンはいずれも本書で定義されるセマンティクスに依拠しています。各バージョンは利用文脈に応じて固有の利点と制限があるため、互いを廃止していません。実装は自らの状況に最も適したトランスポートとメッセージ構文を選択することが期待されます。

本改訂では、セマンティクス(本書)およびキャッシュ([CACHING])の定義と、現行HTTP/1.1メッセージ構文([HTTP/1.1])の定義を分離し、各主要バージョンが同じコアセマンティクスを参照しつつ独立して発展できるようにしています。

1.3. コアセマンティクス

HTTPは、リソース(セクション3.1)の型や性質、実装方法に関わらず、その表現(セクション3.2)を操作・転送するメッセージを送ることで、リソースとのやり取りのための均一なインターフェースを提供します。

各メッセージはリクエストまたはレスポンスのいずれかです。クライアントは自身の意図を伝えるリクエストメッセージを構築し、それを識別されたオリジンサーバーへ送ります。サーバーはリクエストを受信して解析し、ターゲットリソースに関連付けてメッセージのセマンティクスを解釈し、1つ以上のレスポンスメッセージで応答します。クライアントは受信したレスポンスを確認し、意図が実行されたかをステータスコードや受信内容から判断し、次に行うべきことを決定します。

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

セマンティクスには、内容の解釈方法を示す表現メタデータ、コンテンツ選択に影響するリクエストヘッダーフィールド、および総称してコンテンツネゴシエーションセクション12)と呼ばれるさまざまな選択アルゴリズムも含まれます。

1.4. 本書が廃止する仕様

表1
タイトル 参照 参照先
HTTP Over TLS [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メッセージ構文およびコネクション管理に依存しない部分のみを廃止します。残りの部分は「HTTP/1.1」[HTTP/1.1]で廃止されます。

2. 適合性

2.1. 構文表記

本仕様書では、[RFC5234]で規定されている拡張バッカス・ナウア記法(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. 要件表記

本書における "MUST"、"MUST NOT"、"REQUIRED"、"SHALL"、"SHALL NOT"、"SHOULD"、"SHOULD NOT"、"RECOMMENDED"、"NOT RECOMMENDED"、"MAY"、"OPTIONAL" というキーワードは、BCP 14 [RFC2119] および [RFC8174] で説明される通り、すべて大文字で記載されている場合のみ、ここで示す意味として解釈されます。

本仕様書は、HTTP通信における参加者の役割に応じた適合性基準を対象とします。したがって、要件は送信者、受信者、クライアント、サーバー、ユーザーエージェント、中継者、オリジンサーバー、プロキシ、ゲートウェイ、キャッシュなど、要件によって制約される挙動に応じて課されます。さらに、実装、リソース所有者、プロトコル要素の登録に対して、単一通信の範囲を超える場合に追加要件が課されます。

「send」ではなく「generate」という動詞は、要件が受信要素をそのまま転送する実装ではなく、プロトコル要素を生成する実装のみに適用される場合に使われます。

実装がHTTPにおいて自身の役割に関連するすべての要件に準拠していれば、その実装は適合しているとみなされます。

送信者は、対応するABNFルールで定義された文法に一致しないプロトコル要素をMUST NOT生成しなければなりません。また、1つのメッセージ内で、送信者がそのメッセージで持たない役割(例:他のロールにのみ許されている構文やプロトコル要素)を生成MUST NOTしなければなりません。

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

実装がセマンティクス適合性に失敗した場合、その実装からのメッセージの受信者は、やがて自身の振る舞いを調整する回避策を開発することになります。受信者は、こうした回避策が対象の実装に限定されている場合、このプロトコルに適合したまま回避策をMAY適用してよいです。例えば、サーバーはUser-Agentフィールド値の一部をスキャンして既知のバグや既定値の不備に応じて自身の動作を調整することが多く、ユーザーエージェントもServerフィールド値の一部を同様に利用します。

2.3. 長さの要件

受信者は、受信したプロトコル要素がABNF文法に準拠していて合理的なバッファサイズ内に収まることを期待しつつ、防御的に解析SHOULDするべきです。

HTTPは、多くのプロトコル要素について特定の長さ制限を設けていません。なぜなら、適切とされる長さは運用環境や実装目的によって大きく異なるためです。したがって、送信者と受信者の間の相互運用性は、各プロトコル要素の「合理的な」長さに対する共通認識に依存します。また、HTTPの過去30年の利用を通じて一部プロトコル要素の「合理的な」長さの常識も変化してきており、今後も変化が予想されます。

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

多くの受信プロトコル要素は、下流に転送するために必要な範囲でのみ解析されます。例えば、中継者は受信したフィールドをフィールド名と値に分割するだけで、フィールド値の中身まで解析せずに転送することがよくあります。

2.4. エラー処理

受信者は、経験や設定によって送信者がそのセマンティクスを正しく実装していないと判明していない限り、本仕様書やその拡張で定義されるセマンティクスに従って受信したプロトコル要素を解釈MUSTします。例えば、オリジンサーバーは、User-Agentヘッダー値から特定の実装バージョンを検出し、その実装が特定のコンテンツコーディングの受信に失敗することが知られている場合、Accept-Encodingヘッダーの内容を無視することがあります。

別途明記がない限り、受信者は無効な構造から有効なプロトコル要素の復元を試みMAYます。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はワールドワイドウェブ(WWW)アーキテクチャのために作られ、世界規模のハイパーテキストシステムのスケーラビリティ要求を支えるよう進化してきました。そのアーキテクチャの多くは、HTTPを定義する際に使われる用語にも反映されています。

3.1. リソース

HTTPリクエストの対象はリソースと呼ばれます。HTTPはリソースの性質を制限しません。リソースとやり取りするためのインターフェースを提供するだけです。ほとんどのリソースは、セクション4で説明されているように、統一リソース識別子(URI)によって識別されます。

HTTPの設計目標のひとつは、リソースの識別とリクエストセマンティクスを分離することです。これは、リクエストセマンティクスをリクエストメソッド(セクション9)や一部のリクエスト修飾ヘッダーフィールドに委ねることで実現されています。リソースは、リクエストのメソッドのセマンティクスと矛盾する方法でリクエストを扱うことはできません。例えば、リソースのURIが安全でないセマンティクスを示唆していたとしても、クライアントは安全なメソッドによるリクエスト処理時に安全でない動作を回避することを期待できます(セクション9.2.1参照)。

HTTPは、ターゲットリソース(セクション7.1)やリソース間の関係を示すために、統一リソース識別子(URI)標準[URI]に依拠しています。

3.2. 表現

表現とは、あるリソースの過去・現在または望ましい状態を、プロトコルを通じて容易に通信可能な形式で反映する情報です。表現は、表現メタデータの集合と、理論上制限のない表現データのストリームから成ります(セクション8)。

HTTPは、リソースそのものを転送するのではなく、リソース状態の転送可能な表現に基づいて通信を定義することで、「情報の隠蔽」をその均一なインターフェースの背後で実現します。これにより、URIで識別されるリソースは「ラグナビーチの現在の天気」のような時間的関数も含めて何でもよく、メッセージ生成時点のそのリソースを表す情報を提供できる場合があります[REST]

均一なインターフェースは、独立したアクターへのメッセージ通信を通じてのみ対象物を観察・操作できる「窓」のようなものです。我々の通信でその対象の現在または望ましい状態を表現(「代理」)するための共通抽象が必要となります。表現がハイパーテキストであれば、リソース状態の表現と、受信者の将来のやり取りを導く処理指示の両方を提供できます。

ターゲットリソースは、リソースの現在の状態を反映する複数の表現を持つ場合や生成可能な場合があります。コンテンツネゴシエーションセクション12)などに基づくアルゴリズムで、その中から特定のリクエストに最も適したものが選択されます。この選択された表現は、条件付きリクエストの評価(セクション13)や、GET(セクション9.3.1)への200 (OK)、206 (Partial Content)、304 (Not Modified)レスポンスのコンテンツ生成に使われます。

3.3. コネクション、クライアント、サーバ

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

HTTP クライアントは、1つ以上のHTTPリクエストを送信するためにサーバーへのコネクションを確立するプログラムです。HTTP サーバは、HTTPリクエストに対してHTTPレスポンスを返すためにコネクションを受け付けるプログラムです。

クライアントおよびサーバという用語は、そのプログラムがあるコネクションで果たす役割のみを指します。同じプログラムが、あるコネクションではクライアントとして、別のコネクションではサーバとして振る舞うこともあります。

HTTPはステートレスなプロトコルとして定義されており、各リクエストメッセージのセマンティクスは単独で理解でき、コネクションやその上のメッセージ間の関係がメッセージの解釈に影響を与えません。例えば、CONNECTリクエスト(セクション9.3.6)やUpgradeヘッダーフィールド付きリクエスト(セクション7.8)は、コネクション上の最初のメッセージに限らず任意のタイミングで発生し得ます。多くの実装は、HTTPのステートレス設計に依存してプロキシ接続の再利用や複数サーバへの動的ロードバランスを実現しています。

そのため、サーバはコネクションが安全でかつ特定のユーザーエージェント専用でない限り、同一コネクション上の2つのリクエストが同じユーザーエージェントからのものだとMUST NOT想定してはいけません。一部の非標準HTTP拡張(例:[RFC4559])はこの要件に違反し、セキュリティや相互運用上の問題を引き起こしています。

3.4. メッセージ

HTTPは、コネクション上でメッセージをやり取りするためのステートレスなリクエスト/レスポンスプロトコルです。送信者および受信者という用語は、それぞれあるメッセージを送る/受け取る実装全般を指します。

クライアントは、メソッド(セクション9)およびリクエストターゲット(セクション7.1)を持つリクエストメッセージの形でサーバへ送信します。リクエストには、リクエスト修飾・クライアント情報・表現メタデータ用のヘッダーフィールド(セクション6.3)、メソッドに従って処理されるべきコンテンツ(セクション6.4)、およびコンテンツ送信時に収集された情報を伝えるトレーラーフィールド(セクション6.5)などが含まれることがあります。

サーバは、ひとつ以上のレスポンスメッセージを送信してクライアントのリクエストに応答します。それぞれのレスポンスにはステータスコード(セクション15)が含まれます。レスポンスにはサーバ情報・リソースメタデータ・表現メタデータ用のヘッダーフィールド、ステータスコードに従って解釈されるべきコンテンツ、コンテンツ送信時に収集された情報を伝えるトレーラーフィールドなどが含まれる場合があります。

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

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

最も身近なユーザーエージェントは汎用ウェブブラウザですが、これは実装全体から見ればごく一部にすぎません。他によく見られるユーザーエージェントには、スパイダー(ウェブ巡回ロボット)、コマンドラインツール、案内掲示板、家庭用家電、はかり、電球、ファームウェア更新スクリプト、モバイルアプリ、多種多様な通信デバイスなどがあります。

ユーザーエージェントであることは、リクエスト発行時に人間ユーザーが直接そのソフトウェアと対話していることを意味しません。多くの場合、ユーザーエージェントはバックグラウンド実行・結果の後閲覧用にインストールまたは設定されており、興味深い/異常な結果のみを保存することもあります。たとえばスパイダーは、開始URIを与えられ、ウェブをハイパーテキストグラフとして巡回する際の振る舞いが構成されています。

多くのユーザーエージェントは、ユーザーと対話的に提案を行ったり、セキュリティやプライバシー上の警告を十分に提示したりできないか、あえてそうしません。本仕様がエラーのユーザー通知を要求する場合でも、エラーコンソールやログファイルでの観察のみで十分です。同様に、ユーザーによる自動処理の確認を要求する場合、事前設定・実行時オプション・危険行為の単純な回避などで満たしてもよく、ユーザーが既に選択済みなら特定のUIや処理割り込みを要求しません。

3.6. オリジンサーバ

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

最もよく知られるオリジンサーバは大規模な公開ウェブサイトです。しかし、ユーザーエージェント=ブラウザであると誤解されやすいのと同様、すべてのオリジンサーバが同じであると思い込まないよう注意が必要です。よくあるオリジンサーバには、ホームオートメーションユニット、設定可能なネットワーク機器、オフィス機器、自律ロボット、ニュースフィード、交通カメラ、リアルタイム広告選択装置、ビデオオンデマンドプラットフォームなども含まれます。

大半のHTTP通信は、URIで識別されるリソースの表現を取得するリクエスト(GET)から成ります。最も単純な場合、これはユーザーエージェント(UA)とオリジンサーバ(O)間の単一の双方向コネクション(===)で実現できます。

         request   >
    UA ======================================= O
                                <   response

3.7. 中継者

HTTPは、中継者を使ってコネクションの連鎖を通じてリクエストを成立させることができます。HTTP 中継者には、プロキシ、ゲートウェイ、トンネルの3つの一般的な形態があります。場合によっては、単一の中継者がリクエストごとにオリジンサーバ・プロキシ・ゲートウェイ・トンネルのいずれかとして振る舞うこともあります。

         >             >             >             >
    UA =========== A =========== B =========== C =========== O
               <             <             <             <

上図は、ユーザーエージェントとオリジンサーバの間に3つの中継者(A, B, C)がある例です。リクエストやレスポンスメッセージがチェーン全体を通る場合、4つの独立したコネクションを経由します。HTTP通信のいくつかのオプションは、最も近い(非トンネル)隣接ノードだけ、チェーンの両端だけ、または全コネクションに適用される場合があります。図は直線ですが、各参加者は複数の通信を並行して行っていることもあります。たとえばBは、A以外の多くのクライアントからリクエストを受けたり、C以外のサーバへ転送したりしつつ、Aからのリクエストも処理しています。同様に、後続リクエストは異なるコネクション経路を通る場合があり、これは多くの場合ロードバランシングのための動的設定に基づいています。

上流および下流という用語は、メッセージの流れに関する方向的要件を説明するために使います。すべてのメッセージは上流から下流へ流れます。インバウンドおよびアウトバウンドはリクエスト経路に関する方向を示し、インバウンドは「オリジンサーバ側へ」、アウトバウンドは「ユーザーエージェント側へ」を意味します。

プロキシは、クライアントによって(通常ローカル設定ルールで)選択されるメッセージ転送エージェントで、特定種別の絶対URIリクエストを受け取り、HTTPインターフェースを通じてそれを満たすよう試みます。翻訳が最小限(例:"http" URIのプロキシリクエスト)な場合もあれば、別のアプリケーションレベルプロトコルへの変換を要する場合もあります。プロキシは、組織内のHTTPリクエストを共通中継者経由に集約してセキュリティサービス・注釈サービス・共有キャッシュを実現するためによく使われます。プロキシの中には、セクション7.7で説明されるように、転送中に特定メッセージやコンテンツへ変換を適用するものもあります。

ゲートウェイ(別名:リバースプロキシ)は、アウトバウンド接続ではオリジンサーバとして振る舞い、受信リクエストを別のサーバへインバウンドで転送・変換する中継者です。ゲートウェイは、レガシーまたは信頼できない情報サービスのカプセル化、アクセラレータキャッシュによるサーバ性能改善、複数マシンへのHTTPサービス分割・負荷分散などに使われます。

オリジンサーバに適用されるすべてのHTTP要件は、ゲートウェイのアウトバウンド通信にも適用されます。ゲートウェイは、インバウンドサーバとの通信に任意のプロトコル(HTTP拡張含む)を用いることができます。ただし、HTTP対HTTPゲートウェイがサードパーティのHTTPサーバと相互運用するには、ゲートウェイのインバウンド接続におけるユーザーエージェント要件に準拠する必要があります。

トンネルは、2つのコネクション間をメッセージを改変せず中継するブラインドリレーです。いったん確立されると、トンネルはHTTP通信の当事者とは見なされませんが、トンネルがHTTPリクエストで開始される場合もあります。中継コネクションの両端が閉じられるとトンネルも消滅します。トンネルは中継者越しに仮想コネクションを拡張するのに使われ、たとえばTLS([TLS13])を使って共有ファイアウォールプロキシ越しに機密通信を確立する場合などがあります。

ここで述べた中継者の分類は、HTTP通信の当事者として振る舞うものだけを考えています。ネットワークプロトコルスタック下層でHTTPトラフィックをフィルタ・リダイレクトする中継者もあり、これらはメッセージ送信者に知られず・許可されずに動作します。ネットワーク中継者は(プロトコル観点では)経路上攻撃者と区別できず、HTTPセマンティクスの違反によるセキュリティ欠陥や相互運用問題をしばしば引き起こします。

例えばインターセプションプロキシ [RFC3040]トランスペアレントプロキシ [RFC1919]とも) は、HTTPプロキシと異なりクライアントによって選択されません。インターセプションプロキシは、発信TCPポート80(や他の一般的なポート)へのパケットをフィルタまたはリダイレクトします。インターセプションプロキシは、非ローカルインターネットサービス利用前にアカウント認証を強制する公共ネットワークアクセスポイントや、企業ファイアウォールでの利用規約強制などでよく見られます。

3.8. キャッシュ

キャッシュとは、過去のレスポンスメッセージのローカル保存およびそのメッセージの保存・取得・削除を制御するサブシステムです。キャッシュは、将来の同等リクエストに対する応答時間やネットワーク帯域の削減のため、キャッシュ可能なレスポンスを保存します。任意のクライアントやサーバMAYキャッシュを利用できますが、トンネルとして動作中はキャッシュを使えません。

キャッシュの効果として、チェーン上のいずれかの参加者がリクエストに適用可能なキャッシュ済みレスポンスを持っていれば、リクエスト/レスポンスチェーンが短縮されます。次の例は、BがO(C経由)からの以前のレスポンスをキャッシュしていて、UAやAはキャッシュしていない場合のチェーンを示します。

            >             >
       UA =========== A =========== B - - - - - - C - - - - - - O
                  <             <

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

キャッシュは、WWW全体や大規模組織内で多種多様な構成・アーキテクチャが展開されています。これには、帯域節約・遅延削減のための国ごとのプロキシキャッシュ階層、人気サイトの地域・世界配信最適化にゲートウェイキャッシュを使うCDN、キャッシュエントリのブロードキャストやマルチキャストによる協調システム、オフラインや高遅延環境向けの事前取得キャッシュアーカイブなどがあります。

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 Identifiers (URIs) [URI] は、リソースを識別する手段として HTTP 全体で使用されます(セクション 3.1)。

4.1. URI 参照

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

"URI-reference"、"absolute-URI"、"relative-part"、"authority"、"port"、 "host"、"path-abempty"、"segment"、および "query" の定義は URI 汎用構文から採用されています。 プロトコル要素が空でないパス成分を含む可能性がある場合のために "absolute-path" ルールが定義されています。 (このルールは RFC 3986 の path-abempty ルールとわずかに異なり、path-abempty は空のパスを許容し、path-absolute ルールは"//"で始まるパスを許可しない点で差があります。) 相対 URI を含むことはできるがフラグメント成分を持てないプロトコル要素のために "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 ]

HTTP のプロトコル要素で URI 参照を許可するものは、それが任意の形式の参照(URI-reference)を許すか、絶対形式の URI のみを許すか(absolute-URI)、パスと任意のクエリ成分のみを許すか(partial-URI)、またはこれらの組み合わせのいずれかを、その ABNF 生成規則で示します。 特に明示されない限り、URI 参照はターゲット URI に対して相対的に解析されます(セクション 7.1)。

すべての送信者と受信者が、少なくともプロトコル要素内で 8000 オクテットの長さの URI をサポートすることが 推奨されます。これは、場合によってはいくつかの構造やオンワイヤ表現(例えば HTTP/1.1 のリクエスト行)がより大きくなることを意味します。

4.2. HTTP関連のURIスキーム

IANA は URI スキームのレジストリ [BCP35]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 成分によって識別されます。authority にはホスト識別子([URI], セクション 3.2.2)と任意のポート番号([URI], セクション 3.2.3)が含まれます。ポートサブコンポーネントが空であるか与えられていない場合、TCP ポート 80(WWW サービスの予約ポート)がデフォルトになります。オリジンは、識別されたリソースをターゲットにするリクエストに対して権威を持って応答する権利を誰が有するかを決定します(セクション 4.3.2)。

送信者は空のホスト識別子を持つ "http" URI を生成してはなりません(MUST NOT)。そのような URI 参照を処理する受信者は、それを無効として拒否しなければなりません(MUST)。

階層的なパス成分と任意のクエリ成分が、そのオリジンサーバーの名前空間内でのターゲットリソースを特定します。

4.2.2. https URI スキーム

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

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

"https" URI のオリジンサーバーは authority 成分によって識別され、そこにはホスト識別子([URI], セクション 3.2.2)と任意のポート番号([URI], セクション 3.2.3)が含まれます。ポートサブコンポーネントが空であるか与えられていない場合、TCP ポート 443(TLS 上の HTTP の予約ポート)がデフォルトになります。オリジンは、識別されたリソースをターゲットにするリクエストに対して権威を持って応答する権利を誰が有するかを決定します(セクション 4.3.3)。

送信者は空のホスト識別子を持つ "https" URI を生成してはなりません(MUST NOT)。そのような URI 参照を処理する受信者は、それを無効として拒否しなければなりません(MUST)。

階層的なパス成分と任意のクエリ成分が、そのオリジンサーバーの名前空間内でのターゲットリソースを特定します。

クライアントは "https" リソースへの HTTP リクエストを送信する前に、それらが保護されていることを MUST 確認し、かつそのリクエストに対して返される応答も保護されたものであることのみ受け入れなければなりません。どの暗号化手段がクライアントとサーバーにとって受け入れ可能かの定義は通常ネゴシエートされ、時間とともに変化する可能性があることに注意してください。

"https" スキームで提供されるリソースは "http" スキームと共有の同一性を持ちません。これらは別個の名前空間を持つ別個のオリジンです。ただし、同じホストに対して適用される拡張(例えば Cookie プロトコル [COOKIE])のように、あるサービスで設定された情報がホストドメインの一致するグループ内の他のサービスとの通信に影響を与えることを許すものもあります。そのような拡張は、保護された接続から得られた情報が意図せず保護されていない文脈で交換されるのを防ぐために慎重に設計されるべきです。

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

"http" または "https" スキームの URI は、セクション 6 の方法に従って正規化および比較されます。上記の各スキームに対するデフォルト値を使用します([URI])。

HTTP は同値性を決定するための特定の方法の使用を要求しません。例えば、キャッシュキーは構文ベースの正規化後に単純な文字列として比較されるかもしれませんし、スキームベースの正規化後に比較されるかもしれません。

スキームベースの正規化(セクション 6.2.3 of [URI]) は "http" と "https" の URI に対して次の追加ルールを含みます:

  • ポートがスキームのデフォルトポートと等しい場合、正規形ではポートのサブコンポーネントを省略します。
  • OPTIONS リクエストのターゲットとして使用されていない場合、空のパス成分は "/" の絶対パスと同等であるため、正規形では "/" のパスを提供するのが通常です。
  • スキームとホストは大文字小文字を区別せず、通常は小文字で提供されます;その他のすべての成分は大文字小文字を区別して比較されます。
  • "reserved" セットに含まれない文字はパーセントエンコードされたオクテットと同等です:正規形ではそれらをエンコードしないことが通常です(詳細は セクション 2.1 および セクション 2.2 を参照してください)。

例えば、次の 3 つの URI は同等です:

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

正規化後に同等である 2 つの HTTP URI は同じリソースを識別すると見なすことができ、任意の HTTP コンポーネントは正規化を行うことが できる(MAY)。その結果、正規化後に(任意の方法で)同等となる HTTP URI によって異なるリソースが識別されるべきではありません(SHOULD NOT)。

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

authority の URI 汎用構文には userinfo サブコンポーネント([URI], セクション 3.2.1)が含まれ、URI にユーザー認証情報を含めることができます。そのサブコンポーネントにおける "user:password" 形式の使用は非推奨です。

一部の実装はコマンド起動オプション、設定ファイル、ブックマークリストなど、内部設定のために userinfo コンポーネントを利用することがあり、そのような使用はユーザー識別子やパスワードを露出する可能性があります。

送信者はメッセージ内でターゲット URI またはフィールド値として "http" または "https" の URI 参照を生成する際に userinfo サブコンポーネント(および "@" 区切り文字)を生成してはなりません(MUST NOT)。

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

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

フラグメント識別子は、セクション 3.5 に定義されるように、スキームに依存しない二次リソースの間接的識別を可能にします([URI])。 URI を参照する一部のプロトコル要素はフラグメントの包含を許可し、他のものは許可しません。これらはフラグメントを許可する要素の ABNF ルールの使用によって区別されます;そうでない場合はフラグメントを除外する特定のルールが使用されます。

4.3. 権威に基づくアクセス

権威に基づくアクセスとは、識別されたリソースへのアクセスのために、クライアントがそのアクセスが権威的(リソース所有者によって管理されている)であると信じる方法で与えられた識別子を逆参照することを指します。アクセスが許可されるかどうかを決定するプロセスは URI スキームによって定義され、多くの場合は汎用構文が使用される場合に authority 成分などの URI 成分内のデータを用います。しかし、権威に基づくアクセスは識別されたメカニズムに限定されません。

セクション 4.3.1 はそのような用途を助けるためにオリジンの概念を定義し、その後の小節ではピアがオリジンを代表する権限を有することをどのように確立するかを説明します。

権限を確立することに関連するセキュリティ上の考慮事項については、セクション 17.1 を参照してください。

4.3.1. URI オリジン

与えられた URI の オリジン は、スキーム、ホスト、ポートの 3 つ組であり、スキームとホストは小文字に正規化され、ポートは先頭のゼロを取り除いて正規化されます。URI からポートが省略されている場合、そのスキームのデフォルトポートが使用されます。例えば、次の URI は

   https://Example.Com/happy.js

次のオリジンを持ちます

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

これはポートが常に存在する正規化された URI プレフィックスとしても記述できます:

   https://example.com:443

各オリジンは独自の名前空間を定義し、その名前空間内の識別子がリソースにどのようにマップされるかをコントロールします。さらに、オリジンが有効なリクエストに対して一貫して応答する方法が、将来的にユーザーが URI に関連付けるセマンティクスを決定し、それらセマンティクスの有用性が最終的にユーザーが参照・アクセスするための資源へと変換されます。

オリジンはスキーム、ホスト、またはポートが異なると区別されます。同一の主体が 2 つの異なるオリジンを管理していることを検証できても、明示的にサーバーがエイリアスを設定していない限り、それらのオリジン下の 2 つの名前空間は別個です。

オリジンは HTML や関連する Web プロトコル内でも使用されますが、それは本書の範囲外であり、詳細は [RFC6454] を参照してください。

4.3.2. http オリジン

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

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

"http" URI が指定されたリソースへのアクセスを要求する文脈で使用される場合、クライアントはホスト識別子を IP アドレスに解決し、そのアドレスの示す指定ポートに TCP 接続を確立し、クライアントのターゲット URI に一致するリクエストターゲットを含む HTTP リクエストメッセージをその接続上で送信することを MAY 試みることができます(セクション 7.1)。

サーバーがそのようなリクエストに対して非暫定の HTTP レスポンスメッセージで応答する場合(セクション 15 参照)、その応答はクライアントのリクエストに対する権威ある応答と見なされます。

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

4.3.3. https オリジン

"https" スキーム(セクション 4.2.2)は、クライアントが識別されたオリジンサーバーに対して信頼できると見なす証明書に対応する秘密鍵を用いる能力に基づいて権限を関連付けます。クライアントは通常、ある信頼アンカーから伝達される信頼のチェーンに依存して証明書を信頼できるものと判断します(セクション 4.3.4)。

HTTP/1.1 以前では、クライアントは URI オリジンのホストに対して特に確立され保護された接続上で通信している場合にのみサーバーに権限を帰属させます。接続の確立と証明書の検証が権限の証明として用いられます。

HTTP/2 および HTTP/3 では、クライアントは証明書内に存在するホストのいずれかと URI オリジンのホストが一致し、かつクライアントがそのホストに対して接続を開くことができると信じる場合に、確立され保護された接続上で通信しているならばサーバーに権限を帰属させます。実際には、クライアントはオリジンのホストが確立された接続のサーバー IP アドレスと同じかどうかを確認するために DNS クエリを行うことが多いです。この制約はオリジンサーバーが等価な ORIGIN フレームを送信することで取り除くことができます([RFC8336])。

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

オリジンサーバーはオリジンに対する権限を持っていても、特定のターゲット URI に対するリクエストの処理を望まない場合があります。例えば、ホストが異なるポート(例: 443 と 8000)で異なるサービスを運用している場合、接続が保護された後でもターゲット URI のチェックが必要です。ネットワーク攻撃者があるポートへの接続を別のポートで受信させる可能性があるためです。ターゲット URI のチェックを怠ると、攻撃者があるターゲット URI(例: "https://example.com/foo")への応答を別のポート(例: "https://example.com:8000/foo")からの権威ある応答で置き換えることを許す可能性があります。

"https" スキームは権限の関連付けに TCP や接続されたポート番号を利用しません。これらは保護された通信の外側にあり、決定的とは見なせないためです。したがって、HTTP 通信は TCP を使用しないプロトコルを含め、セクション 4.2.2 で定義されるような任意の保護されたチャネル上で行われる可能性があります。

"https" URI が指定されたリソースへのアクセスを要求する文脈で使用される場合、クライアントはホスト識別子を IP アドレスに解決し、そのアドレスの示す指定ポートに TCP 接続を確立し、TCP 上で TLS を正常に開始してエンドツーエンドの機密性と完全性の保護を確保し、その接続上でクライアントのターゲット URI に一致するリクエストターゲットを含む HTTP リクエストメッセージを送信することを MAY 試みることができます(セクション 7.1)。

サーバーがそのようなリクエストに対して非暫定の HTTP レスポンスメッセージで応答する場合(セクション 15 参照)、その応答はクライアントのリクエストに対する権威ある応答と見なされます。

ただし、上記が権威ある応答を得る唯一の手段であるわけではなく、また常に権威ある応答が必要であることを意味するものでもありません([CACHING] を参照)。

4.3.4. https 証明書の検証

URI を逆参照して 保護された 接続を確立するために、クライアントはサービスの識別が URI のオリジンサーバーに対して受け入れ可能な一致であることを MUST 検証しなければなりません。証明書の検証は経路上の攻撃者や名前解決を制御する攻撃者によるサーバーのなりすましを防止するために使われます。このプロセスにはクライアントが信頼アンカーのセットで設定されていることが必要です。

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

CN-ID 型の参照識別子はクライアントによって使用してはなりません(MUST NOT)。古いクライアントでは CN-ID が使用される場合があることが セクション 6.2.1 に記されています([RFC6125])。

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

特殊な場合には、クライアントが単にサーバーの識別を無視することが適切であるかもしれませんが、その場合接続は能動的な攻撃に対して無防備であることを理解しておく必要があります。

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

4.3.5. IP-ID 参照識別子

"https" URI の "host" フィールドに IP アドレスリテラルが使用されて識別されたサーバーは IP-ID 型の参照識別子を持ちます。IPv4 アドレスは "IPv4address" ABNF ルールを使用し、IPv6 アドレスは "IP-literal" 生成の "IPv6address" オプションを使用します(詳細は セクション 3.2.2 を参照、[URI])。IP-ID 型の参照識別子は IP アドレスのデコード済みバイトを含みます。

IPv4 アドレスは 4 オクテット、IPv6 アドレスは 16 オクテットです。IP-ID の利用は他の IP バージョンについては定義されていません。証明書 subjectAltName 拡張内の iPAddress 選択肢は IP バージョンを明示的に含まないため、アドレスの長さによりバージョンを区別します(詳細は セクション 4.2.1.6 を参照、[RFC5280])。

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

5. フィールド

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

5.1. フィールド名

フィールド名は、対応するフィールド値がその名前で定義されたセマンティクスを持つことを示します。例えば、Date ヘッダフィールドは、出現するメッセージの発信タイムスタンプを含むものとして セクション 6.6.1 で定義されています。

フィールド名は大文字小文字を区別しません(case-insensitive)であり、"Hypertext Transfer Protocol (HTTP) Field Name Registry" に登録されるべきです。詳しくは セクション 16.3.1 を参照してください。

フィールドの解釈は同一メジャー版の小バージョン間で変更されませんが、そのフィールドが存在しない場合の受信者のデフォルト動作は変わることがあります。特に、Host および Connection フィールドは、HTTP/1.1 への準拠を宣言しているか否かに関わらず、すべての HTTP 実装が認識すべきです。

新しいフィールドは、その定義されたセマンティクスが認識しない受信者によって安全に無視できることを許す場合、プロトコルのバージョンを変更することなく導入できます。詳しくは セクション 16.3 を参照してください。

プロキシは未認識のヘッダフィールドを MUST 転送しなければなりません。ただし、フィールド名が Connection ヘッダフィールド(セクション 7.6.1)に列挙されている場合や、プロキシが特定にそのようなフィールドをブロックまたは変換するよう設定されている場合は例外です。他の受信者は未認識のヘッダおよびトレーラフィールドを SHOULD 無視するべきです。これらの要件を順守することで、展開済み中継ノードを更新・削除することなく HTTP の機能を拡張できます。

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

フィールドセクションは任意の数の field lines で構成され、それぞれがフィールドを識別する field nameセクション 5.1 を参照)と、そのフィールドのインスタンスに対するデータを伝達する field line value を持ちます。

あるセクション内でフィールド名が一度しか存在しない場合、そのフィールドの結合された field value は対応する field line value からなります。フィールド名がセクション内で繰り返される場合、その結合フィールド値は対応する各 field line value を順に連結したリストであり、各 field line value はコンマで区切られます。

例えば、次のセクション:

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

は 2 行のフィールド行を含んでおり、両方ともフィールド名 "Example-Field" を持ちます。最初のフィールド行の field line value は "Foo, Bar"、2 行目の field line value は "Baz" です。"Example-Field" のフィールド値は "Foo, Bar, Baz" のリストになります。

5.3. フィールド順序

受信者は、同じフィールド名を持つ複数のフィールド行を、メッセージのセマンティクスを変更することなく 1 行に結合することが MAY できます。その際は、後続の各 field line value を最初の field line value に順に追加し、コンマ (",") とオプションの空白(OWS, セクション 5.6.3参照)で区切ります。一貫性のために、コンマと SP を使用してください。

同名のフィールド行が受信される順序はフィールド値の解釈において重要です。プロキシはメッセージを転送する際にこれらフィールド行値の順序を変更してはならない(MUST NOT)ことに注意してください。

これは、以下に示すよく知られた例外を除き、送信者がメッセージ(ヘッダまたはトレーラのいずれでも)内で同じ名前の複数のフィールド行を生成したり、同名のフィールド行が既に存在するメッセージにフィールド行を追加したりしてはならない(MUST NOT)ことを意味します。ただし、そのフィールドの定義がコンマ区切りのリストとして再結合できることを許す場合(例えば ABNF ルールで #(values) のように定義される場合)は例外です(セクション 5.6.1 を参照)。

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

サーバは、後続のヘッダフィールド行に条件付き指定、認証資格情報、または意図的に誤解を招く重複ヘッダフィールドが含まれている可能性があるため、リクエストヘッダセクション全体を受信するまでターゲットリソースに対してリクエストを適用してはなりません(MUST NOT)。

5.4. フィールド制限

HTTP は各フィールド行、フィールド値、またはヘッダやトレーラのセクション全体の長さに事前定義された制限を設けていません(セクション 2 を参照)。実際には個々の長さに対するさまざまな暫定的制限が存在し、多くは特定フィールドのセマンティクスに依存します。

サーバが処理したくないほど大きなリクエストヘッダ行、フィールド値、またはフィールドの集合を受信した場合、サーバは適切な 4xx (Client Error) ステータスコードで応答しなければなりません(MUST)。このようなヘッダフィールドを無視すると、リクエストスミッギング攻撃に対するサーバの脆弱性が増大します(詳細は Section 11.2 of [HTTP/1.1])。

クライアントは、受信したフィールド行が自身が処理したくないほど大きい場合、そのフィールド行を破棄または切り詰めしてもよい(MAY)。ただし、そのフィールドのセマンティクスが、削除された値がメッセージのフレーミングや応答のセマンティクスを変更することなく安全に無視できる場合に限ります。

5.5. フィールド値

HTTP のフィールド値は、各フィールドの文法で定義された形式の文字列の列で構成されます。各フィールドの文法は通常 ABNF を用いて定義されます([RFC5234])。

フィールド値は先頭および末尾の空白を含みません。特定の HTTP バージョンでそのような空白がメッセージ内に現れることを許す場合、フィールドを解析する実装はフィールド値を評価する前にその空白を除外しなければなりません(MUST)。

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

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

値として単一のメンバーのみを想定するフィールドは singleton fields と呼ばれます。

値として複数のメンバーを許すフィールドは list-based fields と呼ばれます。リスト演算子拡張(セクション 5.6.1)は、複数メンバーを含み得るフィールド値を定義するための共通表記として使用されます。

メンバー間の区切りにコンマ (",") が使用されるため、メンバー内でコンマがデータとして許される場合は注意が必要です。これは list-based および singleton の両方に当てはまります。singleton フィールドが誤って複数メンバーで送信される可能性があり、そのような誤りを検出することで相互運用性が向上します。HTTP-date や URI-reference 要素のようにメンバー内でコンマを含むことが予想されるフィールドは、そのデータ内のコンマをリスト区切り文字と区別するために当該要素の周りに区切りを定義するべきです。

例えば、テキスト日付や URI(どちらもコンマを含む可能性がある)は、次のような list-based フィールド値で安全に運ぶことができます:

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 で定義)は、パラメータのためにトークン(無引用)と quoted-string(引用文字列)の両方を許す共通構文を使用します(セクション 5.6.6)。共通構文の使用により、受信者は既存のパーサコンポーネントを再利用できます。両方の形式を許す場合、パラメータ値の意味はトークンとして受信された場合と引用文字列として受信された場合で同じであるべきです。

5.6. フィールド値定義の共通規則

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

ABNF ルール([RFC5234])への #rule 拡張は、一部の list-based フィールド値の定義における可読性を向上させるために使用されます。

"#" 構成は "*" に類似しており、要素のコンマ区切りリストを定義するために使われます。完全な形式は "<n>#<m>element" で、少なくとも <n> 個、最大 <m> 個の要素を意味し、各要素は単一のコンマ (",") とオプションの空白(OWS, セクション 5.6.3 を参照)で区切られます。

5.6.1.1. 送信者の要件

リスト構成を使用する任意の生成規則において、送信者は空のリスト要素を生成してはなりません(MUST NOT)。言い換えれば、送信者は次の構文を満たすリストを生成する必要があります:

  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. 受信者の要件

空の要素は存在する要素数に寄与しません。受信者は、送信者の一般的な誤り(値をマージする際の誤り)を処理できる程度の合理的な数の空リスト要素を解析して無視しなければなりません(MUST)。ただし、サービス拒否のメカニズムとして利用されない程度に限定する必要があります。言い換えれば、受信者は次の構文を満たすリストを受け入れなければなりません:

  #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 生成規則は少なくとも 1 つの非空要素を要求するからです:

  ""
  ","
  ",   ,"

5.6.2. トークン

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

  token          = 1*tchar

  tchar          = "!" / "#" / "$" / "%" / "&" / "'" / "*"
                 / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~"
                 / DIGIT / ALPHA
                 ; any VCHAR, except delimiters

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

5.6.3. 空白

本仕様は線形空白の使用を示すために 3 つのルールを使用します:OWS(optional whitespace)、RWS(required whitespace)、および BWS("bad" whitespace)。

OWS ルールは 0 個以上の線形空白オクテットが現れる可能性がある箇所で使用されます。可読性を向上させるためにオプション空白が好まれるプロトコル要素では、送信者はオプション空白を単一の SP として生成することが SHOULD 推奨されます;それ以外の場合、送信者は不正または望ましくないプロトコル要素をインプレースでフィルタする際に必要となる場合を除きオプション空白を生成すべきではありません(SHOULD NOT)。

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

OWS と RWS は単一の SP と同じセマンティクスを持ちます。OWS または RWS として定義されている内容は、解釈前または下流へ転送する前に単一の SP に置き換えることが MAY できます。

BWS ルールは文法が歴史的理由でのみオプション空白を許す箇所で使用されます。送信者はメッセージ内で BWS を生成してはなりません(MUST NOT)。受信者はそのような悪い空白を解析して、プロトコル要素を解釈する前にそれを削除しなければなりません(MUST)。

BWS には意味はありません。BWS と定義される内容は解釈前または下流へ転送する前に削除してもよい(MAY)です。

  OWS            = *( SP / HTAB )
                 ; optional whitespace
  RWS            = 1*( SP / HTAB )
                 ; required whitespace
  BWS            = OWS
                 ; "bad" whitespace

5.6.4. 引用文字列(Quoted Strings)

ダブルクォートで囲まれたテキストは、単一の値として解析されます。

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

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

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

送信者は、quoted-string 内で DQUOTE とバックスラッシュのオクテットを引用する場合を除き、quoted-pair を生成すべきではありません(SHOULD NOT)。コメント内でも同様に、括弧 ["(" と ")"] とバックスラッシュのオクテットを引用する場合を除き 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)で見られます。

parameter-value が token 生成規則に一致する場合、その値は token としてまたは quoted-string 内で送信できます。引用あり/なしの値は等価です。

5.6.7. 日付/時刻フォーマット

1995 年以前、サーバがタイムスタンプを伝達するために一般的に使用していた形式が 3 種類ありました。古い実装との互換性のため、ここではその 3 つをすべて定義します。優先される形式は、Internet Message Format([RFC5322])で使用される日付時刻の仕様の固定長かつ単一ゾーンの部分集合です。

優先形式の例:

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

二つの廃止形式の例:

Sunday, 06-Nov-94 08:49:37 GMT   ; obsolete RFC 850 format
Sun Nov  6 08:49:37 1994         ; ANSI C's asctime() format

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

HTTP-date 値は協定世界時(UTC)の時刻を表します。最初の2 つの形式は "GMT" という 3 文字の略語で UTC を示します;asctime 形式の値も UTC とみなされます。

clock とは、UTC の現在時刻の合理的な近似を提供できる実装を指します。clock 実装は NTP([RFC5905])や同様のプロトコルを使用して UTC と同期することが望ましいです。

優先形式:

  IMF-fixdate  = day-name "," SP date1 SP time-of-day SP GMT
  ; fixed length/zone/capitalization subset of the format
  ; see Section 3.3 of [RFC5322]

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

  date1        = day SP month SP year
               ; e.g., 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 (leap second)

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

廃止形式:

  rfc850-date  = day-name-l "," SP date2 SP time-of-day SP GMT
  date2        = day "-" month "-" 2DIGIT
               ; e.g., 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 に追加の空白を生成してはなりません(MUST NOT)。day-namedaymonthyear、および time-of-day のセマンティクスは、対応する名前を持つ Internet Message Format の構成と同じです([RFC5322]Section 3.3 参照)。

2 桁の年を使用する rfc850-date 形式のタイムスタンプ値を受信した受信者は、そのタイムスタンプが 50 年以上未来に見える場合、それと同じ下 2 桁を持つ最も最近の過去の年を表すものとして解釈しなければなりません(MUST)。

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

6. メッセージ抽象化

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

message は次の要素から構成されます:

  • メッセージを記述しルーティングするための制御データ、
  • 送信者、メッセージ、コンテンツ、またはコンテキストに関する追加情報を伝達するための名前/値ペアのヘッダ参照テーブル、
  • 潜在的に無制限の長さを持つコンテンツのストリーム、および
  • コンテンツ送信中に取得された情報を伝えるための名前/値ペアのトレーラ参照テーブル。

フレーミングと制御データが最初に送られ、その後ヘッダテーブルのフィールドを含むヘッダセクションが続きます。メッセージにコンテンツが含まれる場合、コンテンツはヘッダセクションの後に送られ、その後にトレーラセクションが続き、トレーラーテーブル用のフィールドを含むことがあります。

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

メッセージは 自己記述的(self-descriptive) であることが意図されています:受信者がメッセージについて知る必要のあるすべては、圧縮されたり転送中に省略された部分をデコードまたは復元した後にメッセージ自体を見れば判定でき、送信者の現在のアプリケーション状態(以前のメッセージで確立されたもの)を理解することを必要としません。ただし、クライアントは対応するレスポンスを解析、解釈、またはキャッシュする際にリクエストの知識を保持していることが MUST です。例えば、HEAD メソッドへの応答は GET への応答の先頭部分と同じように見えますが、同じ方法で解析することはできません。

このメッセージ抽象化は多くの HTTP バージョンにまたがる一般化であり、一部のバージョンで見られない機能を含むことがあります。例えば、トレーラは HTTP/1.1 の chunked transfer coding 内でコンテンツの後にあるトレーラセクションとして導入されました。同等の機能は各ストリームを終了するヘッダブロック内に HTTP/2 および HTTP/3 にも存在します。

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

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

HTTP/0.9 および初期の HTTP/1.0 の導入では、応答を終了するために基盤となる接続のクローズが使われていました。下位互換性のため、この暗黙のフレーミングは HTTP/1.1 においても許容されます。しかし暗黙のフレーミングは、接続が早期に切断された場合に不完全な応答を区別できないことがあります。したがって、ほとんどの現代実装はメッセージデータの長さを明示的に区切る形式の明示的フレーミングを使用します。

メッセージはそのフレーミングで示されたすべてのオクテットが利用可能なときに complete と見なされます。明示的なフレーミングが使用されていない場合、基盤となる接続のクローズで終了する応答メッセージは、トランスポート層のエラーが不完全であることを示さない限り、不完全な応答と区別できなくても complete と見なされます。

6.2. 制御データ

メッセージはその主要な目的を記述する制御データで始まります。リクエストメッセージの制御データにはリクエストメソッド(セクション 9)、リクエストターゲット(セクション 7.1)、およびプロトコルバージョン(セクション 2.5)が含まれます。レスポンスメッセージの制御データにはステータスコード(セクション 15)、省略可能な reason phrase、およびプロトコルバージョンが含まれます。

HTTP/1.1(およびそれ以前)では、制御データはメッセージの最初の行として送信されます。HTTP/2 および HTTP/3 では、制御データは予約された名前プレフィックス(例: ":authority")を持つ疑似ヘッダーフィールドとして送信されます。

すべての HTTP メッセージはプロトコルバージョンを持ちます。使用中のバージョンに応じて、それはメッセージ内で明示的に識別されるか、あるいはメッセージが受信される接続によって推測されることがあります。受信者はそのバージョン情報を用いて、送信者との後続通信における制限や可能性を判断します。

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

クライアントは、クライアントが準拠している最高バージョンでかつ既知であればサーバがサポートする最高バージョンのメジャーバージョンを超えないものと同等のリクエストバージョンを送信することが SHOULD です。クライアントは自身が準拠していないバージョンを送信してはなりません(MUST NOT)。

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

サーバは、受信したリクエストと同じかそれより大きなメジャーバージョンで、サーバが準拠している最高のバージョンのレスポンスを送信することが SHOULD です。サーバは自身が準拠していないバージョンを送信してはなりません(MUST NOT)。サーバは任意の理由でクライアントのメジャープロトコルバージョンのサービスを拒否したい場合、505 (HTTP Version Not Supported) を送信できます。

実装しているメジャーバージョン番号を持ち、実装しているマイナーバージョン番号より高いマイナーバージョン番号を含むメッセージを受信した受信者は、そのメッセージを受信者が準拠する同一メジャー内の最高のマイナーバージョンのように処理することが SHOULD です。受信者は、まだその高いバージョンのサポートを示していない受信者に送られた高いマイナーバージョンを持つメッセージは、同一メジャーの任意の実装で安全に処理できるほど後方互換性があると仮定できます。

6.3. ヘッダフィールド

コンテンツの前に送受信される Fields(セクション 5)は「ヘッダフィールド」(または口語的に「ヘッダ」)と呼ばれます。

メッセージの header section は一連のヘッダフィールド行で構成されます。各ヘッダフィールドはメッセージのセマンティクスを変更・拡張したり、送信者を記述したり、コンテンツを定義したり、追加の文脈を提供したりすることがあります。

6.4. コンテンツ

HTTP メッセージはしばしばメッセージの content として完全または部分的な表現を転送します:これはヘッダセクションの後にフレーミングで区切られたオクテットのストリームです。

この抽象的なコンテンツ定義は、メッセージフレーミングから抽出された後のデータを反映します。例えば、HTTP/1.1 のメッセージボディは(chunked transfer coding による)データチャンクのシーケンス、長さ 0 のチャンク、およびトレーラセクションで構成されるかもしれませんが、その同じメッセージの content はトランスファーコーディングがデコードされた後のデータストリームのみを含み、チャンク長やチャンクフレーミング構文、トレーラフィールドは含みません(セクション 6.5参照)。

6.4.1. コンテンツの意味

リクエストにおけるコンテンツの目的はメソッドのセマンティクスによって定義されます(セクション 9)。

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

レスポンスでは、コンテンツの目的はリクエストメソッド、レスポンスのステータスコード(セクション 15)、およびそのコンテンツを記述するレスポンスフィールドによって定義されます。例えば、GET に対する 200 (OK) レスポンスのコンテンツは、メッセージ発信時点(セクション 6.6.1)に観測された target resource の現在の状態を表します。一方で POST に対する同じステータスコードのレスポンスのコンテンツは、処理結果または処理適用後のターゲットリソースの新しい状態を表すかもしれません。

GET に対する 206 (Partial Content) レスポンスのコンテンツは、選択された表現の単一部分またはその表現の複数部分を含むマルチパートメッセージボディのいずれかを含みます(セクション 15.3.7 を参照)。

エラーのステータスコードを持つレスポンスは通常、エラー状態を表すコンテンツを含み、そのコンテンツはエラー状態を説明し、解決のために推奨される手順を示します。

HEAD リクエストメソッド(セクション 9.3.2)へのレスポンスは決してコンテンツを含みません;関連するレスポンスヘッダーフィールドは、その値が GET リクエストに対する場合にどのようになるかのみを示します(セクション 9.3.1)。

CONNECT リクエストメソッドへの 2xx (Successful) レスポンスは、コンテンツを持つ代わりに接続をトンネルモードに切り替えます(セクション 9.3.6)。

すべての 1xx (Informational)、204 (No Content)、および 304 (Not Modified) のレスポンスはコンテンツを含みません。

その他すべてのレスポンスはコンテンツを含みますが、そのコンテンツは長さ 0 の場合があります。

6.4.2. コンテンツの識別

完全または部分的な表現がメッセージコンテンツとして転送される場合、送信者が識別子を供給したり、受信者がその特定の表現に対応するリソースの識別子を決定したりすることが望ましい場合があります。例えば、クライアントが「現在の天気報告」のリソースに対して GET リクエストを行うと、返されたコンテンツに特有の識別子(例: "weather report for Laguna Beach at 20210720T1711")を欲することがあります。これは、時間とともに表現が変化することが予想されるリソースからのコンテンツを共有またはブックマークする際に有用です。

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

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

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

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

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

トレーラセクション内に位置する Fields(セクション 5)は「trailer fields」(または口語的に「trailers」)と呼ばれます。トレーラフィールドは、メッセージ整合性チェック、デジタル署名、配信指標、または後処理のステータス情報を供給するのに役立ちます。

トレーラフィールドは、ヘッダセクション内のフィールドと矛盾しないように、ヘッダとは別に処理および保存されるべきです。特定のヘッダフィールドの存在や不在は、トレーラ受信前にメッセージ全体のルーティングや処理の選択に影響を及ぼす可能性があり、そのような選択は後にトレーラフィールドが発見されても取り消すことはできません。

6.5.1. トレーラ使用の制限

トレーラセクションは、使用中の HTTP バージョンがそれをサポートし、明示的なフレーミング機構によって有効化されている場合にのみ可能です。例えば、HTTP/1.1 の chunked transfer coding はコンテンツの後にトレーラセクションを送信することを許します(Section 7.1.2 of [HTTP/1.1])。

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

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

リクエストの TE ヘッダーフィールドに "trailers" キーワードが含まれていることは、クライアントが自身および下流のクライアントに代わってトレーラフィールドを受け入れる意思があることを示します。仲介者からのリクエストの場合、これはすべての下流クライアントが転送されたレスポンス内のトレーラフィールドを受け入れる意思があることを意味します。ただし "trailers" の存在が、クライアント群がレスポンス内の特定のトレーラフィールドを処理することを意味するわけではありません;単にトレーラセクションがクライアントのいずれかによって破棄されないことを示すのみです。

トレーラフィールドが転送中に破棄される可能性があるため、サーバはユーザーエージェントが受信することが必要だと考えるトレーラフィールドを生成すべきではありません(SHOULD NOT)。

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

"Trailer" ヘッダーフィールド(セクション 6.6.2)は、送信者がメッセージ内のトレーラフィールドとして送ることを予想するフィールド名のリストを示すために送信できます。これにより受信者はコンテンツを処理する前に示されたメタデータの受信に備えることができます。例えば、動的チェックサムがコンテンツ受信中に計算され、トレーラフィールド値の受信時に直ちに検査されることを示す場合に有用です。

ヘッダフィールドと同様に、同じ名前を持つトレーラフィールドは受信順に処理されます;同名の複数のトレーラフィールド行は複数の値をメンバーのリストとして付加することと同等のセマンティクスを持ちます。メッセージ中に複数回生成され得るトレーラフィールドは、各メンバー値が各受信フィールド行ごとに一度だけ処理される場合でも、リストベースのフィールドとして定義されなければなりません(MUST)。

メッセージの終わりに、受信者は受信したトレーラフィールドの集合をヘッダフィールドと類似した名前/値ペアのデータ構造として扱うことが MAY です(ただしヘッダとは別)。トレーラで使用されることを意図したフィールドのフィールド仕様内で、追加の処理期待が定義され得ます。

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

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

6.6.1. Date

"Date" ヘッダーフィールドはメッセージが発信された日時を表し、Internet Message Format の Origination Date Field(orig-date)と同じセマンティクスを持ちます。フィールド値は セクション 5.6.7 で定義された HTTP-date です。

例:

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

Date ヘッダーフィールドを生成する送信者は、そのフィールド値をメッセージ生成時の日時の最良の近似として生成することが SHOULD です。理論上、日付はメッセージコンテンツ生成直前の時点を表すべきですが、実務上は送信者はメッセージ起点時の任意の時点で日付値を生成できます。

時計(セクション 5.6.7 で定義)を持つオリジンサーバは、すべての 2xx (Successful)、3xx (Redirection)、および 4xx (Client Error) のレスポンスで Date ヘッダーフィールドを生成しなければなりません(MUST)。また 1xx (Informational) と 5xx (Server Error) のレスポンスでは Date を生成してもよい(MAY)です。

時計を持たないオリジンサーバは Date ヘッダーフィールドを生成してはなりません(MUST NOT)。

時計を持つ受信者が Date ヘッダーフィールドを欠くレスポンスメッセージを受信した場合、受信時刻を記録し、そのメッセージをキャッシュまたは下流へ転送する場合は対応する Date ヘッダーフィールドをヘッダセクションに付加しなければなりません(MUST)。

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

ユーザーエージェントはリクエストに Date ヘッダーフィールドを送信してもよい(MAY)が、一般にはサーバにとって有用な情報を伝えると考えられない限り送信しません。例えば、カスタムな HTTP の用途でユーザーエージェントとサーバの時計差に基づいてサーバがリクエストの解釈を調整することが期待される場合などに Date を伝えることがあります。

6.6.2. Trailer

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

例えば、送信者がコンテンツをストリーミングしながら署名を計算し、最終的な署名をトレーラフィールドとして提供することを示すかもしれません。これにより受信者はコンテンツを受信しながら同じ検査を行うことができます。

メッセージで1つ以上のトレーラフィールドを生成する意図がある送信者は、どのフィールドがトレーラに存在する可能性があるかを示すために、そのメッセージのヘッダセクションに Trailer ヘッダーフィールドを生成することが SHOULD です。

仲介者が転送中にトレーラセクションを破棄した場合、Trailer フィールドは失われた可能性のあるメタデータのヒントを提供することがありますが、Trailer を送信する送信者が常に指定されたフィールドを送信するとは保証されません。

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

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

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

HTTP はさまざまな用途で使用されますが、多くのクライアントは一般的な Web ブラウザと同じリソース識別機構や設定手法に依存しています。通信オプションがクライアントの設定でハードコードされている場合でも、それらの結合効果を URI 参照(セクション 4.1)として考えることができます。

URI 参照は絶対形に解決されて target URI が得られます。ターゲット URI は参照のフラグメント成分(存在する場合)を除外します。フラグメント識別子はクライアント側の処理に予約されているためです([URI], Section 3.5)。

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

request target 成分がメソッド固有の形式になる、2 つの特殊な場合があります:

  • CONNECT(セクション 9.3.6)では、request target はトンネル宛先のホスト名とポート番号をコロンで区切った形式です。
  • OPTIONS(セクション 9.3.7)では、request target は単一のアスタリスク ("*") になり得ます。

詳細は各メソッドの定義を参照してください。これらの形式は他のメソッドでは使用してはなりません(MUST NOT)。

クライアントのリクエストを受け取ると、サーバは受信した成分とそのローカル設定および着信接続のコンテキストに従ってターゲット URI を再構成します。この再構成は各メジャープロトコルバージョンに固有です。例えば、Section 3.3 of [HTTP/1.1] は、HTTP/1.1 リクエストのターゲット URI をサーバがどのように決定するかを定義しています。

7.2. Host と :authority

リクエストの "Host" ヘッダーフィールドは target URI のホストとポート情報を提供し、オリジンサーバが複数のホスト名に対するリクエストを扱う際にリソースを区別できるようにします。

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

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

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

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

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

ホストとポート情報はアプリケーションレベルのルーティング機構として機能するため、共有キャッシュを汚染したりリクエストを意図しないサーバへリダイレクトしたりしようとするマルウェアの標的になりやすいです。インターセプト型プロキシは、着信接続がそのホストに対して有効な IP アドレスをターゲットにしていることを確認する前にホストとポート情報を内部サーバへのリダイレクトや共有キャッシュのキャッシュキーとして利用すると特に脆弱です。

7.3. 着信リクエストのルーティング

ターゲット URI とそのオリジンが決定されたら、クライアントは望ましいセマンティクスを達成するためにネットワークリクエストが必要かどうかを判断し、必要であればそのリクエストをどこへ送るかを決定します。

7.3.1. キャッシュへ

クライアントがキャッシュ([CACHING])を持ち、リクエストがそれで満たせる場合、通常はまずキャッシュへリクエストを向けます。

7.3.2. プロキシへ

リクエストがキャッシュで満たされない場合、典型的なクライアントはリクエストを満たすためにプロキシを使うかどうかを設定を確認します。プロキシ設定は実装依存ですが、URI プレフィックスのマッチング、選択的な authority マッチング、またはその両方に基づくことが多く、プロキシ自体は通常 "http" または "https" URI で識別されます。

"http" または "https" プロキシが適用される場合、クライアントはそのプロキシへ接続を確立(または再利用)し、クライアントの target URI に一致する request target を含む HTTP リクエストメッセージを送信します。

7.3.3. オリジンへ

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

セクション 4.3.2 は、特定されたオリジンサーバへ接続を確立(または再利用)し、そのサーバへクライアントの target URI に一致する request target を含む HTTP リクエストメッセージを送信することで "http" リソースへアクセスする方法を定義しています。

セクション 4.3.3 は、特定されたオリジンに対して権威を持つオリジンサーバへセキュアな接続を確立(または再利用)し、そのサーバへクライアントの target URI に一致する request target を含む HTTP リクエストメッセージを送信することで "https" リソースへアクセスする方法を定義しています。

7.4. 誤配信リクエストの拒否

リクエストがサーバに到達してターゲット URI を判定できる程度に解析されると、サーバはそのリクエストを自身で処理するか他のサーバへ転送するか、クライアントを別のリソースへリダイレクトするか、エラーで応答するか、接続を切断するかを決定します。この決定はリクエストや接続コンテキストに関する任意の情報によって影響を受け得ますが、特にサーバがそのターゲット URI に対するリクエストを処理するよう設定されているかどうか、および接続コンテキストがそのリクエストに適切かどうかに焦点が当たります。

例えば、受信した Host ヘッダーフィールド内の情報が接続のホストやポートと異なる場合、故意か偶然かにかかわらずリクエストが誤配信されている可能性があります。接続が信頼されたゲートウェイからのものであればその不一致は予期されることもありますが、そうでなければセキュリティフィルタを回避しようとする試みや非公開コンテンツの配信を騙す試み、あるいはキャッシュ汚染を示しているかもしれません。メッセージルーティングに関するセキュリティ考慮事項については セクション 17 を参照してください。

接続が信頼されたゲートウェイからのものでない限り、オリジンサーバはターゲット URI に関するスキーム固有の要件が満たされていない場合はリクエストを拒否しなければなりません(MUST)。特に、"https" リソースへのリクエストは、そのターゲット URI のオリジンに対して有効な証明書でセキュアに保護された接続上で受信されていない限り拒否されなければなりません(セクション 4.2.2 で定義される通り)。

レスポンスにおける 421 (Misdirected Request) ステータスコードは、オリジンサーバがリクエストを誤配信されたとみなして拒否したことを示します(セクション 15.5.20)。

7.5. レスポンスの相関付け

1 つの接続が複数のリクエスト/レスポンス交換に使われることがあります。リクエストとレスポンスを相関付けるための機構はバージョン依存です;あるバージョンではメッセージの暗黙の順序付けを使い、他のバージョンでは明示的な識別子を使います。

すべてのレスポンスは、ステータスコードに関わらず(interim レスポンスを含む)リクエスト受信後いつでも送信され得ます。たとえリクエストがまだ完了していなくてもレスポンスが先に完了することがあります(セクション 6.1)。同様に、クライアントはレスポンスを受け取るために特定の時間を待つことを期待されていません。クライアント(仲介者を含む)は、合理的な期間内にレスポンスが得られない場合にリクエストを放棄することがあります。

対応するリクエストを送信中にレスポンスを受け取ったクライアントは、明示的な指示がない限りそのリクエストの送信を続けることが SHOULD です(例: Section 9.5 of [HTTP/1.1]Section 6.4 of [HTTP/2] を参照)。

7.6. メッセージ転送

セクション 3.7 に記載のとおり、仲介者は HTTP リクエストおよびレスポンスの処理においてさまざまな役割を果たします。ある仲介者はパフォーマンスや可用性を向上させるために使われ、他はアクセス制御やコンテンツフィルタに用いられます。HTTP ストリームはパイプ・アンド・フィルタのアーキテクチャに類似した特性を持つため、仲介者がストリームのいずれの方向にも機能を付加(または妨害)することに本質的な制限はありません。

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

トンネルとして動作していない仲介者は、Connection ヘッダーフィールドを実装しなければなりません(セクション 7.6.1 参照)。また、受信接続専用のフィールドは転送時に除外する必要があります。

仲介者は無限リクエストループから保護されていない限り、自分自身へメッセージを転送してはなりません(MUST NOT)。一般に、仲介者は自身のサーバ名(エイリアス、ローカル変種、リテラル IP アドレスを含む)を認識し、そのようなリクエストには直接応答すべきです。

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

7.6.1. Connection

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

Connection オプションは大文字小文字を区別しません。

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

仲介者は受信した Connection ヘッダーフィールドを転送前に解析し、このフィールド内の各 connection-option に対して、その connection-option と同名のヘッダまたはトレーラフィールドをメッセージから削除し、次に Connection ヘッダーフィールド自体を削除する(または転送メッセージのために仲介者自身の制御オプションで置換する)必要があります(MUST)。

したがって、Connection ヘッダーフィールドは即時の受信者("hop-by-hop")のためだけに意図されたフィールドとチェーン上のすべての受信者("end-to-end")のためのフィールドを宣言的に区別する手段を提供し、メッセージを自己記述的にし、将来の接続固有の拡張を古い仲介者が盲目的に転送してしまうことを防ぎます。

さらに、仲介者は connection-option に現れているかどうかにかかわらず、転送前に削除が必要であることが判明しているフィールドを削除または置換すべきです(SHOULD)。これには以下が含まれますが、これらに限定されません:

送信者は、コンテンツのすべての受信者に対して意図されているフィールドに対応する connection option を送信してはなりません(MUST NOT)。例えば、Cache-Control は connection option として適切ではありません(Section 5.2 of [CACHING])。

Connection オプションは、そのオプションに関連するパラメータがない場合はメッセージ内に対応するフィールドが存在しないことがあります。対照的に、対応する 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 進整数です。

TRACE または OPTIONS リクエストで Max-Forwards ヘッダーフィールドを含むメッセージを受信した各仲介者は、転送前にその値を検査および更新しなければなりません(MUST)。受信値がゼロ (0) の場合、仲介者はリクエストを転送してはならず(MUST NOT)、その代わり仲介者自身が最終受信者として応答しなければなりません(MUST)。受信した Max-Forwards 値がゼロより大きい場合、仲介者は転送されたメッセージに対して、a) 受信値を 1 減じたもの、または b) 受信者がサポートする Max-Forwards の最大値、のいずれか小さい方の値をフィールド値として持つ更新済みの Max-Forwards フィールドを生成しなければなりません(MUST)。

受信者はその他のメソッドに対して受信した Max-Forwards ヘッダーフィールドを無視してもよい(MAY)です。

7.6.3. Via

"Via" ヘッダーフィールドは、ユーザーエージェントとサーバの間(リクエストの場合)またはオリジンサーバとクライアントの間(レスポンスの場合)に存在する中間プロトコルおよび受信者を示します。これは電子メールにおける "Received" ヘッダーフィールドに類似しています(Section 3.6.7 of [RFC5322])。Via はメッセージ転送の追跡、リクエストループの回避、チェーン上の送信者のプロトコル機能の識別に利用できます。

Via フィールド値の各メンバはメッセージを転送したプロキシやゲートウェイを表します。各仲介者はメッセージをどのように受け取ったかに関する自身の情報を追記するため、最終的な値は転送受信者の順序に従って並びます。

プロキシは転送する各メッセージに対して適切な Via ヘッダーフィールドを送信しなければなりません(MUST)。HTTP→HTTP のゲートウェイは受信リクエストメッセージごとに適切な Via を送信しなければならず(MUST)、転送されたレスポンスメッセージには Via を送信してもよい(MAY)です。

各仲介者について、received-protocol はメッセージの上流送信者が使用したプロトコルとバージョンを示します。したがって Via フィールド値はリクエスト/レスポンスチェーンの広告されたプロトコル能力を記録し、下流の受信者が利用可能な後方互換性のない機能を判定するのに役立ちます。簡潔さのため、received-protocol が HTTP の場合は protocol-name を省略します。

received-by 部分は通常、その後メッセージを転送した受信サーバまたはクライアントのホストと任意のポート番号です。ただし、実際のホストが機密情報と見なされる場合、送信者はそれを pseudonym に置き換えてもよい(MAY)。ポートが提供されていない場合、受信者はそれが受信プロトコルの既定ポートで受信されたことを意味すると解釈してもよい(MAY)。

送信者は各受信者のソフトウェアを識別するコメントを生成してもよい(MAY)。これは User-AgentServer ヘッダーフィールドに類似します。ただし Via のコメントは任意であり、受信者は転送前にそれらを削除してもよい(MAY)。

例えば、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

ネットワークファイアウォールを通じたポータルとして用いられる仲介者は、ファイアウォール領域内のホストの名前やポートを転送してはなりません(SHOULD NOT)。もし有効化されていない場合、そのような仲介者は受信した任意の behind-the-firewall ホストの received-by を適切な pseudonym に置き換えるべきです(SHOULD)。

仲介者は、received-protocol 値が同一であるリストメンバの順序付き部分列を単一のメンバに結合してもよい(MAY)。例えば、

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

は次のように折りたたむことができます:

Via: 1.0 ricky, 1.1 mertz, 1.0 lucy

送信者は複数のリストメンバーを結合するべきではありません(SHOULD NOT)、ただしそれらがすべて同一組織の管理下にありホストがすでに pseudonym に置き換えられている場合は例外です。異なる received-protocol 値を持つメンバーを結合してはなりません(MUST NOT)。

7.7. メッセージ変換

一部の仲介者はメッセージやそのコンテンツを変換する機能を含みます。例えば、プロキシはキャッシュ節約や遅い回線上のトラフィック削減のために画像形式を変換することがあります。しかしこれらの変換が医療画像や科学データ解析のような重要な用途向けコンテンツに適用されると、整合性チェックやデジタル署名で受信コンテンツが元と同一であることを保証している場合に運用上の問題が生じる可能性があります。

HTTP→HTTP プロキシがメッセージを意味的に変更するよう設計または設定されている場合、それは transforming proxy と呼ばれます(すなわち通常の HTTP 処理で必要とされるものを超えて、元の送信者や下流の受信者にとって重要となる変更を行う)。例えば、変換プロキシは共有注釈サーバ(レスポンスをローカル注釈データベースへの参照を含むように変更する)、マルウェアフィルタ、フォーマット変換器、プライバシーフィルタとして動作することがあります。そのような変換はプロキシを選択したクライアント(またはクライアント組織)が望んでいると推定されます。

プロキシがホスト名を完全修飾ドメイン名で持たないターゲット URI を受け取った場合、転送時に自身のドメインを受け取ったホスト名へ追加してもよい(MAY)。ターゲット URI に完全修飾ドメイン名が含まれている場合、プロキシはホスト名を変更してはなりません(MUST NOT)。

プロキシは、転送先の次のインバウンドサーバへ転送する際に、受信したターゲット URI の "absolute-path" および "query" 部分を、当該転送プロトコルで要求される場合を除き変更してはなりません。例えば、HTTP/1.1 経由でオリジンサーバへリクエストを転送するプロキシは、空のパスを "/"(Section 3.2.1 of [HTTP/1.1])や "*"(Section 3.2.4 of [HTTP/1.1])に置き換えるなど、リクエストメソッドに依存する変更を行うことがあります。

プロキシは no-transform キャッシュディレクティブを含むレスポンスのコンテンツ(セクション 6.4)を変換してはなりません(Section 5.2.2.6 of [CACHING])。ただし、これは転送コーディングの追加や削除のようにコンテンツ自体を変更しないメッセージ変換には適用されません(Section 7 of [HTTP/1.1] を参照)。

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

プロキシは通信チェーンの端点、リソース状態、または(コンテンツ以外の)selected representation に関する情報を提供するヘッダーフィールドを、当該フィールドの定義がその変更を明示的に許す場合やプライバシやセキュリティのために変更が必要と判断される場合を除き、変更してはなりません(SHOULD NOT)。

7.8. Upgrade

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

クライアントはリクエストの Upgrade ヘッダーフィールドにプロトコル名のリストを送信して、サーバに対して優先度の降順で名前付きプロトコルのいずれかへ切り替えるよう招待することができます(MAY)。サーバは接続上で現在のプロトコルを使い続けたい場合、受信した Upgrade ヘッダーフィールドを無視してもよい(MAY)。Upgrade はプロトコル変更を強制するために使用できません。

プロトコル名には推奨の大文字小文字の表記がありますが、受信者は各 protocol-name を照合する際に大文字小文字を区別しない比較を行うべきです(SHOULD)。

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

サーバが 426 (Upgrade Required) レスポンスを送る場合、許容されるプロトコルを優先度の降順で示す Upgrade ヘッダーフィールドを送らなければなりません(MUST)。

サーバは将来のリクエストに対してアップグレードをサポートする旨を知らせるために、他の任意のレスポンスでも Upgrade ヘッダーフィールドを送信してよい(MAY)。

次はクライアントが送信する仮想的な例です:

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

プロトコル変更後のアプリケーションレベル通信の機能や性質は選択された新しいプロトコルに完全に依存します。ただし、101 (Switching Protocols) レスポンスを送信した直後、サーバは新しいプロトコル内で当該リクエストに相当する処理を続けると期待されます(つまり、プロトコル変更後もサーバは未解決のリクエストに対する応答を行う責任があり、リクエストの再送を要求してはなりません)。

例えば、GET リクエストで Upgrade を受け取りサーバがプロトコルを切り替えることにした場合、サーバはまず HTTP/1.1 で 101 (Switching Protocols) を返し、その直後に新しいプロトコルでの GET に相当するレスポンスを送ります。これにより追加の往復なしで接続を HTTP と同等の意味を持つプロトコルへアップグレードできます。サーバは受信メッセージのセマンティクスが新しいプロトコルで満たせる場合にのみプロトコルを切り替えるべきです(MUST NOT);OPTIONS はどのプロトコルでも尊重可能です。

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

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

[... data stream switches to websocket with an appropriate response
(as defined by new protocol) to the "GET /hello" request ...]

Upgrade を送信する送信者は、仲介者にこのフィールドを転送しないよう通知するために Connection ヘッダーフィールドに "Upgrade" の接続オプションも送らなければなりません(セクション 7.6.1)。HTTP/1.0 リクエストで Upgrade ヘッダーフィールドを受け取ったサーバは、その Upgrade フィールドを無視しなければなりません(MUST)。

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

Upgrade ヘッダーフィールドは既存の接続上でのプロトコル切替にのみ適用されます;基盤となる接続(トランスポート)プロトコルを切り替えたり別の接続へ切り替えたりするために使用できません。その場合は 3xx (Redirection) レスポンスを使用する方が適切です(セクション 15.4)。

本仕様は "HTTP" というプロトコル名のみを、プロトコルバージョンの規則(セクション 2.5)に従って HTTP ファミリで使用するために定義します。追加のプロトコル名は セクション 16.7 で定義された登録手順を用いて登録されるべきです。

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

8.1. 表現データ

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

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

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

8.2. 表現メタデータ

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

8.3. Content-Type

"Content-Type" ヘッダーフィールドは関連する表現のメディアタイプを示します:それはメッセージのコンテンツに囲まれた表現、またはメッセージセマンティクスによって決定される selected representation のいずれかです。示されたメディアタイプは、データ形式と、そのデータが受信されたメッセージセマンティクスの範囲内で受信者によってどのように処理されることを意図しているかを定義します(Content-Encoding によって示された任意のコンテンツコーディングがデコードされた後に適用されます)。

Media types は セクション 8.3.1 で定義されています。フィールドの例は次のとおりです

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

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

実務では、リソース所有者がオリジンサーバを適切に設定して、与えられた表現に対して正しい Content-Type を提供していないことがあります。一部のユーザーエージェントはコンテンツを調べて、場合によっては受信した型を上書きすることがあります(例えば [Sniffing] を参照)。この「MIME sniffing」はデータについて間違った結論を導く危険があり、ユーザーを追加のセキュリティリスク(例えば「特権エスカレーション」)にさらす可能性があります。さらに、異なるメディアタイプが同じデータ形式を共有し、処理の意図だけが異なる場合があり、データの検査だけで区別することは不可能です。スニッフィングを実装する場合、実装者はユーザーがそれを無効にできる手段を提供することが望まれます。

Content-Type は単一フィールドとして定義されていますが、時に誤って複数回生成され、リストのように見える結合フィールド値が生成されることがあります。受信者はしばしばこのエラーを扱うためにリストの最後の構文的に有効な要素を使用しようとし、その結果、実装毎に異なるエラーハンドリングの振る舞いがあると相互運用性やセキュリティの問題が生じる可能性があります。

8.3.1. メディアタイプ

HTTP は [RFC2046] のメディアタイプを Content-Type および Accept ヘッダーフィールドで使用し、オープンで拡張可能なデータ型付けと型交渉を提供します。メディアタイプはデータ形式と様々な処理モデルを定義します:メッセージコンテキストに従ってそのデータをどのように処理するかです。

type と subtype のトークンは大文字小文字を区別しません。

type/subtype の後にセミコロン区切りのパラメータ(セクション 5.6.6)が続くことが MAY あります。パラメータの有無は、メディアタイプレジストリ内での定義によってメディアタイプの処理に重要となる場合があります。パラメータ値の大文字小文字の敏感性は、パラメータ名のセマンティクスに依存します。

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

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

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

8.3.2. Charset

HTTP は charset 名を使用して、テキスト表現の文字エンコーディングスキームを示したり交渉したりします([RFC6365])。この文書で定義されたフィールドでは、charset 名はパラメータ(Content-Type)の中や、また Accept-Encoding のように平文の token として現れます。いずれの場合も、charset 名は大文字小文字を区別せずに照合されます。

Charset 名は IANA の "Character Sets" レジストリ(https://www.iana.org/assignments/character-sets)に [RFC2978] に定められた手順で登録されるべきです。

8.3.3. マルチパート型

MIME は複数の表現を単一のメッセージボディ内にカプセル化するいくつかの "multipart" 型を提供します。すべての multipart 型は共通の構文を共有し([RFC2046] 参照)、メディアタイプ値の一部として boundary パラメータを含みます。メッセージボディ自体がプロトコル要素であり、送信者はボディパート間の改行を表すために CRLF のみを生成することが MUST です。

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

表現に 1 つ以上のエンコーディングが適用されている場合、エンコーディングを適用した送信者は、適用された順序で content codings を列挙する Content-Encoding ヘッダーフィールドを生成しなければなりません(MUST)。また "identity" という名のコーディングは Accept-Encoding における特別な役割のために予約されており、通常は含めるべきではありません(SHOULD NOT)。

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

Transfer-Encoding(Section 6.1 of [HTTP/1.1])とは異なり、Content-Encoding に列挙されたコーディングは表現の特性です;表現は符号化された形式で定義され、他のメタデータは明示がない限り符号化された形式についてのものです。通常、表現はレンダリング直前または類似の使用直前にのみデコードされます。

メディアタイプに固有のエンコーディング(例えば常に圧縮されるデータ形式)がある場合、そのエンコーディングは Content-Encoding で再度記述されません。あえて同じアルゴリズムが二重に適用されているような稀な状況でなければ、そのようなコーディングはリストに含まれません。同様に、オリジンサーバは同じデータを、コーディングが Content-Type の一部として定義されているか Content-Encoding としているかによって異なる表現として公開することを選択するかもしれません。これは一部のユーザーエージェントが各レスポンスの扱いを異なって行うためです(例えば自動解凍ではなく "名前を付けて保存..." ダイアログを開くなど)。

オリジンサーバは、リクエストメッセージ中の表現が許容できない content coding を持つ場合、415 (Unsupported Media Type) のステータスコードで応答してもよい(MAY)です。

8.4.1. Content Codings

Content coding 値は表現に適用された(または適用可能な)エンコーディング変換を示します。Content codings は主に表現を圧縮したり有用に変換したりするために使用され、基になるメディアタイプの同一性や情報の損失を防ぎます。多くの場合、表現は符号化された形式で保存され、直接送信され、最終受信者がデコードします。

すべての content codings は大文字小文字を区別せず、"HTTP Content Coding Registry" に登録されるべきです(セクション 16.6 を参照)。

Content-coding 値は Accept-Encoding および Content-Encoding ヘッダーフィールドで使用されます。

8.4.1.1. Compress Coding

"compress" コーディングは適応型 LZW(Lempel-Ziv-Welch)コーディングで、UNIX の "compress" プログラムによって一般的に生成されます。受信者は "x-compress" を "compress" と同等とみなすことが SHOULD です。

8.4.1.2. Deflate Coding

"deflate" コーディングは "zlib" データ形式([RFC1950])で、"deflate" 圧縮データストリーム([RFC1951])を含み、これは LZ77 圧縮アルゴリズムとハフマンコーディングの組合せを使用します。

8.4.1.3. Gzip Coding

"gzip" コーディングは 32 ビット CRC を持つ LZ77 コーディングで、gzip プログラムによって一般的に生成されます([RFC1952])。受信者は "x-gzip" を "gzip" と同等とみなすことが SHOULD です。

8.5. Content-Language

"Content-Language" ヘッダーフィールドは、その表現が意図する受け手の自然言語を記述します。これは表現内で使用されているすべての言語と必ずしも等しいわけではないことに注意してください。

Language tags は セクション 8.5.1 で定義されます。Content-Language の主目的は、ユーザーが自身の好む言語に従って表現を識別・区別できるようにすることです。したがって、コンテンツがデンマーク語話者のみを対象としている場合、適切なフィールドは次のようになります

Content-Language: da

Content-Language が指定されていない場合、デフォルトはコンテンツが全ての言語の受け手を意図しているということです。これは送信者がそれを特定の自然言語に特有と考えていないか、どの言語を意図しているかを知らないことを意味する可能性があります。

複数の言語が意図される複数の受け手を対象とするコンテンツの場合、複数の言語を列挙してもよい(MAY)。例えば、原文のマオリ語と英語を同時に提示している「Treaty of Waitangi」の翻訳版は次のようになります:

Content-Language: mi, en

しかし、表現内に複数言語が存在するからといって、それが複数の言語受け手を意図しているとは限りません。例えば「A First Lesson in Latin」のような初心者向け語学入門書は英語話者を対象としており、この場合 Content-Language は "en" のみを含むのが適切です。

Content-Language は任意のメディアタイプに適用してよく、テキスト文書に限られません(MAY)。

8.5.1. 言語タグ

言語タグは [RFC5646] に定義され、人間同士の情報伝達のために用いられる自然言語を識別します。コンピュータ言語は明示的に除外されます。

HTTP は Accept-LanguageContent-Language ヘッダーフィールド内で言語タグを使用します。Accept-Language はより広い language-range 構文を使用し(セクション 12.5.4)、Content-Language は以下に定義される language-tag 生成規則を使用します。

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

言語タグはハイフン("-", %x2D)で区切られた 1 個以上の大文字小文字非区別のサブタグ列です。多くの場合、言語タグは広い言語族を識別する一次サブタグ(例: "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 は囲まれたデータの量を具体的に指し、フレーミングを区切るために使用されます(例: Section 6.2 of [HTTP/1.1])。その他の場合、Content-Length は選択された表現の現在の長さを示し、受信者が転送時間を見積もったり以前に保存した表現と比較したりするために使用できます。

例:

Content-Length: 3495

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

サーバは HEAD リクエストへのレスポンスに Content-Length を送信してもよい(MAY);ただし、そのようなレスポンスでフィールド値を送信する場合、その値は同じリクエストが GET メソッドであった場合にコンテンツとして送信されただろうオクテット数と等しくなければなりません(MUST NOT)。

条件付き GET リクエストに対する 304 (Not Modified) レスポンスにおいて、サーバは Content-Length を送信してもよい(MAY);しかし、そのようなレスポンスでフィールド値を送信する場合、その値は同じリクエストに対する 200 (OK) レスポンスのコンテンツとして送信されたであろうオクテット数と等しくなければなりません(MUST NOT)。

サーバは、1xx (Informational) または 204 (No Content) のステータスコードを持つ任意のレスポンスで Content-Length を送信してはなりません(MUST NOT)。また CONNECT リクエストに対する任意の 2xx (Successful) レスポンスで Content-Length を送信してはなりません(MUST NOT)。

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

任意の Content-Length フィールド値は 0 以上であれば有効です。内容長に予め定義された上限がないため、受信者は潜在的に大きな 10 進数を想定し、整数変換オーバーフローや精度損失による解析エラーを防ぐ必要があります(セクション 17.5)。

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

したがって、送信者は既知の誤った Content-Length ヘッダーフィールド値を持つメッセージを転送してはなりません(MUST NOT)。

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

8.7. Content-Location

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

フィールド値は absolute-URI または partial-URI のいずれかです。後者の場合、参照される URI はターゲット URI に対して相対的です(セクション 4 を参照、[URI]、Section 5)。

Content-Location の値はターゲット URI の代替ではありません(セクション 7.1)。それは表現のメタデータです。MIME ボディパート用に定義された同名のヘッダーフィールドと同じ構文とセマンティクスを持ちますが([RFC2557] の Section 4 を参照)、HTTP メッセージに現れるときには HTTP 受信者に対していくつか特別な意味があります。

Content-Location が 2xx (Successful) レスポンスメッセージに含まれ、その値が(絶対形に変換して)ターゲット URI と同じ URI を参照する場合、受信者はそのコンテンツをメッセージ発信日時におけるそのリソースの現在の表現と見なしてもよい(MAY)。GET または HEAD リクエストに対しては、これはサーバが Content-Location を提供しない場合のデフォルトのセマンティクスと同じです。PUT や POST のような状態変化を伴うリクエストに対しては、これはサーバのレスポンスがそのリソースの新しい表現を含むことを意味し、アプリケーションが後続の GET を行わずにローカルコピーを更新できるようにします。

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

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

リクエストメッセージで Content-Location を送信するユーザーエージェントは、その値が囲まれた表現の元々の取得元(ユーザーエージェントが改変する前)を指していると述べています。言い換えれば、ユーザーエージェントは元の表現のソースへのバックリンクを提供しています。

オリジンサーバがリクエストメッセージで Content-Location を受け取った場合、その情報を表現の一部として逐語的に保存するメタデータとしてではなく、一時的なリクエストコンテキストとして扱わなければなりません(MUST)。オリジンサーバはそのコンテキストをリクエスト処理の指針に用いたり、ソースリンクやバージョン管理メタデータとして保存したりすることが MAY ですが、そのコンテキスト情報を用いてリクエストのセマンティクスを変更してはなりません(MUST NOT)。

例えば、クライアントが交渉されたリソースに対して PUT リクエストを行い、オリジンサーバがその PUT を(リダイレクトなしに)受け入れた場合、そのリソースの新しい状態はその PUT で供給された表現と一致することが期待されます。Content-Location は交渉された表現のうち一つだけを更新するための逆選択識別子として使用してはなりません。もしユーザーエージェントがそのような意味を望んでいたなら、PUT を直接 Content-Location の URI に適用すべきでした。

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

リソースメタデータは、条件付きリクエスト(セクション 13)を作る際に前提条件(セクション 13.1)内で使用できる場合、validator と呼ばれます。バリデータフィールドは selected representation の現在のバリデータを伝えます(セクション 3.2)。

安全なリクエストへのレスポンスでは、バリデータフィールドはレスポンスを処理する際にオリジンサーバが選択した selected representation を記述します。メソッドやステータスコードのセマンティクスによっては、あるレスポンスにおける選択された表現がレスポンスコンテンツとして囲まれた表現と必ずしも同一ではないことに注意してください。

状態変化を伴うリクエストへの成功レスポンスでは、バリデータフィールドはリクエスト処理の結果として以前の selected representation に代わって置き換えられた新しい表現を記述します。

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

本仕様は、リソース状態を観測し前提条件をテストするために一般的に使用される二つの形式のメタデータを定義します:変更日時(セクション 8.8.2)と不透明なエンティティタグ(セクション 8.8.3)。その他のリソース状態を反映するメタデータは WebDAV のような HTTP 拡張によって定義されていますが、それらは本仕様の範囲外です。

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

バリデータには強弱の二種類があります:strong または weak。弱バリデータは生成が容易ですが比較にはあまり有用ではありません。強バリデータは比較に理想的ですが効率的に生成するのが非常に困難または不可能な場合があります。すべてのリソースに同じ強度のバリデータを課す代わりに、HTTP は使用中のバリデータの種類を公開し、弱バリデータを前提条件として使用できる場合に制限を課します。

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

強バリデータは表現データの変更以外の理由で変化することもあります(例: Content-Type のような表現メタデータが意味的に重要な部分で変わる場合)が、オリジンサーバはリモートキャッシュや作成ツールが古いレスポンスを無効化するために必要な場合にのみ値を変更するのが望ましいです。

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

実務で使われる強バリデータには様々なものがあります。最良のものは厳格なリビジョン管理に基づき、表現の変更ごとに一意のノード名やリビジョン識別子が割り当てられます。表現データに対する衝突耐性のあるハッシュ関数も十分ですが、レスポンスヘッダーフィールドが送信される前にデータが利用可能である必要があり、検証要求のたびにダイジェストを再計算する必要がないことが望まれます。ただし、同じデータ形式を共有するがメタデータが異なる複数の表現が存在する場合、オリジンサーバはそれらの表現を区別する追加情報をバリデータに組み込む必要があります。

対照的に、weak validator は表現データのすべての変更に対して値が必ず変わるとは限らない表現メタデータです。これは値の計算方法の制限(例: 時計の分解能)、すべての可能な表現の一意性を保証できないこと、あるいはリソース所有者が一意なデータ列ではなく自己判断で等価性の集合にまとめたいことが理由になり得ます。

オリジンサーバは、以前の表現を現在の表現の代替として受け入れたくないと考えるときは弱エンティティタグを変更するべきです(SHOULD)。言い換えれば、オリジンサーバはキャッシュが古いレスポンスを無効化することを望む場合、弱エンティティタグを変更すべきです。

例えば、毎秒変化する天気報告の表現は、オリジンサーバの観点から同等とみなす表現の集合にまとめて同じ弱バリデータを割り当て、キャッシュが妥当な期間表現を使用できるようにすることがあります。同様に、1 秒の分解能しかない修正時刻は、その間に表現が 2 回変更され得る場合、弱バリデータとなり得ます。

同様に、同一リソースの二つ以上の表現が同時に同じバリデータを共有する場合、その表現データが同一でない限りそのバリデータは弱です。例えば、gzip コーディングが適用された表現と無符号の表現で同じバリデータを送信するなら、そのバリデータは弱となります。しかし、表現データのみが同一でメタデータが異なる二つの同時表現は同じ強バリデータを共有し得ます。

強バリデータはキャッシュ検証、部分範囲の要求、失われた更新の回避を含むすべての条件付きリクエストに使用できます。弱バリデータはクライアントが以前取得した表現データと正確に等しいことを要求しない場合(例えばキャッシュの検証や最近の変更への限定的な巡回のような場合)にのみ使用できます。

8.8.2. Last-Modified

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

使用例:

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

オリジンサーバは、最終修正日時を合理的かつ一貫して決定できる任意の selected representation に対して Last-Modified を送信することが SHOULD です。これは条件付きリクエストやキャッシュの鮮度評価において不要な転送を大幅に削減し、可用性とスケーラビリティを向上させます。

表現は通常リソースの背後にある多くの部分の合計です。最終修正時刻は通常それらの部分のいずれかが最後に変更された時刻になります。任意のリソースでその値がどのように決定されるかは実装の詳細であり本仕様の範囲外です。

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

時計を持つオリジンサーバ(セクション 5.6.7 で定義)は、メッセージの発信時刻(Date)より後の Last-Modified 日付を生成してはなりません(MUST NOT)。もし修正時刻が実装固有のメタデータから将来時刻を示す場合、オリジンサーバはその値をメッセージ発信日時で置換しなければなりません(MUST)。これは将来の修正日時がキャッシュ検証に悪影響を与えるのを防止します。

時計を持たないオリジンサーバは、他のシステム(おそらく時計を持つもの)によってリソースに割り当てられた日付値でない限り、レスポンスに Last-Modified を生成してはなりません(MUST NOT)。

8.8.2.2. 比較

リクエスト内でバリデータとして使用される Last-Modified 時刻は、次の規則を満たして強いと推論できない限り暗黙に弱であると見なされます:

  • バリデータがオリジンサーバによって実際の現在の表現バリデータと比較されていること、かつ
  • そのオリジンサーバが提示されたバリデータがカバーする秒の間に関連する表現が 2 回変更されなかったことを確実に知っていること;

または

  • バリデータがクライアントによって If-Modified-SinceIf-Unmodified-Since、または If-Range のいずれかで使用されようとしており、クライアントのキャッシュエントリが関連する表現のキャッシュを保持していること、かつ
  • そのキャッシュエントリが Last-Modified 値より少なくとも 1 秒後の Date 値を含み、クライアントがそれらが同一の時計で生成されたか、Last-Modified と Date の差が時計同期問題を無視できるほど十分である理由があること;

または

  • バリデータが中間キャッシュによってそのキャッシュエントリ内に保存されているバリデータと比較されていること、かつ
  • そのキャッシュエントリが Last-Modified 値より少なくとも 1 秒後の Date 値を含み、キャッシュがそれらが同一の時計で生成されたか、差が時計同期問題を無視できるほど十分である理由があること。

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

8.8.3. ETag

レスポンス内の "ETag" フィールドは、リクエスト処理の完了時に決定された selected representation の現在のエンティティタグを提供します。エンティティタグは、同一リソースの複数の表現を区別するための不透明なバリデータであり、表現データの変更や同時に有効な複数表現(コンテンツ交渉による)によらず利用できます。エンティティタグは不透明な引用文字列で構成され、必要に応じて弱性指示子で接頭辞が付くことがあります。

  ETag       = entity-tag

  entity-tag = [ weak ] opaque-tag
  weak       = %s"W/"
  opaque-tag = DQUOTE *etagc DQUOTE
  etagc      = %x21 / %x23-7E / obs-text
             ; VCHAR except double quotes, plus obs-text

エンティティタグは、修正日時よりも検証においてより信頼できる場合があります。これは修正日時を保存できない状況や、HTTP-date の 1 秒解像度が十分でない場合、または修正日時が一貫して維持されない場合に当てはまります。

例:

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

エンティティタグは弱または強のいずれかのバリデータになり得ますが、強がデフォルトです。もしオリジンサーバがエンティティタグを提供し、その生成が強バリデータの特性を満たさないなら、オリジンサーバはその不透明値の前に "W/" を付けて弱としてマークしなければなりません(MUST)。

送信者はトレーラセクションで ETag フィールドを送信してもよい(MAY)。ただしトレーラはしばしば無視されるため、エンティティタグがコンテンツ送信中に生成されない限り、ETag はヘッダーフィールドとして送信するのが望ましいです。

8.8.3.1. 生成

エンティティタグの原則は、リソースの実装を十分に理解しているのはサービス作成者のみであり、そのリソースに対して最も正確で効率的な検証機構を選択できるという点にあります。そのような機構は単純なオクテット列にマッピングでき、クライアントがその構築方法を知る必要はありません。

例えば、すべての変更に実装固有のバージョニングが適用されるリソースは、内部のリビジョン番号を使用したり、コンテンツ交渉の変動識別子と組み合わせたりして表現を正確に区別するかもしれません。他の実装は表現コンテンツの衝突耐性ハッシュ、様々なファイル属性の組み合わせ、またはサブ秒解像度の修正タイムスタンプを用いるかもしれません。

オリジンサーバは、変更の検出が合理的かつ一貫して可能な任意の selected representation に対して ETag を送信することが SHOULD です。エンティティタグは条件付きリクエストやキャッシュの鮮度評価において不要な転送を大幅に削減し、可用性、スケーラビリティ、信頼性を向上させます。

8.8.3.2. 比較

エンティティタグの比較関数は 2 種類あり、比較文脈が弱バリデータの使用を許すかどうかによって異なります:

強比較(Strong comparison)
二つのエンティティタグは両方とも弱でなく、その opaque-tag が文字単位で一致する場合に等価とみなされます。
弱比較(Weak comparison)
二つのエンティティタグは、その opaque-tag が文字単位で一致するなら、どちらか一方または両方が "weak" とタグ付けされていても等価とみなされます。

以下の例は一連のエンティティタグペアに対して弱および強比較がどのような結果になるかを示します:

Table 3
ETag 1 ETag 2 Strong Comparison Weak Comparison
W/"1" W/"1" no match match
W/"1" W/"2" no match no match
W/"1" "1" no match match
"1" "1" match match
8.8.3.3. 例:コンテンツ交渉されるリソースに対するエンティティタグの違い

コンテンツ交渉の対象となるリソースを考え、その GET リクエストに対する応答が Accept-Encoding ヘッダーフィールドに基づいて異なる表現を返す場合(セクション 12.5.3)、次のようになります:

>> Request:

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

この場合、レスポンスは gzip コーディングを使うか使わないかのいずれかになります。もし使わないなら、レスポンスは次のようになるかもしれません:

>> Response:

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 コンテンツコーディングを使用する別の表現は次のようになるかもしれません:

>> Response:

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. Methods

9.1. Overview

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

リクエストメソッドのセマンティクスは、リクエスト内に存在する一部のヘッダーフィールドのセマンティクスによってさらに特化されることがありますが、それらの追加的セマンティクスがメソッドと矛盾しない場合に限ります。たとえば、クライアントは条件付きリクエストヘッダーフィールド(Section 13.1)を送信して、要求された操作をターゲットリソースの現在の状態に依存させることができます。

HTTP は分散オブジェクトシステムのインターフェースとして使えるよう設計されています。リクエストメソッドは、リモートメソッド呼び出しが識別されたオブジェクトに送信され得るのと同様に、target resource に適用されるべきアクションを呼び出します。

メソッドトークンは大文字小文字を区別します。これは、オブジェクトベースのシステムへのゲートウェイとして使われる場合にメソッド名が大文字小文字を区別することがあるためです。慣習として、標準化されたメソッドは US-ASCII の大文字で定義されます。

分散オブジェクトと異なり、HTTP の標準化されたリクエストメソッドはリソース固有ではありません。統一インターフェースはネットワークベースのシステムにおける可視性と再利用性を高めるためです([REST]参照)。一度定義された標準メソッドは、任意のリソースに適用されたときに同じセマンティクスを持つべきですが、各リソースはそれらのセマンティクスを自ら実装するかどうかを判断します。

本仕様は、以下の表に概説されるように、HTTP で一般に使用される多数の標準メソッドを定義します。

Table 4
Method Name Description Section
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

すべての汎用サーバは MUST GET と HEAD のメソッドをサポートしなければなりません。その他のメソッドは OPTIONAL です。

ターゲットリソースが許可するメソッドの集合は Allow ヘッダーフィールドで列挙できます(Section 10.2.1)。しかし、許可されるメソッドの集合は動的に変わり得ます。オリジンサーバが未認識または未実装のリクエストメソッドを受け取った場合、SHOULD 501 (Not Implemented) で応答すべきです。オリジンサーバが認識し実装はしているがターゲットリソースに許可されていないメソッドを受け取った場合、SHOULD 405 (Method Not Allowed) で応答すべきです。

本仕様の範囲外の追加メソッドが HTTP 向けに定義されていることがあります。すべてのそのようなメソッドは "Hypertext Transfer Protocol (HTTP) Method Registry" に登録されるべきです(Section 16.1参照)。

9.2. Common Method Properties

9.2.1. Safe Methods

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

この safe の定義は、実装が潜在的に有害な動作や完全に読み取り専用でない動作、あるいは副作用を伴う動作を含めることを妨げるものではありません。ただし重要なのは、クライアントがそれらの追加動作を要求しておらず、その責任を負わない点です。例えば、多くのサーバはすべてのレスポンス完了時にアクセスログファイルへリクエスト情報を追記しますが、それは safe と見なされます(ログ保存がいっぱいになりサーバが失敗する可能性があっても)。同様に、Web 上の広告を選択することで発生する safe リクエストは広告アカウントの課金という副作用を持つことがあります。

本仕様で定義されるリクエストメソッドのうち、GETHEADOPTIONS、および TRACE が safe と定義されています。

safe と unsafe を区別する目的は、スパイダーのような自動取得プロセスやキャッシュのプリフェッチによる性能最適化が害を及ぼさずに動作できるようにするためです。加えて、未信頼のコンテンツを処理する際にユーザーエージェントが unsafe メソッドの自動使用に適切な制約を適用できるようにします。

ユーザーエージェントは、ユーザーに提示する潜在的なアクションを表示する際に safe と unsafe を区別することが SHOULD です。これによりユーザーは unsafe な操作を行う前に警告を受けられます。

ターゲット URI 内のパラメータがアクションの選択に影響を及ぼすように構築されたリソースについては、そのアクションがリクエストメソッドのセマンティクスと整合するようにリソース所有者が責任を負います。例えば、"page?do=delete" のようにクエリパラメータで動作を指定する Web ベースの編集ソフトウェアが一般的です。もしそのリソースの目的が unsafe なアクションを実行することであるなら、リソース所有者は safe メソッドでアクセスされたときにそのアクションを無効化または禁止しなければなりません。そうしないと、リンクの保守やプリフェッチ、検索インデックス作成等のために自動化プロセスが GET を実行する際に望ましくない副作用が発生します。

9.2.2. Idempotent Methods

あるリクエストメソッドは、同一のリクエストを複数回送信した場合でもサーバに対する意図された効果が単一回と同じであるならば idempotent と見なされます。本仕様で定義されるメソッドのうち、PUTDELETE、および safe なリクエストメソッドは idempotent です。

safe の定義と同様に、idempotent の性質はユーザーが要求した内容にのみ適用されます。サーバは各 idempotent リクエストを個別にログに記録したり、リビジョン履歴を保持したり、その他の非冪等的な副作用を実装する自由があります。

Idempotent メソッドが区別されるのは、通信障害によりクライアントがサーバのレスポンスを読み取る前に同一リクエストを自動的に再送できる点にあります。例えば、クライアントが PUT リクエストを送信し、基盤の接続がレスポンスを受け取る前に切断された場合、クライアントは新しい接続を確立して idempotent なリクエストを再試行できます。再試行により元のリクエストが成功していたとしても、意図された効果は同じであることが保証されますが、レスポンスは異なり得ます。

クライアントは、メソッドが非冪等である場合に、そのリクエストを自動的に再試行すべきではありません(SHOULD NOT)。ただし、リクエストのセマンティクスが実際には冪等であることを知っている場合や、元のリクエストが適用されなかったことを検出する手段がある場合は例外です。

例えば、ユーザーエージェントは、そのリソースに対して設計または設定によって安全に再実行できると知っている場合に限り、POST リクエストの自動再送を行えます。同様に、バージョン管理リポジトリ向けに特化したユーザーエージェントは、失敗した接続後にターゲットリソースのリビジョンを確認し、部分的に適用された変更を巻き戻すか修正してから失敗したリクエストを自動再試行できる設計もあります。

一部のクライアントはよりリスクのあるアプローチを取り、自動再試行が可能かを推測することがあります。例えば、基盤のトランスポート接続が切断され、レスポンスのどの部分も受信されていない場合に POST を自動再試行することがあります(特にアイドル状態の永続接続が使用されていた場合)。

プロキシは非冪等リクエストを自動的に再試行してはなりません(MUST NOT)。クライアントは自動再試行に失敗した場合にさらに再試行すべきではありません(SHOULD NOT)。

9.2.3. Methods and Caching

キャッシュがレスポンスを保存・利用するためには、関連するメソッドが明示的にキャッシュを許可し、どの条件でレスポンスが後続のリクエストを満たすために使えるかを詳細に定義している必要があります。メソッド定義がそれを行わない場合、そのレスポンスはキャッシュできません。追加の要件は [CACHING] を参照してください。

本仕様は GET、HEAD、および POST のキャッシュセマンティクスを定義しますが、実際のキャッシュ実装の大多数は GET と HEAD のみをサポートします。

9.3. Method Definitions

9.3.1. GET

GET メソッドは、selected representation の転送をターゲットリソースに対して要求します。成功したレスポンスはターゲット URI により識別される「同一性」の品質を反映します(Section 1.2.2 of [URI]参照)。したがって、HTTP を用いた識別可能な情報の取得は通常、その情報を提供する可能性のある識別子に対して GET リクエストを行うことで実行されます(200 (OK) のレスポンスで)。

GET は情報取得の主要機構であり、ほとんどすべての性能最適化の焦点です。重要なリソースごとに URI を生成するアプリケーションは、それらの最適化の恩恵を受けつつ他のアプリケーションによる再利用を可能にし、Web の拡大を促進するネットワーク効果をもたらします。

リソース識別子をリモートファイルシステムのパス名と見なし、表現をそのファイル内容のコピーと考えるのは魅力的ですが、実際には多くのリソースがそのように実装されています(関連するセキュリティ考慮は Section 17.3 を参照)。しかし、実際の制約はそれほど単純ではありません。

リソースの HTTP インターフェースは、コンテンツオブジェクトのツリー、各種データベースレコードへのプログラム的ビュー、あるいは他の情報システムへのゲートウェイとして実装されている可能性があります。URI マッピングがファイルシステムに結びついている場合でも、オリジンサーバはリクエストを入力としてファイルを実行し、その出力を表現として送信するように構成されているかもしれません。いずれにせよ、どのリソース識別子がどの実装に対応し、どのようにしてターゲットリソースの現在の表現を選択して送信するかはオリジンサーバだけが知っていれば十分です。

クライアントは、GET のセマンティクスを "レンジリクエスト"(選択された表現の一部のみを転送する)に変更するために、リクエストで Range ヘッダーフィールドを送信できます(Section 14.2参照)。

リクエストメッセージのフレーミングは使用されるメソッドに依存しませんが、GET リクエストで受信したコンテンツには一般に定義されたセマンティクスがなく、リクエストの意味やターゲットを変更できません。そのため、一部実装はそれをリクエストスミッギング攻撃の可能性と見なしてリクエストを拒否し接続を閉じることがあります(Section 11.2 of [HTTP/1.1]参照)。クライアントは、オリジンサーバがそのようなコンテンツを目的として受け取り十分にサポートすることを事前に示していない限り、GET リクエストにコンテンツを生成してはなりません(SHOULD NOT)。オリジンサーバは、経路上の仲介者を認識していない相手と個人的な取り決めに頼ってコンテンツを受け取るべきではありません(SHOULD NOT)。

GET リクエストへのレスポンスはキャッシュ可能であり、キャッシュは Cache-Control ヘッダーフィールドで示されない限りそれを用いて後続の GET および HEAD リクエストを満たすことが MAY です(Section 5.2 of [CACHING]参照)。

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

9.3.3. POST

POST メソッドは、target resource に対して、リクエストに含まれた表現をそのリソース固有のセマンティクスに従って処理するよう要求します。例えば、POST は以下の機能に使用されます(他にもあります):

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

オリジンサーバは、POST リクエストの処理結果に基づいて適切なステータスコードを選択することでレスポンスのセマンティクスを示します;本仕様で定義されたほとんどのステータスコードが POST のレスポンスとして返され得ます(例外は 206304、および 416 などです)。

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

POST リクエストへのレスポンスは、明示的な鮮度情報を含む場合にのみキャッシュ可能です(詳細は Section 4.2.1 of [CACHING])。また、POST のターゲット URI と同じ値を持つ Content-Location が含まれる場合に限り、キャッシュされた POST レスポンスは後続の GET または HEAD リクエストを満たすために再利用できます。一方、POST リクエスト自体は潜在的に unsafe であるためキャッシュされた POST レスポンスで満たされることはできません(詳細は Section 4 of [CACHING]参照)。

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

9.3.4. PUT

PUT メソッドは、リクエストメッセージのコンテンツに含まれる表現でターゲットリソースの状態を作成または置換するよう要求します。ある表現の PUT が成功した場合、同一のターゲットリソースに対する後続の GET は等価な表現を 200 (OK) レスポンスで返すことが期待されます。しかし、ターゲットリソースは並行して他のユーザーエージェントによって操作され得るか、オリジンサーバによる動的処理の対象であるため、そのような状態変化が観測可能である保証はありません。成功レスポンスは、オリジンサーバが処理した時点でユーザーエージェントの意図が達成されたことを示すのみです。

ターゲットリソースに現在の表現が存在せず、PUT によって作成された場合、オリジンサーバは 201 (Created) を返さなければなりません(MUST)。ターゲットリソースに現在の表現が存在し、その表現が PUT の表現に従って正常に変更された場合、オリジンサーバは成功を示すために 200 (OK) または 204 (No Content) を返さなければなりません(MUST)。

オリジンサーバは、PUT 表現がターゲットリソースに対する設定制約と一貫しているかを検証することが SHOULD です。例えば、オリジンサーバが URI に基づいてリソースの表現メタデータを決定する場合、PUT で受信したコンテンツがそのメタデータと一貫することを確認する必要があります。PUT 表現がターゲットリソースと一貫しない場合、オリジンサーバは表現を変換して一貫にするか、リソース設定を変更するか、あるいは表現が不適切である理由を説明する十分な情報を含む適切なエラーメッセージでリクエストを拒否するべきです(SHOULD)。推奨されるステータスコードとしては 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 がオリジンサーバの状態にどのように影響するかを厳密に定義するものではなく、ユーザーエージェントのリクエストの意図およびオリジンサーバのレスポンスのセマンティクスで表せる範囲に留まります。リソースが何であるか、状態がどのように「格納」されるか、格納が状態変化によってどのように変わるか、あるいはオリジンサーバがリソース状態をどのように表現に変換するかは定義していません。一般に、リソースインターフェースの裏にある実装の詳細はサーバに隠蔽されます。

これはヘッダおよびトレーラフィールドの保存方法にも及びます。一般的なヘッダフィールド(例: Content-Type)は通常保存されて後続の GET で返されますが、ヘッダとトレーラの扱いはそのリソースがリクエストを受けた具体的実装に依存します。その結果、オリジンサーバは PUT リクエストで受け取った未認識のヘッダやトレーラフィールドを(リソース状態の一部として保存するのではなく)無視することが SHOULD です。

オリジンサーバは、リクエストが保存された表現データに対して何ら変換が行われていない場合(すなわちリソースの新しい表現データが PUT リクエストで受信したコンテンツと同一である場合)を除き、成功した PUT レスポンスで ETag や Last-Modified のようなバリデータフィールドを送信してはなりません(MUST NOT)。この要件は、ユーザーエージェントが送信した表現(メモリ上に保持しているもの)が PUT の結果であり再取得を不要としてよいかを判断できるようにするためです。レスポンスで受け取った新しいバリデータは、今後の条件付きリクエストに用いて偶発的な上書きを防ぐことができます(Section 13.1参照)。

POST と PUT の基本的な違いは、囲まれた表現に対する意図の違いで強調されます。POST の場合、ターゲットリソースは囲まれた表現をリソース固有のセマンティクスに従って処理することを意図しますが、PUT の場合は囲まれた表現がターゲットリソースの状態を置換することが明示されます。したがって、PUT の意図は冪等であり仲介者にも可視ですが、正確な効果はオリジンサーバだけが知っています。

PUT の適切な解釈は、ユーザーエージェントがどのターゲットリソースを望んでいるかを知っていることを前提とします。クライアントに代わって適切な URI を選択するサービスは、状態変更リクエストを受け取った後にそれを行うならば POST を用いるべきです(SHOULD)。もしオリジンサーバがリクエストされた PUT 状態変更をターゲットリソースに対して行わず、代わりに別のリソースに適用したい場合(例えばリソースが別の URI に移動したとき)、オリジンサーバは適切な 3xx (Redirection) を返さなければなりません(MUST);ユーザーエージェントはリダイレクトを行うかどうかを自身で決定してよい(MAY)。

ターゲットリソースに対する PUT リクエストは他のリソースに副作用をもたらすことがあります。例えば、「現在のバージョン」を識別する URI(リソース)と、各バージョンを識別する URI(別のリソース)が存在する場合、"現在のバージョン" URI への成功した PUT は新しいバージョンリソースを作成するとともにターゲットリソースの状態を変更し、関連リソース間のリンクが追加されることがあります。

一部のオリジンサーバは、リクエスト修飾子として Content-Range を用いることで部分的な PUT を行うことをサポートします(Section 14.4および Section 14.5参照)。

PUT メソッドへのレスポンスはキャッシュ可能ではありません。成功した PUT リクエストがターゲット URI に対して通過するキャッシュを経由した場合、そのターゲット URI に保存されているレスポンスは無効化されます(無効化に関する詳細は Section 4.4 of [CACHING] を参照)。

9.3.5. DELETE

DELETE メソッドは、オリジンサーバに対して target resource とその現在の機能との関連付けを削除するよう要求します。実質的には、このメソッドは UNIX の "rm" コマンドに類似しており、オリジンサーバの URI マッピングに対する削除操作を表現するもので、以前に関連付けられていた情報の実際の削除を要求するものではありません。

ターゲットリソースに 1 個以上の現在の表現がある場合、それらがオリジンサーバによって破棄されるかどうか、また関連ストレージが回収されるかどうかは、完全にリソースの性質およびオリジンサーバの実装に依存します(これらは本仕様の範囲外です)。同様に、DELETE によってデータベースやゲートウェイ接続の無効化やアーカイブが必要となることもあります。一般に、オリジンサーバは DELETE を許可するリソースについて、その削除を達成するための仕組みを持っていることが前提です。

DELETE を許可するリソースは比較的少なく、その主な用途はリモートオーサリング環境です。例えば、以前に PUT により作成されたリソース、または POST に対する 201 (Created) レスポンスで Location により識別されたリソースは、対応する DELETE 要求を受け付けてそれらの操作を元に戻すかもしれません。同様に、HTTP を用いてリモート操作を行うリビジョン管理クライアントのようなカスタムユーザーエージェント実装は、サーバの URI 空間がバージョンリポジトリに対応していることを前提に DELETE を使用することがあります。

DELETE が正常に適用された場合、オリジンサーバは以下のいずれかを返すことが SHOULD です:

  • 処理がまだ実行されていないが成功する見込みがある場合は 202 (Accepted)
  • 処理が実行され追加情報を供給する必要がない場合は 204 (No Content)
  • 処理が実行され、状態を記述する表現をレスポンスに含む場合は 200 (OK)

リクエストメッセージのフレーミングはメソッドに依存しませんが、DELETE リクエストで受信したコンテンツは一般に定義されたセマンティクスを持たず、リクエストの意味やターゲットを変更できないため、一部実装はそれをリクエストスミッギング攻撃の可能性と見なしリクエストを拒否し接続を閉じることがあります(Section 11.2 of [HTTP/1.1]参照)。クライアントは、オリジンサーバがそのようなコンテンツを目的として受け取り十分にサポートすることを事前に示していない限り、DELETE リクエストにコンテンツを生成してはなりません(SHOULD NOT)。オリジンサーバは、経路上の仲介者についての私的な取り決めに依存してコンテンツを受け取るべきではありません(SHOULD NOT)。

DELETE メソッドへのレスポンスはキャッシュ可能ではありません。成功した DELETE リクエストがターゲット URI に対して通過するキャッシュを経由した場合、そのターゲット URI に保存されているレスポンスは無効化されます(無効化に関する詳細は Section 4.4 of [CACHING] を参照)。

9.3.6. CONNECT

CONNECT メソッドは、受信者に対してリクエストターゲットで識別される宛先オリジンサーバへのトンネルを確立するよう要求し、成功した場合はトンネルが閉じられるまで両方向のデータの盲目的転送に挙動を制限することを要求します。トンネルは、1 つ以上のプロキシを通じてエンドツーエンドの仮想接続を作成するために一般に使用され、その後 TLS(Transport Layer Security, [TLS13])などで保護できます。

CONNECT はこのメソッドに固有の特殊な形式のリクエストターゲットを使用し、これはトンネル宛先のホストとポート番号のみをコロンで区切って構成されます。デフォルトポートはなく、クライアントはリクエストターゲットが権限成分に省略されたポートを含む URI 参照に基づく場合でもポート番号を送信しなければなりません(MUST)。例えば:

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

サーバは空または無効なポート番号をターゲットとする CONNECT リクエストを拒否しなければなりません(通常は 400 (Bad Request) で応答します)。

CONNECT は接続のリクエスト/レスポンスの性質を変更するため、特定の HTTP バージョンはそのセマンティクスをプロトコルのワイヤフォーマットにマッピングする異なる方法を持つ場合があります。

CONNECT はプロキシへのリクエストでの使用を意図しています。受信者はリクエストターゲットで識別されるサーバへ直接接続するか、別のプロキシを使用するよう構成されている場合は次のインバウンドプロキシへ CONNECT リクエストを転送することでトンネルを確立できます。オリジンサーバは CONNECT を受け入れてもよい(MAY)ですが、多くのオリジンサーバは CONNECT を実装していません。

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

トンネルは、トンネル仲介者が一方の側が接続を閉じたことを検出したときに閉じられます:仲介者は未送信の送信元データを相手側へ送信しようと試み、両方の接続を閉じ、残された未配信データを破棄しなければなりません(MUST)。

プロキシ認証はトンネル作成の権限を確立するために使用されることがあります。例えば:

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 をサポートするプロキシは、その使用を既知の制限されたポート集合または構成可能な安全なターゲットリストに制限することが SHOULD です。

サーバは CONNECT に対する Transfer-EncodingContent-Length ヘッダーフィールドを成功レスポンスで送信してはなりません(MUST NOT)。クライアントは成功した CONNECT レスポンスで受信した Content-Length や Transfer-Encoding を無視しなければなりません(MUST)。

CONNECT リクエストメッセージにはコンテンツがありません。CONNECT リクエストヘッダセクションの後に送信されるデータの解釈は使用中の HTTP バージョンに依存します。

CONNECT メソッドへのレスポンスはキャッシュ可能ではありません。

9.3.7. OPTIONS

OPTIONS メソッドは、オリジンサーバまたは仲介者でターゲットリソースに利用可能な通信オプションに関する情報を要求します。このメソッドは、クライアントがリソースに関連するオプションや要件、またはサーバの能力をリソースアクションを意味せずに判定できるようにします。

リクエストターゲットがアスタリスク ("*") の OPTIONS リクエスト(Section 7.1)は、特定のリソースではなく一般的にサーバ自体に適用されます。サーバの通信オプションは通常リソースに依存するため、"*" リクエストはサーバの能力をテストするための "ping" や "no-op" 的な用途にのみ有用です。例えば、これはプロキシの HTTP/1.1 準拠性をテストするために使えます。

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

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

クライアントは OPTIONS リクエストに Max-Forwards を含めてリクエストチェイン内の特定の受信者をターゲットにすることが MAY です(詳細は Section 7.6.2)。プロキシは、受信したリクエストに Max-Forwards フィールドが含まれていない限り、転送時に Max-Forwards を生成してはなりません(MUST NOT)。

クライアントがコンテンツを含む OPTIONS リクエストを生成する場合、そのコンテンツのメディアタイプを記述する有効な Content-Type ヘッダーフィールドを送信しなければなりません(MUST)。本仕様はそのようなコンテンツの用途を定義していないことに注意してください。

OPTIONS メソッドへのレスポンスはキャッシュ可能ではありません。

9.3.8. TRACE

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

クライアントは、TRACE リクエストでレスポンスにより公開される可能性のある機密データを含むフィールドを生成してはなりません(MUST NOT)。例えば、ユーザーエージェントが保存した認証情報(Section 11)やクッキーを TRACE リクエストで送信するのは愚かです。リクエストの最終受信者は、レスポンスコンテンツを生成する際に機密データを含む可能性のあるリクエストフィールドを除外することが SHOULD です。

TRACE はクライアントがリクエストチェインの先端で何が受信されているかを確認し、テストや診断情報としてそれを使用できるようにします。Via ヘッダーフィールドの値は特に関心が高く、リクエストチェインのトレースとして機能します。Max-Forwards を使うことでクライアントはリクエストチェインの長さを制限でき、無限ループでメッセージを転送しているプロキシのチェインをテストするのに便利です。

クライアントは TRACE リクエストにコンテンツを送信してはなりません(MUST NOT)。

TRACE メソッドへのレスポンスはキャッシュ可能ではありません。

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

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

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

10.1.1. Expect

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

Expect フィールド値は大文字小文字を区別しません。

本仕様で定義される唯一の期待は "100-continue"(パラメータは定義されていません)です。

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

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 の期待を生成してはなりません(MUST NOT)。
  • 100 (Continue) の応答を待ってからリクエストコンテンツを送信するクライアントは、Expect ヘッダーフィールドに 100-continue の期待を含めて送信しなければなりません(MUST)。
  • 100-continue の期待を送信したクライアントは、特定の時間待機することを要求されません。そのようなクライアントは応答をまだ受け取っていなくてもコンテンツを送信してよい(MAY)。さらに、100 (Continue) 応答は HTTP/1.0 の仲介者を通して送信できないため、そのようなクライアントは無期限に待つべきではありません(SHOULD NOT)。
  • 100-continue の期待を含むリクエストに対して 417 (Expectation Failed) を受け取ったクライアントは、その 417 応答が期待をサポートしないチェーンを示すだけであるため、100-continue の期待なしで同じリクエストを繰り返すことが SHOULD です。

サーバ向け要件:

  • HTTP/1.0 リクエストで 100-continue の期待を受け取ったサーバは、その期待を無視しなければなりません(MUST)。
  • サーバは、対応するリクエストのコンテンツの一部または全部を既に受信している場合、またはフレーミングがコンテンツがないことを示している場合には、100 (Continue) 応答の送信を省略してよい(MAY)。
  • 100 (Continue) 応答を送信するサーバは、リクエストコンテンツを受信および処理した後で最終的なステータスコードを必ず送信しなければなりません(接続が早期に切断される場合を除く)(MUST)。
  • 最終的なステータスコードで応答する前にリクエストコンテンツ全体を読み取らずに応答したサーバは、接続を閉じる意図があるかどうかを示すべきです(例: Section 9.6 を参照)(SHOULD)。

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

  • メソッド、ターゲット URI、およびヘッダーフィールドだけを検査して決定できる最終ステータスコードでの即時応答、または
  • クライアントにリクエストコンテンツの送信を促す即時の 100 (Continue) 応答。

オリジンサーバは 100 (Continue) 応答を送る前にコンテンツを待ってはなりません(MUST NOT)。

HTTP/1.1(または以降)のリクエストで、メソッド、ターゲット URI、および完全なヘッダセクションに 100-continue の期待があり、リクエストコンテンツが続くことを示している場合、プロキシはMUST 次のいずれかを実行しなければなりません:

  • メソッド、ターゲット URI、およびヘッダーフィールドだけを検査して決定できる最終ステータスコードで即時に応答する、または
  • 対応する request-line とヘッダセクションを次のインバウンドサーバに送信してリクエストをオリジンサーバ側へ転送する。

プロキシが(設定や過去の相互作用から)次のインバウンドサーバが HTTP/1.0 のみをサポートすると判断した場合、プロキシはクライアントにコンテンツの送信を促すために即時の 100 (Continue) 応答を生成してもよい(MAY)。

10.1.2. From

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

  From    = mailbox

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

例:

From: spider-admin@example.org

非ロボット系のユーザーエージェントが From ヘッダーフィールドを送信することはまれです。ユーザーの設定が明示的にない限り、ユーザーエージェントはプライバシーやサイトのセキュリティポリシーと衝突する可能性があるため、From を送信すべきではありません(SHOULD NOT)。

ロボット系ユーザーエージェントは、問題が発生したときにロボットの運用責任者に連絡できるように、有効な From を送信することが望ましい(SHOULD)です。

サーバは From をアクセス制御や認証に使用すべきではありません(SHOULD NOT)。その値はリクエストを受信・観察する誰にでも見えると期待され、ログやエラーレポートに記録されることが多いため、プライバシーの期待はありません。

10.1.3. Referer

"Referer"(誤綴り)ヘッダーフィールドは、ユーザーエージェントがターゲット URI を取得したリソースの URI 参照(すなわち "referrer")を指定することを可能にします。ユーザーエージェントは、Referer 値を生成する際にフラグメントおよび userinfo 成分があればそれらを含めてはなりません(MUST NOT)。

フィールド値は absolute-URI または partial-URI のいずれかです。後者の場合、参照される URI はターゲット URI に対して相対的です。

Referer フィールドは、サーバが単純な解析、ログ、最適化されたキャッシュなどのために他のリソースへのバックリンクを生成することを可能にします。また、保守のために誤ったリンクを発見するのにも役立ちます。いくつかのサーバは Referer を用いて他サイトからのリンクを拒否したり(いわゆる "deep linking")、CSRF 防止のために利用したりしますが、すべてのリクエストが Referer を含むわけではありません。

例:

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

ターゲット URI がユーザーのキーボード入力やブックマークのエントリなど、URI を持たないソースから取得された場合、ユーザーエージェントは Referer を除外するか、"about:blank" の値で送信しなければなりません(MUST)。

Referer の値は参照元リソースの完全な URI を伝える必要はありません。ユーザーエージェントは参照元オリジン以外の部分を切り詰めてもよい(MAY)。

Referer は、参照元の識別子が個人情報や機密リソース(ファイアウォール内など)を示す場合に、リクエストコンテキストや閲覧履歴の情報を露出する可能性があり、プライバシー上の懸念があります。ほとんどの一般的なユーザーエージェントは、参照元が "file" や "data" URI の場合に Referer を送信しません。参照元が安全なプロトコルでアクセスされ、リクエストターゲットのオリジンが異なる場合、ユーザーエージェントは Referer を送信すべきではありません(SHOULD NOT)。参照元が安全なプロトコルでアクセスされていて、リクエストが非安全な HTTP で行われる場合、ユーザーエージェントは Referer を送信してはなりません(MUST NOT)。追加のセキュリティ考慮事項については Section 17.9 を参照してください。

いくつかの仲介者は Referer を無差別に削除することが知られています。これは CSRF 対策を妨げる副作用を生み、ユーザーにとってより有害になり得ます。仲介者や拡張機能が Referer 情報の開示を制限したい場合は、内部ドメイン名を偽名に置き換える、クエリやパスを切り詰めるなど特定の編集に限定すべきです。仲介者は、フィールド値がターゲット URI と同じスキームとホストを共有する場合に Referer を変更または削除してはなりません(SHOULD NOT)。

10.1.4. TE

"TE" ヘッダーフィールドは、トランスファーコーディングおよびトレーラセクションに関してクライアントが持つ能力を記述します。

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

TE はまた HTTP/1.1 内で、クライアントがレスポンスで受け入れ可能なトランスファーコーディングについてサーバに通知するためにも使用されます。公開時点では、トランスファーコーディングを使用しているのは HTTP/1.1 のみです(Section 7 of [HTTP/1.1] を参照)。

TE フィールド値はメンバのリストで、"trailers" を除く各メンバはトランスファーコーディング名トークンと、そのトランスファーコーディングに対するクライアントの相対的な好み(品質値)を示すオプションの重み、およびそのトランスファーコーディングのオプションパラメータから構成されます。

TE を送信する送信者は、仲介者にこのフィールドを転送させないようにするために、Connection ヘッダーフィールド内に "TE" の接続オプションも送らなければなりません(Section 7.6.1)。

10.1.5. User-Agent

"User-Agent" ヘッダーフィールドはリクエストの発信元であるユーザーエージェントに関する情報を含み、サーバは相互運用性問題の範囲を特定したり、特定のユーザーエージェントの制約を回避するために応答を調整したり、ブラウザや OS の使用状況解析のためにこれを利用することがよくあります。ユーザーエージェントは、特に設定で無効化されていない限り、各リクエストで User-Agent を送信することが望まれます(SHOULD)。

User-Agent フィールド値は一つ以上の product 識別子と、それに続く 0 個以上のコメントで構成され、合わせてユーザーエージェントソフトウェアとその重要なサブプロダクトを識別します。慣習として、product 識別子は重要度の高い順に列挙されます。各 product 識別子は名前とオプションのバージョンで構成されます。

送信者は製品を識別するために必要な範囲に product 識別子を制限すべきであり(SHOULD)、広告等の非本質的情報を product 識別子内に含めてはなりません(MUST NOT)。また、product-version にバージョン以外の情報を生成してはなりません(連続するバージョンは product-version 部分だけが異なるべきです)(SHOULD NOT)。

例:

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

ユーザーエージェントは過度に細かい情報を含む User-Agent を生成してはなりません(SHOULD NOT)。第三者によるサブプロダクトの追加も制限すべきです(SHOULD)。過度に長大で詳細な User-Agent はリクエストレイテンシーを増やし、ユーザーの望まない形での識別("fingerprinting")のリスクを高めます。

同様に、実装は互換性を宣言するために他の実装の product トークンを使用することを避けるべきです。そうした偽装は、受信者に対してその識別されたユーザーエージェント向けに応答を最適化することを意図していると仮定させ、実際のユーザーエージェントではうまく動作しない可能性があります。

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

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

10.2.1. Allow

"Allow" ヘッダーフィールドは、ターゲットリソースがサポートすると宣伝しているメソッドの集合を列挙します。このフィールドの目的は、リソースに関連付けられた有効なリクエストメソッドを受信者に知らせることに限定されます。

使用例:

Allow: GET, HEAD, PUT

実際の許可メソッド集合は各リクエスト時点でオリジンサーバによって定義されます。オリジンサーバは 405 (Method Not Allowed) のレスポンスで Allow を生成しなければなりません(MUST)し、他のレスポンスでは生成してもよい(MAY)。空の Allow 値はそのリソースがメソッドを許可していないことを示します。これはリソースが一時的に無効化されている場合に 405 レスポンスで発生することがあります。

プロキシは Allow ヘッダーフィールドを変更してはなりません(MUST NOT) — 指示されたメソッドを理解する必要はなく、汎用のメッセージ処理規則に従って処理すればよいからです。

10.2.2. Location

"Location" ヘッダーフィールドは、レスポンスに関連して特定のリソースを参照するためにいくつかのレスポンスで使用されます。関係の種類はリクエストメソッドとステータスコードの組み合わせにより定義されます。

フィールド値は単一の URI-reference から成ります。相対参照の形であれば、その最終値はターゲット URI に対して解決されます。

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

3xx レスポンスで提供された Location 値にフラグメント成分がない場合、ユーザーエージェントはその値がターゲット URI を生成するために使われた参照のフラグメント成分を継承するかのようにリダイレクトを処理しなければなりません(元の参照のフラグメントがあればそれを継承します)(MUST)。

例えば、URI 参照 "http://www.example.org/~tim" に対する GET リクエストは 303 (See Other) を返し、次のようなヘッダを含むことがあります:

Location: /People.html#tim

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

同様に、"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" へリダイレクトして元のフラグメント識別子を保持することを示唆します。

Location 値にフラグメント識別子が不適切な場合もあります。例えば、201 レスポンス内の Location は作成されたリソース固有の URI を提供することが期待されます。

10.2.3. Retry-After

サーバは "Retry-After" を送信して、ユーザーエージェントがフォローアップリクエストを行う前にどれだけ待つべきかを示します。503 (Service Unavailable) に添えて送る場合、Retry-After はそのサービスがクライアントに対して利用できなくなると予想される期間を示します。任意の 3xx レスポンスに添える場合、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" ヘッダーフィールドは、要求を処理するためにオリジンサーバが使用しているソフトウェアに関する情報を含みます。クライアントは相互運用性の問題の範囲を特定したり、特定のサーバの制約を回避するためにリクエストを調整したり、サーバや OS の使用状況解析のためにこれを利用します。オリジンサーバはレスポンスで Server ヘッダーフィールドを生成してもよい(MAY)です。

Server フィールド値は一つ以上の product 識別子と、それに続く 0 個以上のコメントで構成され、合わせてオリジンサーバソフトウェアとその重要なサブプロダクトを識別します。慣習として、product 識別子は重要度の高い順に列挙されます。各 product 識別子は名前とオプションのバージョンで構成されます(Section 10.1.5 参照)。

例:

Server: CERN/3.0 libwww/2.17

オリジンサーバは過度に細かな情報を含む Server を生成してはなりません(SHOULD NOT)し、第三者によるサブプロダクトの追加は制限すべきです(SHOULD)。過度に長大で詳細な 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 構文は、base64、base64url(URL およびファイル名で安全なアルファベット)、base32、または base16(16 進)エンコーディングを、パディングあり/なしのいずれでも格納できるように、66 個の予約されていない URI 文字にいくつかを追加した文字集合を許可しますが、空白は含みません([RFC4648])。

認証パラメータは name/value の組み合わせであり、name トークンは大文字小文字を区別せずに照合され、各パラメータ名はチャレンジごとに一度だけ出現しなければなりません(MUST)。

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

パラメータ値は "token" または "quoted-string" のいずれかで表現できます(Section 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. 資格情報

AuthorizationProxy-Authorization のフィールド値は、リクエストされたリソースの領域(realm)に対するクライアントの資格情報を含み、これらは過去に受け取ったチャレンジに基づいて作成されます。ユーザーエージェントは、理解している最も安全だと考える auth-scheme を選択し、必要に応じてユーザーから認証情報を取得して、それに基づいて値を作成するべきです。ヘッダーフィールド内での資格情報の送信は、接続の機密性に関する重大なセキュリティ考慮を伴います(Section 17.16.1参照)。

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

同様に、プロキシ資格情報を欠く、無効または部分的なプロキシ資格情報を含むリクエストを受け取った、認証を必要とするプロキシは、少なくとも一つの(場合によっては新しい)チャレンジを含む Proxy-Authenticate を含む 407 (Proxy Authentication Required) を生成することが SHOULD です。

有効な資格情報を受け取ったがアクセス権が不十分な場合、サーバは 403 (Forbidden) で応答するべきです(Section 15.5.4)。

HTTP はアクセス認証のためにこの単純なチャレンジ・レスポンス枠組みに限定するものではありません。トランスポート層での認証やメッセージのカプセル化、追加のヘッダーフィールドを用いるなど他の仕組みが使用され得ますが、それらは本仕様で定義されたものではありません。

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

11.5. 保護領域(Realm)の確立

realm 認証パラメータは、保護のスコープを示したい認証スキームのために予約されています。

保護領域(protection space) は、アクセスされるサーバのオリジン(Section 4.3.1 を参照)と、存在する場合の realm 値とを組み合わせて定義されます。これらの realm により、サーバ上の保護されたリソースを複数の保護領域に分割でき、それぞれが独自の認証スキームや認可データベースを持てます。realm 値は通常オリジンサーバによって割り当てられる文字列で、認証スキーム特有の追加的な意味を持ち得ます。なお、レスポンスは同一の auth-scheme を持ちながら異なる realm を持つ複数のチャレンジを含むことがあります。

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

保護領域の範囲、したがって資格情報が自動的に適用されうるリクエストは、追加情報がなければクライアントにとって必ずしも既知ではありません。認証スキームは保護領域の範囲を記述するパラメータを定義することができます。認証スキームで特に許可されない限り、単一の保護領域がそのサーバの範囲外に拡張することはできません。

歴史的理由から、送信者は引用文字列(quoted-string)構文のみを生成しなければなりません(MUST)。受信者は長年にわたり両表記を受け入れてきた既存クライアントとの相互運用性のために、token と quoted-string の両方をサポートしなければならない場合があります。

11.6. オリジンサーバへのユーザー認証

11.6.1. WWW-Authenticate

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

オリジンサーバが 401 (Unauthorized) を生成する場合、少なくとも一つのチャレンジを含む WWW-Authenticate ヘッダーフィールドを送信しなければなりません(MUST)。サーバは他のレスポンスメッセージでも、資格情報の供給(または別の資格情報)がレスポンスに影響するかもしれないことを示すために WWW-Authenticate を生成してもよい(MAY)です。

プロキシがレスポンスを転送する場合、そのレスポンス内のいかなる WWW-Authenticate ヘッダーフィールドも変更してはなりません(MUST NOT)。

ユーザーエージェントはフィールド値の解析に際して注意を払うべきです。フィールド値は複数のチャレンジを含み得、各チャレンジはカンマ区切りのパラメータ一覧を含むことができ、さらにヘッダーフィールド自体が複数回出現する可能性があるためです。

例えば:

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

このヘッダーフィールドは "Basic" スキームの realm="simple" のチャレンジと、"Newauth" スキームの realm="apps" のチャレンジを含んでいます。また "type" と "title" という追加のパラメータも含んでいます。

ただし、一部のユーザーエージェントはこの形式を認識しないことがあります。そのため、同一フィールド行に複数メンバーを含む WWW-Authenticate を送信するのは相互運用性の観点から問題が生じることがあります。

11.6.2. Authorization

"Authorization" ヘッダーフィールドは、オリジンサーバに対してユーザーエージェントが自身を認証することを可能にします。通常は 401 (Unauthorized) を受け取った後に使用されます。その値は、要求されたリソースの realm に対するユーザーエージェントの認証情報を含む資格情報から構成されます。

リクエストが認証されていて realm が指定されている場合、同じ資格情報は(認証スキーム自体が異なる要求を課していない限り)その realm 内の他のすべてのリクエストに対して有効であると見なされます(例: チャレンジ値に応じて資格情報が変わるスキームや同期時計を使うスキームを除く)。

プロキシがリクエストを転送する場合、そのリクエスト内の Authorization を変更してはなりません(MUST NOT)。認証されたリクエストに対するレスポンスの保存に関する詳細と要件は Section 3.5 of [CACHING] を参照してください。

11.6.3. Authentication-Info

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

フィールド値はパラメータ(name/value ペア)のリストであり、これは Section 11.3 で定義された "auth-param" 構文を使用します。本仕様は一般的な形式のみを示し、Authentication-Info を使用する認証スキームは個々のパラメータを定義します。例えば "Digest" 認証スキームは複数のパラメータを Section 3.5 of [RFC7616] で定義しています。

Authentication-Info フィールドは、リクエストメソッドやステータスコードに依存せず任意の HTTP レスポンスで使用できます。そのセマンティクスは、対応するリクエストの Authorization ヘッダーフィールド(Section 11.6.2)で示された認証スキームによって定義されます。

レスポンスを転送するプロキシはフィールド値を何ら変更してはなりません。

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

11.7. クライアントのプロキシ認証

11.7.1. Proxy-Authenticate

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

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

WWW-Authenticate の解析に関する注意点はこのヘッダーフィールドにも適用されます。詳細は Section 11.6.1 を参照してください。

11.7.2. Proxy-Authorization

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

Authorization と異なり、Proxy-Authorization はチャレンジを要求した次のインバウンドプロキシのみに適用されます。複数のプロキシがチェインで使われる場合、Proxy-Authorization は期待している最初のインバウンドプロキシによって消費されます。プロキシは、プロキシ間で協調して認証を行う仕組みである場合、クライアントからの資格情報を次のプロキシへ中継してもよい(MAY)です。

11.7.3. Proxy-Authentication-Info

"Proxy-Authentication-Info" レスポンスヘッダーフィールドは Authentication-Info と同等ですが、プロキシ認証に適用される点が異なります(対応するリクエストの Section 11.7.2 に示された認証スキームによってそのセマンティクスが定義されます)。

ただし Authentication-Info と異なり、Proxy-Authentication-Info ヘッダーフィールドはレスポンスチェーン上の次の外向きクライアントにのみ適用されます。これは、あるプロキシを選択したクライアントだけがその認証に必要な資格情報を持つ可能性が高いためです。しかし、同一管理ドメイン内で複数のプロキシが使われる構成では、資格情報がユーザーエージェントによって生成され階層を通して渡されることが一般的であり、その場合は Proxy-Authentication-Info が転送されているかのように見えます。

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

12. コンテンツ交渉

レスポンスがコンテンツを伝える場合(成功でもエラーでも)、オリジンサーバはその情報を異なる方法で表現できることが多くあります。例えば、異なるフォーマット、言語、またはエンコーディングなどです。同様に、異なるユーザーやユーザーエージェントは、利用可能な表現のうちどれが最適かに影響する異なる能力、特性、あるいは好みを持つかもしれません。これらの理由から、HTTP はコンテンツ交渉のためのメカニズムを提供します。

本仕様はプロトコル内で可視化できる三つのコンテンツ交渉パターンを定義します:サーバがユーザーエージェントの明示された好みに基づいて表現を選択する「プロアクティブ(proactive)交渉」(別名 server-driven negotiation)、サーバがユーザーエージェントが選べる表現の一覧を提供する「リアクティブ(reactive)交渉」(別名 agent-driven negotiation)、および過去のレスポンスでサーバが示した好みに基づいて将来のリクエストで利用する表現をユーザーエージェントが選択する「リクエストコンテンツ(request content)交渉」です。

他のコンテンツ交渉パターンには、表現がユーザーエージェントのパラメータに応じて選択的にレンダリングされる複数部分からなる「条件付きコンテンツ(conditional content)」、表現がスクリプトを含みユーザーエージェントの特性に応じた追加(より具体的な)要求を行う「アクティブコンテンツ(active content)」、および仲介者によってコンテンツ選択が行われる「Transparent Content Negotiation」([RFC2295])などがあります。これらのパターンは互いに排他的ではなく、それぞれ適用性や実用性に関してトレードオフがあります。

なお、いかなる場合においても、HTTP 自体はリソースのセマンティクスを認識しません。オリジンサーバが時間経過やコンテンツ交渉の様々な次元にわたって一貫してリクエストに応答するかどうか、したがって観測されるリソース表現の「同一性(sameness)」は、そのレスポンスを選択または生成するエンティティやアルゴリズムによって完全に決定されます。

12.1. プロアクティブ交渉

ユーザーエージェントがリクエストでコンテンツ交渉の好みを送信し、サーバ上のアルゴリズムが優先表現を選択するよう促す場合、これはプロアクティブ交渉(別名 server-driven negotiation)と呼ばれます。選択は、レスポンスのために利用可能な表現(言語、コンテンツコーディングなどの変化し得る次元)と、リクエスト内で提供される明示的な交渉ヘッダーフィールドやクライアントのネットワークアドレスや User-Agent フィールドの一部のような暗黙の特性とを比較して行われます。

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

プロアクティブ交渉には重大な欠点があります:

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

ユーザーエージェントは、オリジンサーバが要求されたリソースに対して必ずしもプロアクティブ交渉を実装しているとは限らないか、あるいはユーザーエージェントの好みに従わないレスポンスを送る方が 406 (Not Acceptable) を返すよりも良いと判断するかもしれないため、プロアクティブ交渉の好みが一貫して尊重されると期待してはなりません。

プロアクティブ交渉の対象となるレスポンスでは、サーバが選択アルゴリズムで使用したリクエスト情報の部分を示すために、レスポンスに Vary ヘッダーフィールド(Section 12.5.5)がしばしば送られます。

ユーザーエージェントが プロアクティブ交渉 に参加するために送信できるリクエストヘッダーフィールドとして、AcceptAccept-CharsetAccept-Encoding、および Accept-Language が以下で定義されています。これらのフィールドで送られる優先度は、ターゲットリソースの表現だけでなく、エラーや処理状態の表現、さらにはプロトコル内に現れる雑多なテキスト文字列にも適用されます。

12.2. リアクティブ交渉

リアクティブ交渉(別名 agent-driven negotiation)では、コンテンツの選択(ステータスコードに関わらず)は初回レスポンスを受け取った後にユーザーエージェントによって行われます。リアクティブ交渉のメカニズムは、代替表現への参照リストのように単純であり得ます。

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

サーバは初回に表現を送らず、代替一覧のみを送信してユーザーエージェントによるリアクティブ交渉を示すことを選ぶかもしれません。例えば、300 (Multiple Choices) および 406 (Not Acceptable) のレスポンスに列挙される代替は、利用可能な表現に関する情報を含み、ユーザーやユーザーエージェントが選択を行えるようにします。

リアクティブ交渉は、レスポンスが一般的に型・言語・エンコーディングのようなよく使われる次元で変化する場合、オリジンサーバがリクエストを調べてもユーザーエージェントの能力を判断できない場合、またはパブリックキャッシュを用いてサーバ負荷を分散しネットワーク使用量を減らす場合に有利です。

リアクティブ交渉は代替一覧をユーザーエージェントに送る必要があるという欠点があり、ヘッダセクションで送られるとユーザーが感じる待ち時間を劣化させ、代替表現を得るために二度目のリクエストが必要になります。さらに本仕様は自動選択をサポートするメカニズムを定義していませんが、そのようなメカニズムの開発を妨げるものではありません。

12.3. リクエストコンテンツ交渉

サーバのレスポンスに交渉の好みが送られる場合、その列挙された好みはリクエストコンテンツ交渉と呼ばれます。なぜならそれらはそのリソースへの将来のリクエストで適切なコンテンツを選択することに影響を与えることを意図しているからです。例えば、レスポンスで送信される AcceptSection 12.5.1)や Accept-EncodingSection 12.5.3) ヘッダーフィールドは、将来そのリソースへのリクエストで好まれるメディア型やコンテンツコーディングを示すために送られ得ます。

同様に、Section 3.1 of [RFC5789] は "Accept-Patch" レスポンスヘッダーフィールドを定義しており、PATCH リクエストで受け入れられるコンテンツ型を発見できるようにします。

12.4. コンテンツ交渉フィールドの特徴

12.4.1. 不在(Absence)

各コンテンツ交渉フィールドについて、そのフィールドを含まないリクエストは、その次元の交渉において送信者が特に好みを持たないことを示します。

リクエストにコンテンツ交渉ヘッダーフィールドが存在し、利用可能なレスポンス表現のいずれもそれに従って受け入れ可能と見なせない場合、オリジンサーバはそのヘッダーフィールドを尊重して 406 (Not Acceptable) を返すか、ヘッダーフィールドを無視してそのリクエストヘッダーフィールドに対するコンテンツ交渉の対象外として扱うことができます。しかしこれはクライアントがその表現を利用可能であることを保証するものではありません。

12.4.2. 品質値(Quality Values)

本仕様で定義されるコンテンツ交渉フィールドは共通のパラメータ "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 桁より多く生成してはなりません(MUST NOT)。ユーザーによるこれらの値の設定も同様に制限されるべきです。

12.4.3. ワイルドカード値(Wildcard Values)

多くのこれらのヘッダーフィールドは、指定された場合に未指定の値を選択するワイルドカード値("*")を定義します。ワイルドカードが存在しない場合、フィールド内で明示的に言及されていない値は受け入れ不可能と見なされます。Vary 内では、ワイルドカード値は分散が無制限であることを意味します。

12.5. コンテンツ交渉フィールド

12.5.1. Accept

"Accept" ヘッダーフィールドは、ユーザーエージェントがレスポンスのメディア型に関する好みを指定するために使用できます。例えば、インライン画像を要求する場合のようにリクエストが特定の小さな型の集合に限定されることを示すために Accept を使用できます。

サーバがレスポンスで送信する場合、Accept は同じリソースへの将来のリクエストでどのコンテンツ型が好まれるかについての情報を提供します。

  Accept = #( media-range [ weight ] )

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

アスタリスク "*" 文字はメディア型を範囲にグループ化するために用いられ、"*/*" はすべてのメディア型を示し、"type/*" はその type のすべてのサブタイプを示します。media-range にはその範囲に適用されるメディアタイプパラメータを含めることができます。

各 media-range の後に、適用可能なメディアタイプパラメータ(例:charset)および相対的な重みを示すオプションの "q" パラメータ(Section 12.4.2)を続けることができます。

以前の仕様では重みパラメータの後に追加拡張パラメータが現れることを許していましたが、accept extension 文法(accept-params, accept-ext)は複雑で実務で用いられていなかったため除去され、新しいヘッダーフィールドで展開する方が容易です。重みを送信する送信者は "q" を最後に送ることが望ましい(SHOULD)。受信者はパラメータ順に関係なく "q" という名前のパラメータを重みとして処理すべきです(SHOULD)。

例:

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 を送ってほしい」となります。

メディア範囲はより具体的なメディア範囲や特定のメディア型によって上書きされ得ます。ある型に複数のメディア範囲が適用される場合、最も具体的な参照が優先されます。例えば:

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

上は次の優先順位を持ちます:

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

与えられた型に関連付けられるメディアタイプの品質係数は、その型に一致する最高優先度のメディア範囲を見つけることで決定されます。例えば:

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

は次の値をもたらします:

Table 5
Media Type Quality Value
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" ヘッダーフィールドは、テキストレスポンスの文字セットに関するユーザーエージェントの好みを示すために送信され得ます。例えば、より包括的または特殊用途の文字セットを理解できるユーザーエージェントは、それらの文字セットで情報を表現できるオリジンサーバにその能力を示すことができます。

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

文字セット名は Section 8.3.2 で定義されています。ユーザーエージェントは各文字セットに品質値を関連付けてユーザーの相対的好みを示してもよい(MAY)(Section 12.4.2参照)。例:

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

Accept-Charset に特別値 "*" が含まれている場合、フィールド内で他に言及されていないすべての文字セットと一致します。

12.5.3. Accept-Encoding

"Accept-Encoding" ヘッダーフィールドは、コンテンツコーディング(Section 8.4.1)の使用に関する好みを示すために使用できます。

ユーザーエージェントがリクエストで送信する場合、Accept-Encoding はレスポンスで受け入れ可能なコンテンツコーディングを示します。

サーバがレスポンスで送信する場合、Accept-Encoding は同じリソースへの将来のリクエストにおいてどのコンテンツコーディングが好まれるかについての情報を提供します。

"identity" トークンは「エンコーディングなし」の同義語として使用され、エンコーディングが望まれない場合を伝えます。

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

各 codings 値にはそのエンコーディングに対する優先度を表す品質値(重み)を関連付けることができます(Section 12.4.2)。Accept-Encoding 内のアスタリスク "*" はフィールド内で明示的に列挙されていない任意の利用可能なコンテンツコーディングと一致します。

例:

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

サーバは特定の表現に対するコンテンツコーディングが受け入れ可能かどうかを以下の規則で判定します:

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

表現は複数のコンテンツコーディングで符号化され得ます。しかし、多くのコンテンツコーディングは同じ目的(例:データ圧縮)を達成する代替手段です。同じ目的を持つ複数のコンテンツコーディングの間で選択する場合、最も高い非ゼロ qvalue を持つ受け入れ可能なコーディングが優先されます。

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

レスポンスに Accept-Encoding ヘッダーフィールドが含まれている場合、それは対応するリクエストでそのリソースが受け入れたかったコンテンツコーディングを示します。フィールド値の評価はリクエスト時と同様です。

この情報は対応するリクエスト固有であることに注意してください;同一サーバ上の他のリソースでサポートされるエンコーディングの集合は異なり得、時間と共に変化したりリクエストの他の側面(例えばリクエストメソッド)に依存したりします。

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

Accept-Encoding の最も一般的な使用例は、クライアントによる楽観的なコンテンツコーディングの使用に対して 415 で応答する場合のレスポンスです。しかしながら、このヘッダーフィールドは将来のやり取りを最適化するために、クライアントにコンテンツコーディングがサポートされていることを示すためにも使用できます。例えば、リクエストコンテンツが大きく圧縮が正当化されるがクライアントが失敗した場合、リソースは 2xx (Successful) レスポンスにそれを含めることがあります。

12.5.4. Accept-Language

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

各 language-range に対して品質値を関連付け、ユーザーがその範囲で指定された言語に対してどれだけ好むかの推定を表現できます(Section 12.4.2を参照)。例:

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

は「デンマーク語を優先するが、英国英語や他の英語も受け入れる」という意味になります。

一部の受信者は、品質値が等しいタグに対してリスト中の順序を降順優先度の指示として扱いますが、この挙動は信頼できません。互換性を高めるため、多くのユーザーエージェントは各言語タグに固有の品質値を割り当てつつ、品質の降順で列挙することがあります。言語優先リストの追加議論は Section 2.3 of [RFC4647] を参照してください。

マッチングについては、いくつかのマッチング方式が Section 3 of [RFC4647] に定義されています。実装は要件に最適なマッチング方式を提供できます。Basic Filtering 方式([RFC4647]Section 3.3.1)は以前の HTTP 定義と同一です。

ユーザーの言語設定を毎回のリクエストで完全に送信することはプライバシー期待に反する場合があります(Section 17.13)。

可読性は個々のユーザーに大きく依存するため、ユーザーエージェントは言語優先設定をユーザーが制御できるようにする必要があります(ユーザーエージェント自体の設定やシステム設定に委ねるなど)。そのような制御をユーザーに提供しないユーザーエージェントは Accept-Language を送信してはなりません(MUST NOT)。

12.5.5. Vary

レスポンスの "Vary" ヘッダーフィールドは、メソッドとターゲット URI を除いて、どのリクエストメッセージの部分がこのレスポンスの内容選択に影響を与え得るかを記述します。

  Vary = #( "*" / field-name )

Vary フィールド値はワイルドカード "*" か、選択ヘッダーフィールドとして動作した可能性のあるリクエストフィールド名のリストのいずれかです。選択のためのヘッダーフィールドは本仕様で定義されたものに限りません。

メンバー "*" を含むリストは、リクエストの他の側面(例えばクライアントのネットワークアドレスなどメッセージ構文外の要素)もレスポンス表現の選択に寄与した可能性があることを示します。受信者はこのレスポンスが後のリクエストに適切かどうかを判定できず、リクエストをオリジンサーバに転送する必要があるかもしれません。プロキシは Vary の値に "*" を生成してはなりません(MUST NOT)。

例えば、次を含むレスポンスは

Vary: accept-encoding, accept-language

は、オリジンサーバがこのレスポンスの表現を選択する際にリクエストの Accept-Encoding および Accept-Language ヘッダーフィールド(またはそれらの欠如)を決定要因として用いた可能性があることを示します。

フィールド名のリストを含む Vary には二つの目的があります:

  1. キャッシュ受信者に対し、このレスポンスを後のリクエストに用いるのは、元のリクエストと同じリストされたヘッダーフィールド値を持つ場合に限る、またはオリジンサーバが再利用を検証した場合に限ることを通知すること(Section 4.1 of [CACHING] を参照)。言い換えれば、Vary は新しいリクエストが保存済みのキャッシュエントリにマッチするために必要なキャッシュキーを拡張します。

  2. ユーザーエージェント受信者に対し、このレスポンスがコンテンツ交渉(Section 12)の対象であったこと、並びにリストされたヘッダーフィールドに別の値が提供された場合に異なる表現が将来のリクエストで送られ得ることを通知すること。

オリジンサーバは、レスポンス内容を後続リクエストに対して選択的に再利用してほしい場合、キャッシュ可能なレスポンスに対して Vary ヘッダーフィールドを生成することが望ましい(SHOULD)です。一般に、これはレスポンス内容が選択ヘッダーフィールドで表現された好みに合わせて調整されている場合に該当します。例えばオリジンサーバがリクエストの Accept-Language に基づいてレスポンスの言語を選択した場合です。

Vary は、コンテンツ選択における分散がキャッシュのパフォーマンス影響よりも重要でないとオリジンサーバが判断する場合には省略され得ます。特に再利用がキャッシュレスポンスディレクティブによって既に制限されている時などです(Section 5.2 of [CACHING] を参照)。

Authorization フィールド名を Vary に送る必要はありません。なぜならそのフィールドの定義により異なるユーザーに対するレスポンスの再利用は禁止されているからです(Section 11.6.2)。同様に、レスポンス内容がネットワーク領域によって選択または影響されているが、オリジンサーバが受信者が別の領域に移動してもキャッシュされたレスポンスを再利用してほしいと考える場合、オリジンサーバはそのような分散を Vary に示す必要はありません。

13. 条件付きリクエスト

条件付きリクエストは、ターゲットリソースに対してリクエストメソッドを適用する前にテストされるべき前提条件を示す1つ以上のリクエストヘッダーフィールドを持つ HTTP リクエストです。Section 13.2 は、前提条件をいつ評価するかおよび複数の前提条件が存在する場合の優先順位を定義します。

条件付き GET リクエストは HTTP キャッシュの更新にとって最も効率的なメカニズムです [CACHING]。条件は PUT や DELETE のような状態を変更するメソッドにも適用でき、並行して動作している他のクライアントの作業を一方のクライアントが誤って上書きしてしまう「失われた更新(lost update)」問題を防止できます。

13.1. 前提条件(Preconditions)

前提条件は通常、ターゲットリソース全体の状態(その現在の値集合)または以前に取得した表現で観測された状態(その集合中の一つの値)に関して定義されます。リソースがそれぞれ固有の可観測状態を持つ複数の現在の表現を持つ場合、前提条件は各リクエストが selected representation にマッピングされることが時間を通じて一貫していると仮定します。いずれにせよ、マッピングが一貫しないかサーバが適切な表現を選択できない場合、前提条件が false と評価されても害は生じません。

以下に定義される各前提条件は、ターゲットリソースの以前の表現から取得された一連のバリデータと、選択された表現の現在のバリデータ状態(Section 8.8)との比較から構成されます。したがって、これらの前提条件はクライアントが知っている特定の状態以降にターゲットリソースの状態が変化したかどうかを評価します。そのような評価の効果は、メソッドのセマンティクスと条件の選択に依存し、Section 13.2 で定義されています。

他の仕様によって拡張フィールドとして定義される前提条件は、すべての受信者に対する条件を課したり、ターゲットリソースの一般的な状態や複数のリソース群に条件を付けたりすることがあります。例えば WebDAV の "If" ヘッダーフィールドは、受信者がそのフィールドを理解し実装する場合にロックなど複数リソースのさまざまな側面を条件にすることができます([WEBDAV], Section 10.4)。

前提条件の拡張性は、前提条件が未知であっても安全に無視できる場合(If-Modified-Since のように)、特定のユースケースで展開が期待できる場合、またはターゲットリソースの何らかの他の特性によって実装が示される場合にのみ可能です。これは共通標準の相互に合意された展開に焦点を当てることを奨励します。

13.1.1. If-Match

"If-Match" ヘッダーフィールドは、フィールド値が "*" の場合に受信者のオリジンサーバがターゲットリソースの少なくとも一つの現在の表現を持っていること、あるいはフィールド値で提供されたエンティティタグの一覧のいずれかと一致するエンティティタグを持つターゲットリソースの現在の表現を持っていることを条件としてリクエストメソッドを適用します。

オリジンサーバは If-Match のエンティティタグを比較する際に強比較関数を使用しなければなりません(Section 8.8.3.2)。これはクライアントが表現データにいかなる変更があってもメソッドの適用を防止することを意図しているためです(MUST)。

  If-Match = "*" / #entity-tag

例:

If-Match: "xyzzy"
If-Match: "xyzzy", "r2d2xxxx", "c3piozzzz"
If-Match: *

If-Match は、同じリソースに対して複数のユーザーエージェントが並行して動作する可能性がある場合の誤った上書きを防ぐために、状態変更メソッド(例: POST, PUT, DELETE)で最もよく使われます(いわゆる「失われた更新」問題を防ぐため)。一般に、選択または変更を伴う任意のメソッドで使用でき、選択された表現の現在のエンティティタグが If-Match フィールド値のメンバーでない場合にリクエストを中止します(selected representation)。

オリジンサーバが表現を選択し、かつ If-Match ヘッダーフィールドを含むリクエストを受け取った場合、オリジンサーバはメソッドを実行する前に Section 13.2MUST)。

受信した If-Match ヘッダーフィールドを評価するために:

  1. If フィールド値が "*" の場合、オリジンサーバがターゲットリソースの現在の表現を持っているならば条件は true です。
  2. If フィールド値がエンティティタグの一覧である場合、一覧中のいずれかのタグが選択された表現のエンティティタグと一致するならば条件は true です。
  3. それ以外の場合、条件は false です。

If-Match 条件を評価したオリジンサーバは、その条件が false と評価された場合に要求されたメソッドを実行してはなりません(MUST NOT)。代わりに、オリジンサーバは条件付きリクエストが失敗したことを示すために 412 (Precondition Failed) で応答してもよい(MAY)。あるいは、要求が選択された表現に既に適用されているように見える状態変更操作である場合、オリジンサーバは 2xx (Successful) で応答してもよい(つまり、ユーザーエージェントが prior response を失ったなどの理由でその変更が成功したことを認識していない可能性がある)。

変更要求が既に適用されていると見なされる場合に成功レスポンスを返すことは多くの作成系ユースケースで効率的ですが、非常に類似した変更要求を複数のユーザーエージェントが互いに協調せずに行う場合にはリスクを伴います。例えば、複数のユーザーエージェントが共通リソースにセマフォのように書き込む(非原子的なインクリメントなど)と衝突して重要な状態遷移を失う可能性があります。そのようなリソースに対しては、オリジンサーバは安全でないメソッドの失敗した前提条件に対して 412 を送出することを厳格に行う方が良いでしょう。他の場合では、成功レスポンスから ETag フィールドを除外することがユーザーエージェントに GET を次のリクエストとして行わせ、リソースの現在の状態に関する混乱を排除することを促すかもしれません。

クライアントは If-Match ヘッダーフィールドを GET リクエストに送信して、選択された表現が一致しない場合に 412 (Precondition Failed) 応答を望むことを示すことができますが(MAY)、これはレンジリクエスト(Section 14)でのみ有用であり、新しい表現を望まない場合に以前受け取った部分的表現を完成させるために使われます。レンジリクエストでクライアントが新しい表現を好む場合は If-RangeSection 13.1.5)の方が適しています。

キャッシュや仲介者は If-Match を無視してもよい(MAY)——その相互運用性機能はオリジンサーバにのみ必要なためです。

一覧値に "*" と他の値(他の "*" のインスタンスを含む)を含む If-Match ヘッダーフィールドは構文的に無効であり(生成してはならない)、相互運用性も期待できません。

13.1.2. If-None-Match

"If-None-Match" ヘッダーフィールドは、フィールド値が "*" の場合に受信者(キャッシュまたはオリジンサーバ)がターゲットリソースの現在の表現を一切持っていないこと、または選択された表現のエンティティタグがフィールド値に列挙されたタグのいずれとも一致しないことを条件としてリクエストメソッドを適用するものです。

受信者は If-None-Match のエンティティタグを比較する際に弱比較関数を使用しなければなりません(Section 8.8.3.2)。弱いエンティティタグは表現データに変化があってもキャッシュ検証に用いられる可能性があるためです(MUST)。

例:

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 リクエストで使用され、キャッシュされた情報を最小限のトランザクションオーバーヘッドで効率的に更新することを可能にします。クライアントがエンティティタグを持つ1つ以上の保存済みレスポンスを更新したい場合、クライアントは GET リクエストを行う際にこれらエンティティタグの一覧を含む If-None-Match を生成するべきです(SHOULD)。これにより受信サーバは選択された表現が一致する場合に 304 (Not Modified) を返すことができます。

If-None-Match は "*" の値を使用して、クライアントがリソースに現在の表現が存在しないと信じている場合に、(例: PUT のような)安全でないリクエストメソッドが既存の表現を誤って変更するのを防ぐためにも使用できます。これは複数クライアントがターゲットリソースの初期表現を作成しようとする際に生じる「失われた更新」問題の一種です。

オリジンサーバが表現を選択し、かつ If-None-Match ヘッダーフィールドを含むリクエストを受け取った場合、オリジンサーバはメソッドを実行する前に Section 13.2 に従って If-None-Match 条件を評価しなければなりません(MUST)。

受信した If-None-Match ヘッダーフィールドを評価するために:

  1. If フィールド値が "*" の場合、オリジンサーバがターゲットリソースの現在の表現を持っているならば条件は false です。
  2. If フィールド値がエンティティタグの一覧である場合、一覧中のどれかのタグが選択された表現のエンティティタグと一致するならば条件は false です。
  3. それ以外の場合、条件は true です。

If-None-Match 条件を評価したオリジンサーバは、その条件が false と評価された場合に要求されたメソッドを実行してはなりません(MUST NOT)。代わりに、オリジンサーバは次のいずれかで応答しなければなりません(MUST):a) リクエストメソッドが GET または HEAD の場合は 304 (Not Modified)、b) その他のリクエストメソッドの場合は 412 (Precondition Failed)

受信した If-None-Match ヘッダーフィールドのキャッシュ処理に関する要求は Section 4.3.2 of [CACHING] に定義されています。

"*" と他の値(別の "*" を含む)を含む一覧値を持つ 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 を無視しなければなりません(MUST)。If-None-Match の条件は If-Modified-Since の条件に対するより正確な置換と見なされ、両者が組み合わされるのは If-None-Match を実装しない古い仲介者との相互運用のためだけです。

受信者は、受信した If-Modified-Since フィールド値が有効な HTTP-date でない場合、そのヘッダーフィールドを無視しなければなりません(複数メンバーがある場合やリクエストメソッドが GET または HEAD でない場合も無視する)(MUST)。

受信者は、リソースに変更日時が利用できない場合、If-Modified-Since を無視しなければなりません(MUST)。

受信者は If-Modified-Since フィールド値のタイムスタンプをオリジンサーバの時計に基づいて解釈しなければなりません(MUST)。

If-Modified-Since は通常二つの目的で使用されます:1) エンティティタグを持たないキャッシュ表現の効率的な更新、2) 最近変更されたリソースに取得の範囲を限定するため。

キャッシュ更新に使用される場合、キャッシュは典型的に保存済みメッセージの Last-Modified ヘッダーフィールドの値を If-Modified-Since のフィールド値生成に用います。この動作はクロックが同期していない場合やサーバが正確なタイムスタンプ一致のみを尊重する場合に最も相互運用的です。ただし、キャッシュは保存メッセージに Last-Modified が含まれない場合に cached message の Date や受信時のクライアントの時計に基づいてフィールド値を生成することがあります。

最近の時間窓に取得を限定するために使用される場合、ユーザーエージェントは自身の時計または以前のレスポンスでサーバから受け取った Date ヘッダーフィールドに基づいて If-Modified-Since を生成します。選択された表現の Last-Modified に基づく正確なタイムスタンプ一致を選ぶオリジンサーバは、指定されたウィンドウ内に変化したもののみにデータ転送を限定するようユーザーエージェントを助けることはできません。

オリジンサーバが表現を選択し、かつ If-Modified-Since ヘッダーフィールドを If-None-Match なしで含むリクエストを受け取った場合、オリジンサーバはメソッドを実行する前に Section 13.2 に従って If-Modified-Since 条件を評価することが望ましい(SHOULD)。

受信した If-Modified-Since ヘッダーフィールドを評価するために:

  1. 選択された表現の最終更新日時がフィールド値で提供された日付より前か等しい場合、条件は false です。
  2. それ以外の場合、条件は true です。

If-Modified-Since 条件を評価したオリジンサーバは、条件が false と評価された場合に要求されたメソッドを実行すべきではありません(SHOULD NOT)。代わりに、オリジンサーバは以前にキャッシュされたレスポンスの識別または更新に有用なメタデータのみを含む 304 (Not Modified) を生成することが望ましい(SHOULD)。

受信した If-Modified-Since のキャッシュ処理に関する要件は Section 4.3.2 of [CACHING] に定義されています。

13.1.4. If-Unmodified-Since

"If-Unmodified-Since" ヘッダーフィールドは、選択された表現の最終更新日時がフィールド値に提供された日付より前または等しいことを条件としてリクエストメソッドを適用します。このフィールドは、ユーザーエージェントが表現のエンティティタグを持たない場合に If-Match と同じ目的を果たします。

フィールドの例:

If-Unmodified-Since: Sat, 29 Oct 1994 19:43:31 GMT

受信者はリクエストに If-Match が含まれている場合、If-Unmodified-Since を無視しなければなりません(MUST)。If-Match の条件は If-Unmodified-Since の条件に対するより正確な置換と見なされ、両者が組み合わされるのは古い仲介者との相互運用のためだけです。

受信者は If-Unmodified-Since のフィールド値が有効な HTTP-date でない場合(複数日付の一覧に見える場合を含む)、そのフィールドを無視しなければなりません(MUST)。

受信者はリソースに変更日時が利用できない場合、If-Unmodified-Since を無視しなければなりません(MUST)。

受信者は If-Unmodified-Since フィールド値のタイムスタンプをオリジンサーバの時計に基づいて解釈しなければなりません(MUST)。

If-Unmodified-Since は、状態を変更するメソッド(例: POST, PUT, DELETE)と共に、表現がエンティティタグを提供しない場合に複数のユーザーエージェントが並行して動作する際の誤った上書きを防ぐために最もよく使用されます(「失われた更新」問題を防ぐため)。一般に、選択または変更を伴う任意のメソッドで使用でき、選択された表現の最終更新日時が If-Unmodified-Since フィールド値に示された日付以降に変化している場合にリクエストを中止します(selected representation)。

オリジンサーバが表現を選択し、かつ If-Unmodified-Since を If-Match なしで含むリクエストを受け取った場合、オリジンサーバはメソッドを実行する前に Section 13.2 に従って If-Unmodified-Since 条件を評価しなければなりません(MUST)。

受信した If-Unmodified-Since ヘッダーフィールドを評価するために:

  1. 選択された表現の最終更新日時がフィールド値で提供された日付より前または等しい場合、条件は true です。
  2. それ以外の場合、条件は false です。

If-Unmodified-Since 条件を評価したオリジンサーバは、その条件が false と評価された場合に要求されたメソッドを実行してはなりません(MUST NOT)。代わりに、オリジンサーバは条件付きリクエストが失敗したことを示すために 412 (Precondition Failed) で応答してもよい(MAY)。あるいは、要求が選択された表現に既に適用されているように見える場合、オリジンサーバは 2xx (Successful) で応答してもよい(ユーザーエージェントが prior response を失った等の理由で変更がすでに成功している可能性があるため)。

変更要求が既に適用されていると見なされる場合に成功レスポンスを返すことは多くのユースケースで効率的ですが、協調しない複数のユーザーエージェントが非常に類似した変更要求を行う場合にはリスクがあります。そのような場合、オリジンサーバは安全でないメソッドの失敗した前提条件に対して 412 を厳格に送る方が良いでしょう。

クライアントは If-Unmodified-Since を GET リクエストで送信して、選択された表現が変更されている場合に 412 (Precondition Failed) を望むことを示せます(MAY)。しかしこれはレンジリクエスト(Section 14)でのみ有用であり、部分的に受け取った表現を完成させたい場合に限られます。レンジリクエストでクライアントが新しい表現を好む場合は If-RangeSection 13.1.5)が適しています。

キャッシュや仲介者は If-Unmodified-Since を無視してもよい(MAY)——その相互運用性機能はオリジンサーバにのみ必要なためです。

13.1.5. If-Range

"If-Range" ヘッダーフィールドは、If-MatchIf-Unmodified-Since に類似する特殊な条件付きリクエストメカニズムを提供しますが、バリデータが一致しない場合に Range ヘッダーフィールドを無視するよう受信者に指示し、その結果 412 (Precondition Failed) ではなく新しい selected representation の転送を行わせます。

クライアントが表現の部分的コピーを持ち、完全な最新コピーを得たい場合、Range ヘッダーフィールドを条件付き GET と共に使用できます(If-Unmodified-Since と/または If-Match のいずれかまたは両方)。しかし、前提条件が表現の変更により失敗すると、クライアントは全体の現在表現を取得するために二度目のリクエストを行わなければなりません。

"If-Range" ヘッダーフィールドはクライアントがその二回目のリクエストを「ショートサーキット」できるようにします。非公式にはその意味は次の通りです:表現が変更されていなければ私が Range で要求している部分を送ってください;そうでなければ表現全体を送ってください。

有効な entity-tag は、最初の三文字を調べることで有効な HTTP-date と区別できます(DQUOTE で始まるかどうかで判別)。

クライアントは Range ヘッダーフィールドを含まないリクエストで If-Range を生成してはなりません(MUST NOT)。サーバは Range ヘッダーフィールドを含まないリクエストで受信した If-Range を無視しなければなりません(MUST)。また、ターゲットリソースが Range リクエストをサポートしない場合に受信した If-Range ヘッダーフィールドはオリジンサーバが無視しなければなりません(MUST)。

クライアントは弱いとマークされたエンティティタグを含む If-Range を生成してはなりません(MUST NOT)。また、If-Range に HTTP-date を含めてはなりません(MUST NOT)、ただし対応する表現に対するエンティティタグを持たない場合で、その日付が Section 8.8.2.2 で定義される強いバリデータである場合は例外です。

サーバは Range リクエストで If-Range を受け取った場合、メソッドを実行する前に Section 13.2 に従って条件を評価しなければなりません(MUST)。

HTTP-date を含む If-Range を評価するために:

  1. 提供された HTTP-date バリデータが Section 8.8.2.2 で定義される強いバリデータでない場合、条件は false です。
  2. 提供された HTTP-date バリデータが選択された表現の Last-Modified フィールド値と正確に一致する場合、条件は true です。
  3. それ以外の場合、条件は false です。

entity-tag を含む If-Range を評価するために:

  1. 提供された entity-tag バリデータが選択された表現の ETag フィールド値と強比較関数によって正確に一致する場合、条件は true です(Section 8.8.3.2)。
  2. それ以外の場合、条件は false です。

If-Range ヘッダーフィールドの受信者は、If-Range 条件が false と評価された場合に Range を無視しなければなりません(MUST)。そうでない場合、受信者は要求どおりに Range を処理することが望まれます(SHOULD)。

If-Range の比較は正確一致によることに注意してください。これはバリデータが HTTP-date の場合でも同様であり、If-Unmodified-Since の評価で用いられる「以前か等しい」比較とは異なります。

13.2. 前提条件の評価(Evaluation of Preconditions)

13.2.1. 評価のタイミング(When to Evaluate)

以下に除外されている場合を除き、受信したリクエスト前提条件は、受信者キャッシュまたはオリジンサーバが通常のリクエストチェックを正常に実行した後かつリクエストコンテンツ(ある場合)を処理する直前に評価しなければなりません(MUST)。サーバは、もしそれらの前提条件を無くして同じリクエストに対して処理前に返すレスポンスが 2xx (Successful) または 412 (Precondition Failed) 以外のステータスコードであるならば、受信したすべての前提条件を無視しなければなりません。言い換えれば、重大な処理が発生する前に検出できるリダイレクトや失敗は前提条件の評価より優先されます。

ターゲットリソースのオリジンサーバでなく、かつターゲットリソースに対するリクエストのキャッシュとして機能できないサーバは、本仕様で定義された条件付きリクエストヘッダーフィールドを評価してはなりません(MUST NOT)。またリクエストが転送される場合はそれらを転送しなければなりません(MUST)、なぜなら生成したクライアントはそれらが現在の表現を提供できるサーバで評価されることを意図しているからです。同様に、CONNECT, OPTIONS, TRACE のように選択または変更を伴わないメソッドで受信した場合は、本仕様で定義された条件付きリクエストヘッダーフィールドを無視しなければなりません(MUST)。

プロトコル拡張は、前提条件が評価される条件やその評価結果の帰結を変更することがあります。例えば immutable cache 指示子([RFC8246] によって定義)は、キャッシュが新鮮なレスポンスを保持している場合に条件付きリクエストの転送を行わないように指示します。

条件付きリクエストヘッダーフィールドは HEAD メソッドで使用可能と定義されています(HEAD のセマンティクスを GET と一貫させるため)が、条件付きの HEAD を送ることに大きな意味はありません。成功レスポンスは 304 (Not Modified) レスポンスと同程度の大きさであり、412 (Precondition Failed) より有用であるためです。

13.2.2. 前提条件の優先順位(Precedence of Preconditions)

リクエストに複数の条件付きリクエストヘッダーフィールドが存在する場合、どの順序でフィールドを評価するかが重要になります。実務では、本ドキュメントで定義されたフィールドは単一の論理的順序で一貫して実装されています。というのも、「失われた更新」対策はキャッシュ検証より厳格な要件を持ち、検証済みキャッシュは部分的レスポンスより効率的であり、エンティティタグは日付バリデータより正確であると想定されるからです。

受信者キャッシュまたはオリジンサーバは、本仕様で定義されたリクエスト前提条件を次の順序で評価しなければなりません(MUST):

  1. 受信者がオリジンサーバであり If-Match が存在する場合、If-Match 前提条件を評価します:

    • 真であれば、ステップ 3 に進みます
    • 偽であれば、状態変更リクエストが既に成功していると判断できない限り 412 (Precondition Failed) で応答します(詳細は Section 13.1.1 を参照)
  2. 受信者がオリジンサーバであり If-Match が存在せず、かつ If-Unmodified-Since が存在する場合、If-Unmodified-Since 前提条件を評価します:

    • 真であれば、ステップ 3 に進みます
    • 偽であれば、状態変更リクエストが既に成功していると判断できない限り 412 (Precondition Failed) で応答します(詳細は Section 13.1.4 を参照)
  3. If-None-Match が存在する場合、If-None-Match 前提条件を評価します:

  4. メソッドが GET または HEAD であり、If-None-Match が存在せず、かつ If-Modified-Since が存在する場合、If-Modified-Since 前提条件を評価します:

    • 真であれば、ステップ 5 に進みます
    • 偽であれば 304 (Not Modified) で応答します
  5. メソッドが GET で、かつ RangeIf-Range の両方が存在する場合、If-Range 前提条件を評価します:

  6. それ以外の場合、

    • 要求されたメソッドを実行し、その成功または失敗に応じて応答します。

HTTP の拡張が追加の条件付きリクエストヘッダーフィールドを定義する場合、それらのフィールドを本ドキュメントで定義されたものや実務で見られる他の条件と比較してどの順序で評価するかを定義するべきです。

14. レンジリクエスト

クライアントはしばしば、リクエストのキャンセルやコネクションの切断によりデータ転送が中断されることに遭遇します。クライアントが部分的な表現を保存している場合、表現全体を再転送するよりも後続のリクエストでその残りを要求することが望ましいです。同様に、ローカルストレージが限られているデバイスは、非常に大きな文書の単一ページや埋め込み画像の寸法など、より大きな表現の一部分だけを要求できることから利益を得ることがあります。

レンジリクエストは HTTP の OPTIONAL な機能であり、この機能を実装していない受信者(または対象リソースに対してサポートしていない受信者)が通常の GET リクエストとして応答できるよう設計されており、相互運用性に影響を与えません。部分的レスポンスは、機能を実装していないキャッシュによって完全レスポンスと誤解されないように、別個のステータスコードで示されます。

14.1. レンジ単位

表現データは、そのデータのコンテンツコーディングやメディアタイプに固有のアドレス可能な構造単位が存在する場合に、サブレンジに分割できます。例えば、オクテット(別名バイト)境界はすべての表現データに共通する構造単位であり、データの開始または末尾からのオフセットとしてバイトの範囲を識別することでデータの分割を表現できます。

この一般的な range unit の概念は、レスポンスでレンジリクエストのサポートを広報する Accept-RangesSection 14.3)、表現のどの部分が要求されるかを区切るための RangeSection 14.2)のリクエストヘッダーフィールド、およびどの部分が転送されているかを記述する Content-RangeSection 14.4)ヘッダーフィールドで使用されます。

すべてのレンジ単位名は大文字小文字を区別せず、Section 16.5.1 で定義される "HTTP Range Unit Registry" に登録されるべきです。

レンジ単位は Section 16.5 に記載されているように拡張可能であることが意図されています。

14.1.1. レンジ指定子

レンジはレンジ単位とレンジ指定子の集合で表現されます。レンジ単位名は、その単位に固有の指定子がどのような種類の range-spec に適用できるかを決定します。したがって、以下の文法は一般的です:各レンジ単位は int-rangesuffix-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 excluding comma)

ranges-specifier が示された range-unit に対して無効または未定義の range-spec を含む場合、その ranges-specifier は無効です。

有効な ranges-specifier は、示された range-unit によって定義されるとおり、少なくとも一つの満たし得る(range-spec)を含む場合に satisfiable と見なされます。そうでなければその ranges-specifierunsatisfiable です。

14.1.2. バイトレンジ

"bytes" レンジ単位は、表現データのオクテット列のサブレンジを表現するために使用されます。各バイトレンジは、表現データの先頭(int-range)または末尾(suffix-range)に相対的なオフセットとして整数レンジで表されます。バイトレンジは other-range 指定子を使用しません。

int-rangefirst-pos 値はレンジ内の最初のバイトのオフセットを与えます。last-pos 値はレンジ内の最後のバイトのオフセットを与えます;つまり指定されたバイト位置は包含的です。バイトオフセットはゼロから始まります。

表現データにコンテンツコーディングが適用されている場合、各バイトレンジはデコード後の基底バイト列ではなく、エンコードされたバイト列に関して計算されます。

bytes レンジ指定子の例:

  • 最初の 500 バイト(バイトオフセット 0-499、包含):

    bytes=0-499
    
  • 二番目の 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
    
  • 二番目の 500 バイト(500-999)を表す他の有効だが標準的でない指定例:

    bytes=500-600,601-999
    bytes=500-700,601-999
    

GET リクエストにおいて、有効な bytes の range-specsatisfiable であるのは次のいずれかの場合です:

選択された表現の長さがゼロの場合、GET リクエストにおける range-spec の唯一の satisfiable 形は、非ゼロの suffix-length を持つ suffix-range です。

バイトレンジ構文では、first-poslast-pos、および suffix-length はオクテットの10進数で表現されます。コンテンツの長さに事前定義された上限がないため、受信者は非常に大きな10進数に備え、整数変換によるオーバーフローでの解析エラーを防止しなければなりません(MUST)。

14.2. Range

GET リクエストの "Range" ヘッダーフィールドは、選択された表現データ(Section 8.1)全体ではなく、その一つ以上のサブレンジの転送のみを要求するようにメソッドの意味を変更します。

サーバは Range ヘッダーフィールドを無視してもよい(MAY)。しかし、オリジンサーバや中間キャッシュは可能な場合バイトレンジをサポートするべきであり、部分的に失敗した転送からの効率的な復旧や大きな表現の部分取得をサポートします。

サーバは、認識されないメソッドまたはレンジ処理が定義されていないメソッドで受信した Range を無視しなければなりません(MUST)。この仕様においてレンジ処理が定義されているのは GET のみです。

オリジンサーバは理解しないレンジ単位を含む Range を無視しなければなりません(MUST)。プロキシは理解しないレンジ単位を含む Range を破棄してもよい(MAY)。

レンジリクエストをサポートするサーバは、無効な ranges-specifier、二つを超える重複するレンジを含む ranges-specifier、または昇順でリストされていない多数の小さなレンジの集合を含む Range を無視または拒否してもよい(MAY)。これらは壊れたクライアントか、あるいはサービス拒否攻撃の意図を示す可能性があるためです(Section 17.15)。クライアントは、同じデータを含む単一のレンジに比べて処理や転送の効率が劣る複数レンジを要求すべきではありません(SHOULD NOT)。

選択された表現にコンテンツがない(すなわち選択された表現のデータがゼロ長である)場合、レンジリクエストをサポートするサーバは Range を無視してもよい(MAY)。

複数レンジを要求するクライアントは、特定の理由がない限りそれらを昇順で列挙するべきです(完全な表現で通常受信される順序)。例えば、内部カタログを持つ大きな表現を処理するユーザーエージェントは、ページが逆順で格納されている場合に後の部分を先に要求する必要があるかもしれません。

Range ヘッダーフィールドは、Section 13.1 で定義された前提条件ヘッダーフィールドの評価後、かつ Range ヘッダーフィールドが存在しない場合に 200 (OK) レスポンスとなる場合にのみ評価されます。言い換えれば、条件付き GET が 304 (Not Modified) を返す場合には Range は無視されます。

If-Range ヘッダーフィールド(Section 13.1.5)は Range を適用するための前提条件として使用できます。

すべての前提条件が真であり、サーバが対象リソースに対して Range をサポートし、受信した Range フィールド値がその対象リソースに対してサポートされる range-unitranges-specifier であり、かつその ranges-specifier が選択された表現に対して satisfiable である場合、サーバは要求された満たし得る range-spec に対応する一つ以上の部分表現を含む 206 (Partial Content) レスポンスを送るべきです(SHOULD)。

上記はサーバが要求されたすべてのレンジを送ることを意味するものではありません。場合によっては、効率的あるいは可能であるのは要求されたレンジの一部だけを先に送ることであり、残りをクライアントが後で再要求することを期待する場合があります(詳細は Section 15.3.7 を参照)。

すべての前提条件が真であり、サーバが対象リソースに対して Range をサポートし、受信した Range フィールド値が有効な ranges-specifier を含むが、その range-unit が対象リソースではサポートされていないか、または ranges-specifier が選択された表現に対して満たし得ない場合、サーバは 416 (Range Not Satisfiable) レスポンスを送るべきです(SHOULD)。

14.3. Accept-Ranges

レスポンスの "Accept-Ranges" フィールドは、上流サーバが対象リソースに対してレンジリクエストをサポートしているかどうかを示します。

例えば、バイトレンジリクエストをサポートするサーバ(Section 14.1.2)は次のフィールドを送れます:

Accept-Ranges: bytes

これは、その対象リソースに対してバイトレンジリクエストをサポートしていることを示し、クライアントが同一のリクエストパスに対する将来の部分リクエストでそれを利用することを奨励します。レンジ単位は Section 14.1 で定義されています。

クライアントは Accept-Ranges フィールドを受け取っていてもいなくてもレンジリクエストを生成してよい(MAY)。この情報は、パフォーマンスを改善し不必要なネットワーク転送を減らすための助言に過ぎません。

逆に、Accept-Ranges を受け取ったからといって将来のレンジリクエストが部分的レスポンスを返すと仮定してはなりません(MUST NOT)。コンテンツが変化することもあれば、サーバが特定の時間や条件下でのみレンジをサポートする場合もありますし、次のリクエストを別の仲介者が処理するかもしれません。

対象リソースに対していかなる種類のレンジリクエストもサポートしないサーバは、次を送信してクライアントにレンジリクエストを試みないよう助言することができます(MAY):

Accept-Ranges: none

レンジ単位 "none" はこの目的のために予約されています。

Accept-Ranges フィールドはトレーラセクションで送信してもよい(MAY)ですが、情報が大きな転送の再開に特に有用であるため、ヘッダーフィールドとして送ることが望ましいです。

14.4. Content-Range

"Content-Range" ヘッダーフィールドは、単一パートの 206 (Partial Content) レスポンスで、メッセージ本文として封入された選択された表現の部分レンジを示すために送られます。また、multipart 206 レスポンスの各パートにおいて各ボディパート内に封入されたレンジを示すために送られ(Section 14.6)、416 (Range Not Satisfiable) レスポンスでは選択された表現に関する情報を提供するために送られます。

もし 206 (Partial Content) レスポンスが受信者が理解しない range unit を持つ Content-Range を含む場合、受信者は受信したパートを保存表現と再結合しようとしてはなりません(MUST NOT)。そのようなメッセージを受け取ったプロキシは下流へ転送すべきです(SHOULD)。

Content-Range は、クライアントとオリジンサーバの間での私的な合意に基づき、部分的な PUT を要求するためのリクエスト修飾子として送信されることもあります(Section 14.5 を参照)。サーバは、Content-Range サポートが定義されていないメソッドで受信した Content-Range を無視しなければなりません(MUST)。

バイトレンジについては、送信者は元の表現の完全な長さを示すことが望ましい(SHOULD)。ただし完全長が不明または判定が困難な場合は例外です。完全長の代わりにアスタリスク ("*") を使うと、そのヘッダーフィールドが生成された時点で表現長が不明であったことを示します。

送信者が選択された表現の完全長を 1234 バイトと知っている場合の例:

Content-Range: bytes 42-1233/1234

完全長が不明な場合の例:

Content-Range: bytes 42-1233/*

Content-Range フィールド値は、range-resplast-pos より小さい first-pos を持つ場合、または complete-length がその last-pos 以下である場合は無効です。無効な Content-Range の受信者は、受信したコンテンツを保存表現と再結合しようとしてはなりません(MUST NOT)。

サーバがバイトレンジ要求に対して 416 (Range Not Satisfiable) を生成する場合、Content-Range フィールドに unsatisfied-range 値を送ることが望ましい(SHOULD)。例:

Content-Range: bytes */1234

416 レスポンスの complete-length は選択された表現の現在の長さを示します。

Content-Range ヘッダーフィールドは、その意味を明示的に記述するステータスコードがない場合には意味を持ちません。本仕様において Content-Range の意味を記述するステータスコードは 206 (Partial Content)416 (Range Not Satisfiable) のみです。

以下は選択された表現の合計が 1234 バイトである場合の Content-Range 値の例です:

  • 最初の 500 バイト:

    Content-Range: bytes 0-499/1234
    
  • 二番目の 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 ヘッダーフィールドを含めた場合に部分的表現の PUT をサポートしますが、そのようなサポートは一貫しておらず、ユーザーエージェントとの私的合意に依存します。一般に、これは Content-Range 値で示されたオフセットと長さに従って、選択された表現に対して添付された内容で一部を置換することを要求するものです(オフセットは選択された表現に対して相対的です)。

オリジンサーバは、対象リソースが部分的 PUT をサポートしていない場合に PUT リクエストで Content-Range を受け取ったときは 400 (Bad Request) で応答することが望ましい(SHOULD)。

部分的 PUT は元来の PUT の定義と後方互換性がありません。結果として、コンテンツが現在の表現の完全な置換として書き込まれる可能性があります。

部分的なリソース更新は、より大きなリソースの一部と重複または拡張する状態を持つ別に識別されたリソースをターゲットにすることで実現することも、あるいは部分更新用に特に定義された別のメソッド(例えば [RFC5789] で定義される PATCH)を使用することで可能です。

14.6. メディアタイプ multipart/byteranges

206 (Partial Content) レスポンスメッセージが複数レンジの内容を含む場合、それらは "multipart/byteranges" というメディアタイプのマルチパートメッセージ本文内のボディパートとして送信されます([RFC2046], Section 5.1 参照)。

"multipart/byteranges" メディアタイプは一つ以上のボディパートを含み、各パートは独自の Content-Type および Content-Range フィールドを持ちます。必須の boundary パラメータは各ボディパートを区切るための境界文字列を指定します。

実装上の注意:

  1. ボディ中の最初の境界文字列の前に追加の CRLF が来ることがあります。
  2. [RFC2046] は境界文字列を引用可能と許しますが、一部の既存実装は引用された境界文字列を正しく扱えません。
  3. 多くのクライアントおよびサーバは、"multipart/x-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

...the first range...
--THIS_STRING_SEPARATES
Content-Type: video/example
Content-Range: exampleunit 11.2-14.3/25

...the second range
--THIS_STRING_SEPARATES--

以下の情報は "multipart/byteranges" メディアタイプの登録フォームとして機能します。

Type name:
multipart
Subtype name:
byteranges
Required parameters:
boundary
Optional parameters:
N/A
Encoding considerations:
only "7bit", "8bit", or "binary" are permitted
Security considerations:
see Section 17
Interoperability considerations:
N/A
Published specification:
RFC 9110 (see Section 14.6)
Applications that use this media type:
HTTP components supporting multiple ranges in a single request
Fragment identifier considerations:
N/A
Additional information:
Deprecated alias names for this type:
N/A
Magic number(s):
N/A
File extension(s):
N/A
Macintosh file type code(s):
N/A
Person and email address to contact for further information:
See Authors' Addresses section.
Intended usage:
COMMON
Restrictions on usage:
N/A
Author:
See Authors' Addresses section.
Change controller:
IESG

15. ステータスコード

レスポンスのステータスコードは、リクエストの結果とレスポンスのセマンティクス(リクエストが成功したかどうか、どのようなコンテンツが含まれているか(あるいは含まれていないか)など)を記述する3桁の整数コードです。有効なステータスコードはすべて 100 から 599 の範囲(両端含む)にあります。

ステータスコードの最初の桁はレスポンスのクラスを定義します。後の2桁には分類上の役割はありません。最初の桁には5つの値があります:

HTTP のステータスコードは拡張可能です。クライアントは登録されているすべてのステータスコードの意味を理解することを要求されませんが、その理解は望ましいものです。しかし、クライアントはステータスコードのクラス(最初の桁)を理解し、認識できないステータスコードをそのクラスの x00 ステータスコードと同等に扱わなければなりません(MUST)。

例えば、クライアントが未認識のステータスコード 471 を受け取った場合、最初の桁からリクエストに問題があったことが分かるので、そのレスポンスを 400 (Bad Request) と同等に扱うことができます。レスポンスメッセージは通常、ステータスを説明する表現を含みます。

100..599 の範囲外の値は無効です。実装では内部通信のためにその範囲外の3桁整数(例: 600..999)を使用することがあります(ライブラリエラー等の非 HTTP ステータス)。無効なステータスコードのレスポンスを受け取ったクライアントは、そのレスポンスを 5xx(サーバエラー) とみなして処理することが望ましい(SHOULD)です。

単一リクエストに対しては複数の関連するレスポンスがあり得ます:0 個以上の中間(interim)(非最終)レスポンス("informational"(1xx)範囲のステータスコード)と、続いて他の範囲のいずれかに属するちょうど1つの最終(final)レスポンスが存在します。

15.1. ステータスコードの概要

以下に列挙されるステータスコードはこの仕様で定義されたものです。ここに示す理由フレーズはあくまで推奨であり、ローカルな同等語に置き換えたり、まったく省略してもプロトコルには影響しません。

本仕様でヒューリスティックにキャッシュ可能と定義されるステータスコード(例:200, 203, 204, 206, 300, 301, 308, 404, 405, 410, 414, 501)は、メソッド定義や明示的なキャッシュ制御により別途指示されていない限り、キャッシュによってヒューリスティックな有効期限で再利用され得ます;その他のステータスコードはヒューリスティックにキャッシュ可能ではありません。

この仕様の範囲外で追加のステータスコードが HTTP 用に定義されていることがあります。そのようなステータスコードはすべて "Hypertext Transfer Protocol (HTTP) Status Code Registry" に登録されるべきです(Section 16.2参照)。

15.2. 情報 1xx

1xx(情報)クラスのステータスコードは、要求された動作を完了して最終レスポンスを送る前に、接続状態やリクエスト進行状況を伝えるための中間レスポンスを示します。HTTP/1.0 は 1xx ステータスコードを定義していなかったため、サーバは HTTP/1.0 クライアントに 1xx レスポンスを送ってはなりません(MUST NOT)。

1xx レスポンスはヘッダ部の終端で終了し、本文やトレーラを含めることはできません。

クライアントは最終レスポンスの前に受信する 1 個以上の 1xx レスポンスを解析できなければなりません(たとえそれを予期していなくても)(MUST)。ユーザーエージェントは予期しない 1xx レスポンスを無視してもよい(MAY)。

プロキシは自分自身が 1xx レスポンスの生成を要求した場合を除き 1xx レスポンスを転送しなければなりません(MUST)。例えば、プロキシが転送時に "Expect: 100-continue" を追加した場合、その対応する 100 (Continue) を転送する必要はありません。

15.2.1. 100 Continue

100 (Continue) ステータスコードは、リクエストの最初の部分が受信され、サーバによってまだ拒否されていないことを示します。サーバはリクエスト全体を受け取り処理した後に最終レスポンスを送る意図があります。

リクエストに Expect ヘッダーフィールドが含まれ、その中に 100-continue 期待がある場合、100 レスポンスはサーバがリクエスト本文の送信を望んでいることを示します(Section 10.1.1 を参照)。クライアントはリクエストの送信を続け、100 レスポンスは破棄すべきです。

リクエストに Expect ヘッダーフィールドが含まれておらず、100-continue 期待がない場合、クライアントはこの中間レスポンスを単に破棄できます。

15.2.2. 101 Switching Protocols

101 (Switching Protocols) ステータスコードは、サーバがクライアントの要求(Upgrade ヘッダーフィールド)に基づきこの接続で使用するアプリケーションプロトコルの変更に同意し、それに従うことを示します。サーバは、どのプロトコルがこのレスポンスの後に適用されるかを示す Upgrade ヘッダーフィールドをレスポンスで生成しなければなりません(MUST)。

サーバは、プロトコル切替が有利な場合にのみ同意することが想定されます。例えば、古いバージョンより新しい HTTP バージョンに切り替えることや、リアルタイム・同期プロトコルに切り替えることが有利な場合があります。

15.3. 成功 2xx

2xx(成功)クラスのステータスコードは、クライアントのリクエストが正常に受信され、理解され、受け入れられたことを示します。

15.3.1. 200 OK

200 (OK) ステータスコードはリクエストが成功したことを示します。200 レスポンスで送られるコンテンツはリクエストメソッドによって異なります。本仕様で定義されたメソッドに対するコンテンツの意図は次のように要約できます:

Table 6
Request Method レスポンスコンテンツが表現するもの:
GET ターゲットリソース
HEAD ターゲットリソース(GET と同様だが表現データを転送しない)
POST 処理の状態、またはアクションから得られた結果
PUT, DELETE アクションの状態
OPTIONS ターゲットリソースの通信オプション
TRACE サーバが受け取った要求メッセージ(トレースを返す)

CONNECT に対するレスポンスを除き、200 レスポンスはメッセージコンテンツを含むことが期待されます(メッセージフレーミングが明示的にゼロ長であることを示していない限り)。成功時にコンテンツ無しを好むことを示すリクエストの側面がある場合、オリジンサーバは代わりに 204 (No Content) を送るべきです。CONNECT の場合、成功結果はトンネルであり、200 レスポンスヘッダ部の直後にトンネルが始まるためコンテンツはありません。

200 レスポンスはヒューリスティックにキャッシュ可能です;つまり、メソッド定義や明示的なキャッシュ制御で別途指示されていない限り(Section 4.2.2 of [CACHING]を参照)。

GET または HEAD に対する 200 レスポンスでは、オリジンサーバは選択された表現の利用可能なバリデータフィールド(Section 8.8)を送ることが望ましく(SHOULD)、強いエンティティタグと Last-Modified 日付の両方が好ましいです。

状態変更メソッドに対する 200 レスポンスでは、レスポンスで送信されたバリデータフィールド(Section 8.8)は、リクエストの適用結果として形成された新しい表現の現在のバリデータを伝えます。PUT メソッド(Section 9.3.4)にはそのようなバリデータ送信を妨げる追加要件があることに注意してください。

15.3.2. 201 Created

201 (Created) ステータスコードは、リクエストが完了し、1つ以上の新しいリソースが作成されたことを示します。リクエストによって作成された主要なリソースは、レスポンスの Location ヘッダーフィールドで識別されるか、もし Location ヘッダーフィールドが受信されない場合はターゲット URI により識別されます。

201 レスポンスのコンテンツは通常、作成されたリソースを記述しリンクします。レスポンスで送信されたバリデータフィールド(Section 8.8)は、リクエストにより作成された新しい表現の現在のバリデータを伝えます。PUT メソッド(Section 9.3.4)にはそのようなバリデータ送信を妨げる追加要件があることに注意してください。

15.3.3. 202 Accepted

202 (Accepted) ステータスコードは、リクエストが処理のために受け入れられたが、処理は完了していないことを示します。リクエストは最終的に実行される場合もあれば実行されない場合もあります(実際の処理時に拒否される可能性があります)。HTTP には非同期処理からステータスコードを再送する仕組みはありません。

202 レスポンスは意図的にコミットしない性質を持ちます。サーバがプロセス(例えば日次バッチ処理)を受け入れる一方で、ユーザーエージェントの接続を処理完了まで維持することを要求しないために存在します。レスポンスに含める表現は、リクエストの現在の状態を説明し、ステータス監視を指す(あるいは埋め込む)べきです。

15.3.4. 203 Non-Authoritative Information

203 (Non-Authoritative Information) ステータスコードは、リクエストは成功したが、封入されたコンテンツがオリジンサーバの 200 (OK) レスポンスのものから変換プロキシにより修正されていることを示します(Section 7.7)。このステータスコードは、変換が適用されたことをプロキシが受信者に通知し、後続のコンテンツに関する判断に影響を与える可能性がある場合に使われます。例えば、そのコンテンツに対する将来のキャッシュ検証要求は同じリクエスト経路(同じプロキシ経由)でのみ有効かもしれません。

203 レスポンスはヒューリスティックにキャッシュ可能です(メソッド定義や明示的なキャッシュ制御で別途指示されていない限り)。

15.3.5. 204 No Content

204 (No Content) ステータスコードは、サーバがリクエストを正常に履行したが、レスポンスコンテンツとして追加の内容を送る必要がないことを示します。レスポンスヘッダーフィールドのメタデータは、リクエストにより適用された後の ターゲットリソース とその 選択された表現 を参照します。

例えば、PUT リクエストに対して 204 ステータスコードが返され、レスポンスに ETag フィールドが含まれている場合、PUT は成功しており、ETag フィールド値はそのターゲットリソースの新しい表現のエンティティタグを含みます。

204 レスポンスは、サーバがターゲットリソースへのアクションを正常に適用したことを示しつつ、ユーザーエージェントが現在の「ドキュメントビュー」から離れる必要がないことを意味します。サーバはユーザーエージェントがインターフェースに従って成功を示す表現を表示し、新しいメタデータをアクティブな表現に適用することを期待します。

例えば、文書編集インタフェースの「保存」アクションに対応して 204 がよく使われます。保存後も文書は編集可能なままであり、ユーザーは作業を続けられます。また分散バージョン管理など自動データ転送が多いインタフェースでも頻繁に使用されます。

204 レスポンスはヘッダ部の終端で終了し、本文やトレーラを含めることはできません。

204 レスポンスはヒューリスティックにキャッシュ可能です(例外はメソッド定義や明示的なキャッシュ制御による)。

15.3.6. 205 Reset Content

205 (Reset Content) ステータスコードは、サーバがリクエストを履行し、ユーザーエージェントに対してそのリクエストを送らせた「ドキュメントビュー」をオリジンサーバから受け取った元の状態にリセットするよう望んでいることを示します。

このレスポンスは、ユーザがデータ入力(フォーム、メモ帳、キャンバス等)を行い、その入力をリクエストで送信してから入力メカニズムを次の入力のためにリセットするという一般的なデータ入力ユースケースをサポートすることを意図しています。

205 ステータスコードは追加のコンテンツが提供されないことを意味するため、サーバは 205 レスポンスでコンテンツを生成してはなりません(MUST NOT)。

15.3.7. 206 Partial Content

206 (Partial Content) ステータスコードは、サーバがターゲットリソースに対するレンジリクエストを満たしており、選択された表現の一部(1つ以上)を転送していることを示します。

レンジリクエストをサポートするサーバは通常要求されたすべてのレンジを満たそうと試みますが、サーバ側の一時的な理由(利用不能、キャッシュ効率、負荷分散など)により要求されたデータの一部しか送らない場合があります。206 レスポンスは自己記述的であるため、クライアントは要求が部分的にしか満たされていない場合でも理解できます。

クライアントは 206 レスポンスの Content-Type および Content-Range フィールドを検査して、どの部分が封入されているか、追加の要求が必要かどうかを判断しなければなりません(MUST)。

206 レスポンスを生成するサーバは、下位節で要求されるヘッダーフィールドに加えて、同じリクエストに対する 200 (OK) レスポンスで送られるであろうフィールドを、該当する場合には生成しなければなりません:DateCache-ControlETagExpiresContent-Location、および Vary(該当する場合)。(MUST

206 レスポンス内の Content-Length ヘッダーフィールドは、このメッセージのコンテンツ中のオクテット数を示します。これは通常、選択された表現の完全長ではありません。各 Content-Range ヘッダーフィールドは選択された表現の完全長に関する情報を含みます。

If-Range ヘッダーフィールドを伴うリクエストに対して 206 レスポンスを生成する送信者は、クライアントが既に prior response を持っているため、他の表現ヘッダーフィールドを生成すべきではない(SHOULD NOT)場合があります。そうでない場合は、同じリクエストに対する 200 (OK) レスポンスで送られるであろう全ての表現ヘッダーフィールドを生成しなければなりません(MUST)。

206 レスポンスはヒューリスティックにキャッシュ可能です(明示的なキャッシュ制御で別途指示されていない限り)。

15.3.7.1. 単一パート

単一パートが転送される場合、206 レスポンスを生成するサーバは必ず Content-Range ヘッダーフィールドを生成し、選択された表現のどの範囲が封入されているかを記述し、その範囲を含むコンテンツを返さなければなりません(MUST)。例えば:

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 bytes of partial image data ...
15.3.7.2. 複数パート

複数パートが転送される場合、206 レスポンスを生成するサーバは Section 14.6 で定義された "multipart/byteranges" コンテンツを生成し、"multipart/byteranges" メディアタイプと必要な boundary パラメータを含む Content-Type ヘッダーフィールドを生成しなければなりません。また、単一パートレスポンスと混同しないように、複数パートレスポンスの HTTP ヘッダ部で Content-Range ヘッダーフィールドを生成してはなりません(各パート内で送られます)。

各ボディパートのヘッダ領域内では、サーバはそのボディパートに封入されるレンジに対応する Content-Range ヘッダーフィールドを生成しなければなりません(MUST)。もし選択された表現が 200 (OK) レスポンスで Content-Type を持つはずであれば、サーバは各ボディパートのヘッダ領域に同じ Content-Type を生成することが望ましい(SHOULD)。例えば:

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

...the first range...
--THIS_STRING_SEPARATES
Content-Type: application/pdf
Content-Range: bytes 7000-7999/8000

...the second range
--THIS_STRING_SEPARATES--

複数レンジが要求された場合、サーバは重複するレンジや、複数パートを送るオーバーヘッドよりもギャップが小さいレンジを任意に結合してもよい(MAY)。"multipart/byteranges" の各パート間の典型的なオーバーヘッドは約 80 バイトであり、選択された表現のメディアタイプや boundary 長に依存します。多くの小さな分離されたパートを転送するより、選択された表現全体を転送する方が効率的な場合があります。

サーバは単一レンジの要求に対して multipart レスポンスを生成してはなりません(クライアントが複数パートを要求していない場合、multipart レスポンスをサポートしないクライアントがいる可能性があるため)(MUST NOT)。ただし、複数レンジが要求され、満たし得るレンジが1つしかなかった、または結合の結果1つに残った場合に限り、サーバは単一ボディパートのみを含む "multipart/byteranges" を生成してもよい(MAY)。"multipart/byteranges" を処理できないクライアントは、複数レンジを要求してはなりません(MUST NOT)。

サーバは multipart レスポンスのパートを、受信した Range ヘッダーフィールド内で対応する range-spec が現れた順序と同じ順序で送ることが望ましい(満たし得ないレンジや結合されたレンジは除く)(SHOULD)。クライアントは各ボディパートに存在する Content-Range を検査して、どのレンジがそのボディパートに含まれているかを判断しなければなりません(MUST)。クライアントは、要求したレンジや要求した順序がそのまま返されることを前提にできません。

15.3.7.3. パーツの結合

接続が中断されたりレンジ指定を使ったリクエストがあった場合、レスポンスは表現のサブレンジのみを転送することがあります。複数回の転送ののち、クライアントは同一表現の複数のレンジを受け取ることがあります。これらのレンジを安全に結合できるのは、それらがすべて同じ強いバリデータを共有している場合のみです(Section 8.8.1)。

クライアントは、ターゲットリソースに対する GET リクエストの複数の部分レスポンスを受け取った場合、それらが同じ強いバリデータを共有していれば、それらをより大きな連続レンジに結合してもよい(MAY)。

最新のレスポンスが不完全な 200 (OK) レスポンスである場合、そのレスポンスのヘッダーフィールドが結合後のレスポンスに使用され、保存済みの一致するレスポンスのヘッダーフィールドを置き換えます。

最新のレスポンスが 206 (Partial Content) で、かつ一致する保存済みレスポンスの少なくとも1つが 200 (OK) である場合、結合されたレスポンスのヘッダーフィールドは最新の 200 レスポンスのヘッダーフィールドで構成されます。すべての一致する保存済みレスポンスが 206 であれば、保存済みレスポンスのうち最新のヘッダーフィールドを結合レスポンスのヘッダーフィールドの出所として使用します。ただしクライアントは新しいレスポンスで提供された、Content-Range を除く他のヘッダーフィールドを用いて、保存済みレスポンス中の対応するヘッダーフィールドの全てを置き換えなければなりません(MUST)。

結合されたレスポンスのコンテンツは、新しいレスポンスと一致する保存済みレスポンス内の部分コンテンツレンジの和集合で構成されます。もし和集合が表現の全体範囲を含むなら、クライアントは結合レスポンスを完全な 200 (OK) レスポンスとして処理し、完全長を反映する Content-Length ヘッダーフィールドを含めなければなりません(MUST)。それ以外の場合、クライアントは連続レンジの集合を次のいずれかとして処理しなければなりません(MUST):表現のプレフィックスである場合は不完全な 200 (OK) レスポンス、和集合が単一の連続レンジであればその範囲を示す 206 (Partial Content) レスポンス("multipart/byteranges" コンテンツ)、または複数の 206 (Partial Content) レスポンス(それぞれが連続レンジ1つを含み Content-Range を持つ)。

15.4. リダイレクト 3xx

3xx(リダイレクト)クラスのステータスコードは、要求を満たすためにユーザーエージェントが更なる操作を行う必要があることを示します。リダイレクトにはいくつかの種類があります:

  1. このリソースが別の URI で利用可能である可能性を示すリダイレクト(Location ヘッダーフィールドで示される)。例: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 ヘッダーフィールドが提供されている場合、ユーザーエージェントは特定のステータスコードの意味が分からなくても、Location フィールド値で示された URI へ自動的にリダイレクトしてもよい(MAY)。ただし、安全でないメソッドについて自動リダイレクトを行う際は注意が必要です(ユーザーが安全でないリクエストをリダイレクトしたくない場合があるため)。

自動的にリダイレクトを追従する場合、ユーザーエージェントは次の修正を加えて元のリクエストメッセージを再送することが望ましい(SHOULD):

  1. ターゲット URI を、リダイレクトレスポンスの Location フィールド値で参照される URI リファレンスに置き換える(元のリクエストのターゲット URI に対して相対解決する)。

  2. 実装により自動生成されたヘッダーフィールドを削除し、必要に応じて新しいリクエストに適した更新値で置き換える。これには次が含まれますがこれらに限定されません:

    1. Connection 固有のヘッダーフィールド(Section 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 などのコンテンツ特有のヘッダーフィールドを削除する。

クライアントは循環するリダイレクト(無限リダイレクトループ)を検出し介入すべきです(SHOULD)。

15.4.1. 300 Multiple Choices

300 (Multiple Choices) ステータスコードは、ターゲットリソース が複数の表現を持ち、それぞれにより具体的な識別子があり、代替案に関する情報が提供されていることを示します。ユーザー(またはユーザーエージェント)が提供された識別子のいずれかにリクエストをリダイレクトして好ましい表現を選択できるようにする、つまりサーバはユーザーエージェントにリアクティブ交渉を行わせたいという意図です(Section 12参照)。

サーバに優先する選択肢がある場合、サーバは優先選択の URI リファレンスを含む Location ヘッダーフィールドを生成するべきです(SHOULD)。ユーザーエージェントは自動リダイレクトにその Location 値を使ってもよい(MAY)。

HEAD 以外のメソッドに対しては、サーバは 300 レスポンスのコンテンツに表現メタデータと URI リファレンスの一覧を含め、ユーザーやエージェントが最も適切なものを選べるようにするべきです(SHOULD)。ユーザーエージェントは提供されたメディアタイプを理解していれば、その一覧から自動的に選択することができます(MAY)。自動選択のための具体的フォーマットは本仕様で定義されていません。

300 レスポンスはヒューリスティックにキャッシュ可能です(例外はメソッド定義や明示的なキャッシュ制御)。

15.4.2. 301 Moved Permanently

301 (Moved Permanently) ステータスコードは、ターゲットリソース に新しい恒久的な URI が割り当てられ、将来そのリソースへの参照はサーバが送った新しい URI のいずれかを使うべきであることを示します。サーバはリンク編集能力を持つユーザーエージェントに対し、ターゲット URI の参照を恒久的に置換することを示唆できますが、通常はユーザーエージェントがリンク編集を行っていない限り無視されます。

サーバは新しい恒久的 URI のために優先された URI リファレンスを含む Location ヘッダーフィールドを生成するべきです(SHOULD)。ユーザーエージェントは自動リダイレクトにその Location を使ってもよい(MAY)。通常、サーバのレスポンスコンテンツは新しい URI への短いハイパーテキスト注記を含みます。

301 レスポンスはヒューリスティックにキャッシュ可能です(例外はメソッド定義や明示的なキャッシュ制御)。

15.4.3. 302 Found

302 (Found) ステータスコードは、ターゲットリソースが一時的に別の URI の下に存在することを示します。リダイレクトは時に変更される可能性があるため、クライアントは将来のリクエストで引き続きターゲット URI を使うべきです。

サーバは異なる URI の参照を含む Location を生成するべきです(SHOULD)。ユーザーエージェントは自動リダイレクトに Location 値を使ってもよい(MAY)。レスポンスコンテンツは通常短いハイパーテキスト注記を含みます。

15.4.4. 303 See Other

303 (See Other) は、サーバがユーザーエージェントを Location ヘッダーフィールドで示される別のリソースへリダイレクトしていることを示します。これは元のリクエストに対する間接的な応答を提供することを意図しています。ユーザーエージェントはその URI をターゲットにした取得リクエスト(HTTP を使うなら GET または HEAD)を行い、最終的に得られた結果を元のリクエストへの応答として提示できます。Location に示された新しい URI はターゲット URI と同等と見なされません。

このステータスコードは任意の HTTP メソッドに適用されます。主に POST の出力を別のリソースへリダイレクトするために使われ、POST の応答に相当する情報を別のリソースとして識別・ブックマーク・キャッシュ可能にするために使用されます。

GET リクエストに対する 303 レスポンスは、オリジンサーバがターゲットリソースの表現を HTTP で転送できないことを示すが、Location に示されたリソースはターゲットリソースの記述的なリソースであり、そのリソースへの取得が受信者にとって有用な表現をもたらす可能性があることを意味します。

HEAD リクエストへの応答を除き、303 レスポンスの表現は Location と同じ URI への短いハイパーテキスト注記を含むべきです。

15.4.5. 304 Not Modified

304 (Not Modified) ステータスコードは、条件付き GET または HEAD リクエストが受信され、その条件が false と評価されたために、もし条件がなければ 200 (OK) になったであろうことを示します。言い換えれば、クライアントが既に有効な表現を持っているため、オリジンサーバは表現の転送を行う必要がなく、クライアントに保存済み表現を利用するよう指示しているのです。

304 を生成するサーバは、同じリクエストに対する 200 (OK) レスポンスで送られるであろう次のヘッダーフィールドを生成しなければなりません(MUST):

304 レスポンスの目的は受信者が既にキャッシュ表現を持っている場合に情報転送を最小化することにあるため、送信者は上に列挙したフィールド以外の表現メタデータを生成すべきでない(SHOULD NOT)。ただしキャッシュ更新を導く目的で存在するメタデータ(例:エンティティタグがない場合の Last-Modified)は有用です。

304 を受け取ったキャッシュの処理要件は Section 4.3.4 of [CACHING] に定義されています。もし条件付きリクエストがアウトバウンドクライアント(独自のキャッシュを持つユーザーエージェント等)から発生しており、共有プロキシがその条件付き GET を受け取った場合、プロキシは 304 をそのクライアントへ転送すべきです(SHOULD)。

304 レスポンスはヘッダ部の終端で終了し、本文やトレーラを含めることはできません。

15.4.6. 305 Use Proxy

305 (Use Proxy) ステータスコードは以前のバージョンで定義され、現在は非推奨です。

15.4.7. 306 (Unused)

306 ステータスコードは以前の仕様で定義されましたが現在は使われておらず、予約されています。

15.4.8. 307 Temporary Redirect

307 (Temporary Redirect) は、ターゲットリソースが一時的に別の URI の下に存在し、自動リダイレクトを行う場合にユーザーエージェントがリクエストメソッドを変更してはならないことを示します(MUST NOT)。リダイレクトは時に変化する可能性があるため、クライアントは将来も元のターゲット URI を使い続けるべきです。

サーバは Location を生成するべきです(SHOULD)。ユーザーエージェントは自動リダイレクトにその Location を使ってもよい(MAY)。レスポンスは通常短いハイパーテキスト注記を含みます。

15.4.9. 308 Permanent Redirect

308 (Permanent Redirect) ステータスコードは、ターゲットリソースに新しい恒久的 URI が割り当てられ、将来の参照はその新しい URI を使うべきであることを示します。サーバはリンク編集能力を持つユーザーエージェントに対し参照の恒久的置換を示唆できますが、通常は無視されます。

サーバは優先される新しい恒久的 URI を含む Location を生成するべきです(SHOULD)。ユーザーエージェントは自動リダイレクトにその値を使ってもよい(MAY)。レスポンスコンテンツは通常新しい URI への短いハイパーテキスト注記を含みます。

308 レスポンスはヒューリスティックにキャッシュ可能です(例外はメソッド定義や明示的なキャッシュ制御)。

15.5. クライアントエラー 4xx

4xx(クライアントエラー)クラスのステータスコードは、クライアント側に誤りがあることを示します。HEAD への応答を除き、サーバはエラー状況の説明(一時的か恒久的か)を含む表現を送るべきです(SHOULD)。これらのステータスコードは任意のリクエストメソッドに適用されます。ユーザーエージェントは含まれる表現をユーザーに表示すべきです(SHOULD)。

15.5.1. 400 Bad Request

400 (Bad Request) は、サーバがクライアントエラー(不正なリクエスト構文、無効なメッセージフレーミング、欺瞞的なリクエストルーティングなど)によりリクエストを処理できないか拒否することを示します。

15.5.2. 401 Unauthorized

401 (Unauthorized) は、ターゲットリソースに対する有効な認証資格情報が欠如しているためリクエストが適用されなかったことを示します。401 レスポンスを生成するサーバは、少なくともそのリソースに適用可能な1つ以上のチャレンジを含む WWW-Authenticate ヘッダーフィールドを送らなければなりません(MUST)。

もしリクエストに認証資格情報が含まれていた場合、401 はそれらの資格情報での認可が拒否されたことを示します。ユーザーエージェントは新しいまたは置き換えた Authorization を付けてリクエストを繰り返すことができます(MAY)。もし 401 レスポンスが前回と同じチャレンジを含み、ユーザーエージェントが既に少なくとも一度認証を試みている場合、ユーザーエージェントは通常診断情報を含むため囲まれた表現をユーザーに提示すべきです(SHOULD)。

15.5.3. 402 Payment Required

402 (Payment Required) は将来の使用のために予約されています。

15.5.4. 403 Forbidden

403 (Forbidden) は、サーバがリクエストを理解したが履行を拒否していることを示します。サーバが拒否の理由を公開したい場合、その理由をレスポンスコンテンツに記述できます(存在する場合)。

もしリクエストに認証資格情報が含まれていた場合、サーバはそれらがアクセス付与に不十分だと見なします。クライアントは同じ資格情報で自動的にリクエストを繰り返してはなりません(SHOULD NOT)。クライアントは新しいあるいは別の資格情報でリクエストを繰り返してもよい(MAY)。ただし、資格情報とは無関係の理由でリクエストが禁止されることもあります。

オリジンサーバは、禁止されたターゲットリソースの現存を「隠したい」場合、代わりに 404 (Not Found) で応答してもよい(MAY)。

15.5.5. 404 Not Found

404 (Not Found) は、オリジンサーバがターゲットリソースの現在の表現を見つけられなかったか、それが存在することを開示したくないことを示します。404 はこの欠如が一時的か恒久的かを示しません。条件が恒久的であるとサーバが知っている場合は 410 (Gone) を使う方が望ましいです。

404 レスポンスはヒューリスティックにキャッシュ可能です(例外はメソッド定義や明示的なキャッシュ制御)。

15.5.6. 405 Method Not Allowed

405 (Method Not Allowed) は、リクエスト行で受け取ったメソッドがオリジンサーバには知られているが、ターゲットリソースではサポートされていないことを示します。オリジンサーバは 405 レスポンスでそのターゲットリソースが現在サポートするメソッドの一覧を含む Allow ヘッダーフィールドを生成しなければなりません(MUST)。

405 レスポンスはヒューリスティックにキャッシュ可能です(例外はメソッド定義や明示的なキャッシュ制御)。

15.5.7. 406 Not Acceptable

406 (Not Acceptable) は、ターゲットリソースがリクエストで受け取ったプロアクティブ交渉ヘッダーフィールドに従ってユーザーエージェントにとって受け入れ可能な現在の表現を持たず、サーバがデフォルト表現を供給することを望まない場合に示されます。

サーバは利用可能な表現特性と対応するリソース識別子の一覧を含むコンテンツを生成するべきです(SHOULD)。ユーザーエージェントはその一覧から最適な選択を自動的に行ってもよい(MAY)。ただしその自動選択の標準は本仕様で定義されていません(Section 15.4.1参照)。

15.5.8. 407 Proxy Authentication Required

407 (Proxy Authentication Required) は 401 に類似しますが、クライアントがこのリクエストにプロキシを使用するために認証する必要があることを示します。プロキシはそのプロキシに適用可能なチャレンジを含む Proxy-Authenticate を送らなければなりません(MUST)。クライアントは新しいまたは置き換えた Proxy-Authorization を付けてリクエストを繰り返してもよい(MAY)。

15.5.9. 408 Request Timeout

408 (Request Timeout) は、サーバが待機する時間内に完全なリクエストメッセージを受信できなかったことを示します。

もしクライアントに未送信のリクエストがある場合、クライアントはそのリクエストを繰り返してもよい(MAY)。現在の接続が使用不可能であれば(例:HTTP/1.1 で要求デリミテーションが失われた場合)、新しい接続が使用されます。

15.5.10. 409 Conflict

409 (Conflict) は、ターゲットリソースの現在の状態と競合があるためにリクエストを完了できないことを示します。これはユーザーが競合を解決してリクエストを再送できる状況で用いられます。サーバは競合の原因を認識できるように十分な情報を含むコンテンツを生成するべきです(SHOULD)。

競合は PUT リクエストに対して発生しやすく、例えばバージョニングを用いている場合に PUT される表現が第三者の以前のリクエストによる変更と衝突しているときに 409 が使われます。こうした場合、レスポンス表現は差分をマージするための情報を含むことが多いです。

15.5.11. 410 Gone

410 (Gone) は、オリジンサーバでターゲットリソースへのアクセスがもはや利用できず、この状態が恒久的である可能性が高いことを示します。オリジンサーバがその条件が恒久的かどうかを判断できない場合は 404 (Not Found) を使うべきです。

410 レスポンスはウェブ保守の助けとして意図されており、リソースが意図的に利用不可であり外部リンクの削除を望むことを受信者に通知します。これは期間限定のプロモーションや、もはや組織に属さない個人のリソースに一般的です。恒久的に利用不可なすべてのリソースに 410 を付ける必要はなく、保持期間もサーバ所有者の裁量に委ねられます。

410 レスポンスはヒューリスティックにキャッシュ可能です(例外はメソッド定義や明示的なキャッシュ制御)。

15.5.12. 411 Length Required

411 (Length Required) は、サーバが Content-Length を定義せずにリクエストを受け入れないことを示します。クライアントは有効な Content-Length を追加してリクエストを繰り返してもよい(MAY)。

15.5.13. 412 Precondition Failed

412 (Precondition Failed) は、リクエストヘッダーフィールドで示された1つ以上の条件がサーバ上で評価されたときに false になったことを示します(Section 13参照)。このレスポンスはクライアントが現在のリソース状態に前提条件を置き、予期しない状態でメソッドが適用されるのを防ぐことを可能にします。

15.5.14. 413 Content Too Large

413 (Content Too Large) は、リクエスト本文がサーバが処理することを望むまたは処理可能なサイズを超えているため、サーバがリクエストを処理することを拒否していることを示します。サーバはプロトコルバージョンが許す場合、リクエストを終了してもよいし、さもなければ接続を閉じてもよい(MAY)。

その状態が一時的である場合、サーバは Retry-After ヘッダーフィールドを生成してクライアントに再試行可能な時刻を示すべきです(SHOULD)。

15.5.15. 414 URI Too Long

414 (URI Too Long) は、ターゲット URI がサーバが解釈することを望む長さを超えているためにサーバがリクエストを処理することを拒否していることを示します。この稀な状況は、POST を誤って長いクエリ情報を伴う GET に変換した場合や、無限リダイレクトループに陥った場合、または攻撃の一部として長い URI を送る試みがある場合に起こります。

414 レスポンスはヒューリスティックにキャッシュ可能です(例外はメソッド定義や明示的なキャッシュ制御)。

15.5.16. 415 Unsupported Media Type

415 (Unsupported Media Type) は、リクエストのコンテンツがターゲットリソースに対してそのメソッドでサポートされない形式であるため、オリジンサーバがリクエストを処理することを拒否していることを示します。

形式の問題は、リクエストの示す Content-Type または Content-Encoding に起因するか、データを直接検査した結果による場合があります。

もし問題がサポートされていないコンテンツコーディングに起因する場合、Accept-Encoding レスポンスヘッダーフィールドを用いて、リクエストで受け入れられたであろうコーディングを示すべきです。

一方、原因がサポートされていないメディアタイプであれば、Accept レスポンスヘッダーフィールドを用いて、リクエストで受け入れられたであろうメディアタイプを示すことができます。

15.5.17. 416 Range Not Satisfiable

416 (Range Not Satisfiable) は、リクエストの Range ヘッダーフィールドに含まれるレンジ集合が受理されなかったことを示します。これは要求されたレンジのどれも満たし得ない場合や、クライアントが過度に多くの小さなまたは重複するレンジを要求した場合(サービス拒否攻撃の可能性)に起こります。

各レンジ単位は、そのレンジ集合が満たし得るための要件を定義します。例えば、Section 14.1.2 はバイトレンジ集合が満たし得るための条件を定義しています。

サーバがバイトレンジ要求に対して 416 を生成する場合、選択された表現の現在の長さを示す Content-Range を生成することが望ましい(SHOULD)。

例えば:

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

417 (Expectation Failed) は、リクエストの Expect ヘッダーフィールドに示された期待が、少なくとも1つのインバウンドサーバで満たされなかったことを示します。

15.5.19. 418 (Unused)

RFC2324 は 4 月 1 日の RFC であり、HTTP の濫用を風刺したものです。その中でアプリケーション固有の 418 ステータスコードがジョークとして定義されましたが、広く展開されすぎたため将来の用途には使えない状態になっています。

したがって 418 は IANA HTTP Status Code Registry で予約されています。将来状況により再割り当てが必要になれば変更され得ます。

15.5.20. 421 Misdirected Request

421 (Misdirected Request) は、リクエストがそのターゲット URI に対して権威ある応答を生成できないサーバに向けられたことを示します。オリジンサーバやゲートウェイは、設定された origin と一致しないターゲット URI や、接続コンテキストと一致しないターゲット URI を拒否するために 421 を返します。

421 を受け取ったクライアントは、要求メソッドが冪等であるか否かにかかわらず、別の接続(例えばターゲットリソースの origin に特化した新規接続)や代替サービスを使ってリクエストを再試行してもよい(MAY)。

プロキシは 421 を生成してはなりません(MUST NOT)。

15.5.21. 422 Unprocessable Content

422 (Unprocessable Content) は、サーバがリクエストコンテンツのメディアタイプを理解しており(したがって 415

15.5.22. 426 Upgrade Required

426 (Upgrade Required) は、サーバが現在のプロトコルでリクエストを実行することを拒否し、クライアントが別のプロトコルへアップグレードしたときには実行する可能性があることを示します。サーバは 426 レスポンスで要求されるプロトコルを示す Upgrade ヘッダーフィールドを送らなければなりません(MUST)。

例:

HTTP/1.1 426 Upgrade Required
Upgrade: HTTP/3.0
Connection: Upgrade
Content-Length: 53
Content-Type: text/plain

This service requires use of the HTTP/3.0 protocol.

15.6. サーバエラー 5xx

5xx(サーバエラー)クラスのステータスコードは、サーバがエラーを認識しているか、要求されたメソッドを実行できないことを示します。HEAD への応答を除き、サーバはエラー状況の説明(一時的か恒久的か)を含む表現を送るべきです(SHOULD)。ユーザーエージェントは含まれる表現をユーザーに表示すべきです(SHOULD)。これらのステータスコードは任意のメソッドに適用されます。

15.6.1. 500 Internal Server Error

500 (Internal Server Error) は、サーバがリクエストの処理を妨げる予期せぬ条件に遭遇したことを示します。

15.6.2. 501 Not Implemented

501 (Not Implemented) は、サーバがリクエストを満たすために必要な機能をサポートしていないことを示します。サーバがリクエストメソッドを認識せず、どのリソースに対してもサポートできない場合に適切な応答です。

501 レスポンスはヒューリスティックにキャッシュ可能です(例外はメソッド定義や明示的なキャッシュ制御)。

15.6.3. 502 Bad Gateway

502 (Bad Gateway) は、サーバがゲートウェイやプロキシとして動作中に、要求を履行しようとした際にアクセスした上流サーバから無効なレスポンスを受け取ったことを示します。

15.6.4. 503 Service Unavailable

503 (Service Unavailable) は、サーバが一時的な過負荷やスケジュールされたメンテナンスにより現在リクエストを処理できないことを示します。サーバは Retry-After ヘッダーフィールドを送って、クライアントが再試行可能な目安時間を示してもよい(MAY)。

15.6.5. 504 Gateway Timeout

504 (Gateway Timeout) は、サーバがゲートウェイやプロキシとして動作中に、要求を完了するためにアクセスする必要がある上流サーバから適時なレスポンスを受け取れなかったことを示します。

15.6.6. 505 HTTP Version Not Supported

505 (HTTP Version Not Supported) は、サーバがリクエストで使われた HTTP のメジャーバージョンをサポートしないか、サポートを拒否することを示します。サーバは 505 レスポンスのために、そのバージョンがサポートされない理由とサーバがサポートする他のプロトコルを説明する表現を生成するべきです(SHOULD)。

16. HTTP の拡張

HTTP は、新しいバージョンを導入することなくプロトコルに機能を追加するために利用できる多くの一般的な拡張ポイント(メソッド、ステータスコード、フィールド名、および認証スキームやキャッシュ指示子のような定義済みフィールド内のさらなる拡張点を含む)を定義します(キャッシュ制御の拡張については Section 5.2.3 of [CACHING] を参照)。HTTP のセマンティクスはバージョン化されていないため、これらの拡張ポイントは永続的であり、使用中のプロトコルのバージョンはそれらのセマンティクスに影響を与えません。

バージョンに依存しない拡張は、使用中のプロトコルの特定バージョンに依存したり相互作用したりしないことが奨励されます。どうしても避けられない場合は、拡張が異なるバージョン間でどのように相互運用できるかを慎重に検討する必要があります。

さらに、HTTP の特定のバージョンは独自の拡張点を持つことがあります。例えば HTTP/1.1 の transfer codings(Section 6.1 of [HTTP/1.1])や、HTTP/2 の SETTINGS やフレーム種類([HTTP/2])などです。これらの拡張点は、それが属するプロトコルのバージョンに特有です。

バージョン固有の拡張は、明示的にそのプロトコル要素によって許可されていない限り、バージョンに依存しない機構や拡張ポイント(メソッドやヘッダーフィールドのような)のセマンティクスを上書きしたり変更したりすることはできません。例えば CONNECT メソッド(Section 9.3.6)はこれを許可します。

これらのガイドラインにより、経路の一部が異なる HTTP バージョンを実装している場合でも、プロトコルが正しく予測可能に動作することが保証されます。

16.1. メソッドの拡張性

16.1.1. メソッド登録簿

"Hypertext Transfer Protocol (HTTP) Method Registry" は IANA により https://www.iana.org/assignments/http-methods で管理されており、method 名を登録します。

HTTP メソッドの登録は次のフィールドを含まなければなりません(MUST):

この名前空間に値を追加するには IETF Review が必要です([RFC8126], Section 4.8 を参照)。

16.1.2. 新しいメソッドに関する考慮事項

標準化されたメソッドは汎用的であり、特定のメディアタイプやリソース種別、アプリケーションだけに適用されるべきではありません。したがって、新しいメソッドは単一のアプリケーションやデータ形式に特化した文書ではなく、より一般的な文書で登録されることが望まれます。直交する技術は直交的に仕様化されるべきです。

メッセージ解析(Section 6)はメソッドのセマンティクスから独立している必要があるため(HEAD に対する応答を除く)、新しいメソッドの定義は解析アルゴリズムを変更したり、要求または応答メッセージ上のコンテンツの存在を禁止したりすることはできません。新しいメソッド定義は、Content-Length ヘッダーフィールドの値を "0" に要求することで、ゼロ長コンテンツのみを許容することを指定できることに留意してください。

同様に、新しいメソッドは CONNECT(CONNECT)や OPTIONS(OPTIONS)で許可されるホスト:ポートやアスタリスク形式のリクエストターゲットを使用することはできません(Section 7.1)。ターゲット URI は完全な絶対形式が必要であり、つまりリクエストターゲットを絶対形式で送るか、他のメソッドと同様にリクエストコンテキストからターゲット URI を再構成する必要があります。

新しいメソッド定義は、そのメソッドが安全か(Section 9.2.1)、冪等か(Section 9.2.2)、キャッシュ可能か(Section 9.2.3)、要求コンテンツにどのようなセマンティクスが結び付けられるか(ある場合)、ヘッダーフィールドやステータスコードのセマンティクスにどのような細則を与えるかを示す必要があります。新しいメソッドがキャッシュ可能である場合は、キャッシュがどのように、どの条件でレスポンスを格納して後続の要求を満たすために使用できるかを説明するべきです。新しいメソッドが条件付きにできるかどうか(Section 13.1)を記述し、条件が偽であった場合にサーバがどのように応答するかを示すべきです。同様に、新しいメソッドが部分応答のセマンティクス(Section 14.2)に利用され得る場合は、それについても文書化するべきです。

16.2. ステータスコードの拡張性

16.2.1. ステータスコード登録簿

"Hypertext Transfer Protocol (HTTP) Status Code Registry" は IANA により https://www.iana.org/assignments/http-status-codes で管理され、status code 番号を登録します。

登録は次のフィールドを含まなければなりません(MUST):

  • Status Code (3 digits)
  • Short Description
  • Pointer to specification text

この名前空間に値を追加するには IETF Review が必要です([RFC8126], Section 4.8 を参照)。

16.2.2. 新しいステータスコードに関する考慮事項

既存のステータスコードで定義されていないレスポンスのセマンティクスを表現する必要がある場合、新しいステータスコードを登録できます。ステータスコードは汎用的であり、特定のメディアタイプやリソース種別、HTTP の特定の利用に限定されるべきではありません。したがって、新しいステータスコードは単一のアプリケーションに特化した文書ではなく、より一般的な文書で登録されることが望ましいです。

新しいステータスコードは Section 15 で定義されたカテゴリのいずれかに属する必要があります。既存のパーサがレスポンスメッセージを処理できるように、新しいステータスコードはコンテンツを禁止することはできませんが、ゼロ長コンテンツを義務付けることは可能です。

まだ広く展開されていない新しいステータスコードの提案は、コード番号を早期に割り当てることを避け、代わりに "4NN" や "3N0" .. "3N9" のような表記を使って提案されるステータスコードのクラスを示すべきです。これは番号を早まって消費しないためです。

新しいステータスコードの定義は、そのステータスコードを含むレスポンスを引き起こすリクエスト条件(例えば、リクエストヘッダーフィールドやメソッドの組合せ)と、必要なレスポンスヘッダーフィールド(どのフィールドが必須か、どのフィールドがセマンティクスを変更するか、新しいステータスコードと共に使われたときにどのフィールドのセマンティクスがさらに細かく規定されるか)に関する説明を含めるべきです。

デフォルトでは、ステータスコードはそれが発生するレスポンスに対応するリクエストにのみ適用されます。ステータスコードがより広い適用範囲(例えば該当リソースへのすべてのリクエストやサーバへのすべてのリクエスト)に適用される場合は、これを明示的に指定しなければなりません。その場合、すべてのクライアントが新しいステータスコードを理解するとは限らないため、一貫して広い適用範囲を適用できない可能性があることに注意すべきです。

新しい最終ステータスコードの定義は、それがヒューリスティックにキャッシュ可能かどうかを指定するべきです。注:明示的なフレッシュネス情報を持つ最終ステータスコードのレスポンスはキャッシュ可能です。ステータスコードがヒューリスティックにキャッシュ可能と定義されていれば、明示的なフレッシュネス情報なしでもキャッシュ可能です。同様に、ステータスコードの定義は must-understand キャッシュ指示子が使用された場合のキャッシュ挙動に制約を置くことができます。詳細は [CACHING] を参照してください。

最後に、新しいステータスコードの定義は、そのコンテンツが識別されたリソースと何らかの暗黙の関連を持つかどうかを示すべきです(Section 6.4.2)。

16.3. フィールドの拡張性

HTTP の最も広く用いられている拡張ポイントは、新しいヘッダーおよびトレーラーフィールドの定義です。

新しいフィールドは、受信者がそれを理解する場合に既存のフィールドの解釈を上書きまたは強化したり、リクエスト評価に対する前提条件を定義したり、レスポンスの意味を精緻化したりするように定義できます。

しかし、フィールドを定義したからといってそれが展開され受信者に認識されることが保証されるわけではありません。ほとんどのフィールドは、受信者が認識しないフィールドを安全に無視(ただし下流へ転送)できることを前提に設計されています。他の場合では、送信者が特定のフィールドを理解していることは過去の通信(プロトコルバージョンや以前のメッセージで送ったフィールドなど)によって示されるか、特定のメディアタイプの使用によって実際に示されるかもしれません。同様に、OPTIONS リクエストや定義された well-known URI を介した直接的なサポート検査が可能である場合もあります(そのような検査がフィールド導入とともに定義されている場合)。詳しくは [RFC8615] を参照してください。

16.3.1. フィールド名登録簿

"Hypertext Transfer Protocol (HTTP) Field Name Registry" は HTTP フィールド名の名前空間を定義します。

誰でも HTTP フィールドの登録を要求できます。新しい HTTP フィールドを作成する際の考慮点については Section 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], Section 4.6 を参照)。

登録要求は次の情報で構成されます:

Field name:
要求されるフィールド名。MUSTSection 5.1 で定義された field-name 構文に従うこと、かつ SHOULD は英数字とハイフン ('-') のみを使い、先頭文字を英字とすることが推奨されます。
Status:
"permanent", "provisional", "deprecated", または "obsoleted".
Specification document(s):
フィールドを仕様化する文書への参照。可能ならその文書を取得するための URI を含めることが望ましい。暫定登録の場合は任意だが推奨されます。関連する節を示すことも可能ですが必須ではありません。

任意で:

Comments:
予約済みエントリ等に関する追加情報。

専門家はコミュニティと協議のうえ、登録簿に収集する追加フィールドを定義できます。

標準で定義された名前は "permanent" ステータスを持ちます。その他の名前も専門家が使用されていると判断すれば "permanent" として登録できます。その他は "provisional" として登録すべきです。

暫定エントリは、専門家がコミュニティと協議して使用されていないと判断した場合に専門家により削除され得ます。専門家はいつでも暫定エントリのステータスを permanent に変更できます。

未登録の名前が広く展開され、そうでなければタイムリーに登録される見込みがないと専門家が判断する場合、第三者(専門家を含む)がその名前を登録できることに注意してください。

16.3.2. 新しいフィールドに関する考慮事項

HTTP のヘッダーおよびトレーラーフィールドはプロトコルの広く使われる拡張ポイントです。アドホックに使用され得ますが、広く使われることを意図したフィールドは相互運用性を確保するために慎重に文書化される必要があります。

特に、新しいフィールドを定義する仕様の作成者は、次の点を考慮し、適切なら文書化することが勧められます:

  • どの条件でそのフィールドが使用できるか(例:応答のみ、要求または応答のすべてのメッセージ、特定のリクエストメソッドへの応答のみ、等)。
  • フィールドのセマンティクスが特定のリクエストメソッドやステータスコードのような文脈によってさらに精緻化されるかどうか。
  • 伝達される情報の適用範囲。デフォルトではフィールドは関連付けられたメッセージにのみ適用されますが、いくつかの応答フィールドはリソースのすべての表現、リソース自体、あるいはそれより広い範囲に適用されるよう設計されています。応答フィールドの適用範囲を拡大する仕様は、コンテンツネゴシエーション、適用期間、場合によってはマルチテナントサーバ配置の問題について慎重に検討する必要があります。
  • 仲介者がフィールドの値を挿入、削除、または変更できる条件。
  • そのフィールドがトレーラで許容されるかどうか(デフォルトでは許容されません。Section 6.5.1 を参照)。
  • そのフィールド名を Connection ヘッダーフィールドに列挙すべきかどうか(すなわち hop-by-hop にするかどうか)についての適合性(Section 7.6.1 を参照)。
  • フィールドがプライバシー関連データの開示など追加のセキュリティ上の考慮事項を導入するかどうか。

リクエストヘッダーフィールドには、デフォルト動作が適切でない場合に文書化すべき追加の考慮事項があります:

  • そのフィールド名を Vary 応答ヘッダーフィールドに列挙することが適切かどうか(例:オリジンサーバのコンテンツ選択アルゴリズムで使われる場合。Section 12.5.5 を参照)。
  • PUT リクエストで受信した際にそのフィールドを保存すべきかどうか(Section 9.3.4 を参照)。
  • セキュリティ上の懸念からリダイレクトを自動的に行う際にそのフィールドを削除すべきかどうか(Section 15.4 を参照)。
16.3.2.1. 新しいフィールド名に関する考慮事項

新しいフィールドを定義する仕様の著者は、短く説明的なフィールド名を選ぶことが望ましいです。短い名前は不要なデータ転送を避け、説明的な名前は混乱や将来の「スコッティング(名の占有)」を避けます。

限定的な用途のフィールド(単一のアプリケーションやユースケースに限定されるヘッダ等)は、その利用を示すプレフィックス(または略語)を名前に含めることが奨励されます。例えば Foo アプリケーションが Description フィールドを必要とするなら "Foo-Desc" を使うべきで、"Description" はあまりに一般的で、"Foo-Description" は冗長です。

フィールド名構文は任意の token 文字を許しますが、実装によっては受け付ける文字に制限を設けていることがあります。相互運用性を得るために、新しいフィールド名は英数字、"-"、"." に制約し、先頭は文字にすることが SHOULD 推奨されます。例えばアンダースコア ("_") は非 HTTP ゲートウェイを通す際に問題を起こすことがあります(Section 17.10 を参照)。

フィールド名は "X-" で始めるべきではありません。詳細は [BCP178] を参照してください。

他の接頭辞もフィールド名に使われることがあります。例えば "Accept-" は多くのコンテンツネゴシエーションヘッダで、"Content-" は Section 6.4 で説明される用途で使われます。これらの接頭辞はフィールドの目的を認識しやすくする助けであり、自動処理を引き起こすものではありません。

16.3.2.2. 新しいフィールド値に関する考慮事項

新しい HTTP フィールドを定義する大きな作業の一つは、フィールド値の構文の仕様化です:送信者が何を生成すべきか、受信者が受信したものからどのようにセマンティクスを推測すべきかを定めます。

著者は本仕様の ABNF ルールまたは [RFC8941] のルールのいずれかを使って新しいフィールド値の構文を定義することが奨励されます(必須ではありません)。

複数のフィールド行の組合せがどのような影響を与えるかを慎重に検討することが望ましいです(Section 5.3)。送信者が誤って複数値を送ることがあり得ること、中間者や HTTP ライブラリが自動的に結合する可能性があることを考慮して、単一値を想定していてもこれが当てはまります。

したがって、カンマを含む値は区切りが誤解されないように区切りやエンコードを施すことが推奨されます(例:quoted-string ルールや [RFC8941] の String データ型、またはフィールド固有のエンコーディング)。これによりフィールドデータ内のカンマがリスト値を区切るカンマと混同されるのを防げます。

例えば Content-Type は値の中でカンマを許す場合は引用文字列内に限定しており、複数値がある場合でも確実に解析できます。対照的に Location は URI にカンマが含まれ得るため、カンマを含む単一値と 2 つの値を確実に区別できないため模倣すべきではない例です。

単一値(Section 5.5 を参照)を持つフィールドの著者は、複数メンバーが存在するメッセージをどのように扱うかを文書化することを推奨されます(妥当なデフォルトはフィールドを無視することですが、常に正しい選択とは限りません)。

16.4. 認証スキームの拡張性

16.4.1. 認証スキーム登録簿

"Hypertext Transfer Protocol (HTTP) Authentication Scheme Registry" はチャレンジやクレデンシャルで使用される認証スキームの名前空間を定義します。https://www.iana.org/assignments/http-authschemes で管理されています。

登録は次のフィールドを含まなければなりません(MUST):

  • Authentication Scheme Name
  • Pointer to specification text
  • Notes (optional)

この名前空間に値を追加するには IETF Review が必要です([RFC8126], Section 4.8 を参照)。

16.4.2. 新しい認証スキームに関する考慮事項

HTTP 認証フレームワークには新しい認証スキームの動作を制約する側面がいくつかあります:

  • HTTP 認証はステートレスであると想定されます:要求を認証するために必要な情報はすべてリクエスト内で提供されるべきであり、サーバが過去のリクエストを記憶することに依存すべきではありません。基盤となる接続に基づく認証は本仕様の範囲外であり、接続が認証済みユーザー以外によって使用され得ないことを保証するための措置が取られていない限り、根本的に問題があります(Section 3.3 を参照)。

  • 認証パラメータ "realm" は保護領域を定義するために予約されています(Section 11.5)。新しいスキームはその定義と矛盾する方法で realm を使用してはなりません(MUST NOT)。

  • "token68" 記法は既存の認証スキームとの互換性のために導入され、チャレンジまたはクレデンシャルにつき一度だけ使用できます。したがって新しいスキームは将来の拡張が不可能にならないように、代わりに auth-param 構文を使用することが望ましいです。

  • チャレンジとクレデンシャルの解析は本仕様で定義されており、新しい認証スキームによって変更することはできません。auth-param 構文を使用する場合、すべてのパラメータは token と quoted-string の両方の構文をサポートするべきであり、構文的制約は解析後のフィールド値に対して定義されるべきです(すなわち quoted-string の処理)。これは受信者がすべての認証スキームに適用される汎用パーサを使用できるようにするために必要です。

    Note: "realm" パラメータの値構文が quoted-string に制限されていることは設計上の誤りであり、新しいパラメータでは繰り返すべきではありません。

  • 新しいスキームの定義は不明な拡張パラメータの扱いを定義するべきです。一般に、後方互換性の観点から "must-ignore" ルールは "must-understand" より好ましく、そうでなければレガシー受信者の存在下で新しいパラメータを導入するのが困難になります。さらに、新しいパラメータを定義する方針(仕様を更新する、あるいはこの登録簿を使う等)を記述するのが良いです。

  • 認証スキームは、それがオリジンサーバ認証(WWW-Authenticate を用いる)で使用可能か、プロキシ認証(Proxy-Authenticate を用いる)で使用可能かを文書化する必要があります。

  • Authorization ヘッダーフィールドに格納されるクレデンシャルはユーザーエージェント固有であり、したがってそれらはリクエスト内で出現する範囲で HTTP キャッシュに対して "private" キャッシュ応答指示子と同様の効果を持ちます(Section 5.2.2.7 of [CACHING] を参照)。

    したがって、Authorization ヘッダを用いない(例えば新しく定義したヘッダを使う)認証スキームは、応答がキャッシュされないように明示的に禁止する必要があります(例:"private" のようなキャッシュ応答指示子を必須にするなど)。

  • Authentication-Info, Proxy-Authentication-Info、または他の認証関連の応答ヘッダーフィールドを使用するスキームは、関連するセキュリティ考慮事項を検討し文書化する必要があります(Section 17.16.4 を参照)。

16.5. レンジ単位の拡張性

16.5.1. レンジ単位登録簿

"HTTP Range Unit Registry" はレンジ単位名の名前空間を定義し、それらに対応する仕様を参照します。https://www.iana.org/assignments/http-parameters で管理されています。

HTTP Range Unit の登録には次のフィールドを含める必要があります(MUST):

  • Name
  • Description
  • Pointer to specification text

この名前空間に値を追加するには IETF Review が必要です([RFC8126], Section 4.8 を参照)。

16.5.2. 新しいレンジ単位に関する考慮事項

ページ、セクション、レコード、行、時間などのフォーマット固有の境界のような他のレンジ単位は、アプリケーション固有の目的で HTTP で利用可能ですが、実務ではあまり使われません。代替レンジ単位の実装者は、それらがコンテンツコーディングや汎用の仲介者とどのように機能するかを検討するべきです。

16.6. コンテンツコーディングの拡張性

16.6.1. コンテンツコーディング登録簿

"HTTP Content Coding Registry" は IANA により https://www.iana.org/assignments/http-parameters/ で管理され、content-coding 名を登録します。

コンテンツコーディングの登録は次のフィールドを含まなければなりません(MUST):

  • Name
  • Description
  • Pointer to specification text

コンテンツコーディングの名前は、転送コーディングの名前と重複してはなりません("HTTP Transfer Coding Registry" https://www.iana.org/assignments/http-parameters/ を参照)、ただしエンコーディング変換が同一である場合は例外です(Section 8.4.1 の圧縮コーディングなど)。

この名前空間に値を追加するには IETF Review が必要であり(Section 4.8 of [RFC8126] を参照)、MUST は Section 8.4.1 で定義されたコンテンツコーディングの目的に合致しなければなりません。

16.6.2. 新しいコンテンツコーディングに関する考慮事項

新しいコンテンツコーディングは可能な限り自己記述的であるべきであり、オプションのパラメータはコーディングフォーマット内で検出可能にし、転送中に失われる可能性のある外部メタデータに依存すべきではありません。

16.7. Upgrade トークン登録簿

"Hypertext Transfer Protocol (HTTP) Upgrade Token Registry" は Upgrade ヘッダーフィールドで使用されるプロトコル名トークンの名前空間を定義します。登録簿は https://www.iana.org/assignments/http-upgrade-tokens で管理されています。

各登録プロトコル名は連絡先情報およびアップグレード後に接続がどのように処理されるかを詳細に示す仕様群(任意)と関連付けられます。

登録は "先着順" で行われます(Section 4.4 of [RFC8126] を参照))および次の規則に従います:

  1. 一度登録されたプロトコル名トークンは永続的に登録されます。
  2. プロトコル名トークンは大文字小文字を区別せず、送信者が生成すべき推奨の表記で登録されます。
  3. 登録は責任を負う当事者の名前を記載しなければなりません(MUST)。
  4. 登録は連絡先ポイントを記載しなければなりません(MUST)。
  5. 登録は関連する仕様群を列挙してもよい(任意)。そのような仕様は公開されていなくても構いません(MAY)。
  6. 登録は当時における期待される "protocol-version" トークンの集合を記載することが望ましい(SHOULD)。
  7. 責任者はいつでも登録を変更できます(MAY)。IANA はそのような変更の記録を保持し、要請に応じて公開します。
  8. 責任者に連絡が取れない場合、IESG は通常それを引き継ぐ形でプロトコルトークンの責任を再割り当てすることができます(MAY)。

17. セキュリティに関する考慮事項

この節は、HTTP のセマンティクスおよびインターネット上で情報を転送する際の使用に関連する既知のセキュリティ上の懸念を、開発者、情報提供者、および利用者に知らせることを目的としています。キャッシュに関連する考慮事項は Section 7 of [CACHING]、HTTP/1.1 のメッセージ構文と解析に関する考慮事項は Section 11 of [HTTP/1.1] で議論されています。

以下の考慮事項の一覧は網羅的ではありません。HTTP セマンティクスに関連する多くのセキュリティ上の懸念は、プロトコル自体の安全性というよりも、サーバー側アプリケーション(HTTP インターフェースの裏側のコード)の保護、HTTP 経由で受信したコンテンツのユーザーエージェントによる処理の保護、または一般的なインターネットの安全な利用に関するものです。HTTP の動作に不可欠な URI のセキュリティ考慮事項は Section 7 of [URI] で議論されています。さまざまな組織が Web アプリケーションセキュリティに関する最新の研究や情報へのリンクを維持しています(例: [OWASP])。

17.1. 権威の確立

HTTP は authoritative response(権威あるレスポンス)の概念に依存しています。これは、ターゲット URI により識別されるオリジンサーバ(またはその指示)によって、その応答がリクエストに対して最も適切であると判断されたレスポンスを意味します。判定はレスポンス生成時点でのターゲットリソースの状態に基づきます。

authority コンポーネントに登録済みの名前が使われる場合、"http" URI スキーム(Section 4.2.1)は、どこで権威ある応答を見つけられるかを決定するためにユーザーのローカルな名前解決サービスに依存します。つまり、ユーザーのネットワークのホストテーブル、キャッシュされた名前、あるいは名前解決ライブラリに対するいかなる攻撃も、"http" URI の権威確立に対する攻撃の経路になり得ます。同様に、ユーザーが選択する DNS サーバや、その解決結果を得るためのサーバ階層もアドレス割り当ての真正性に影響を与える可能性があります。DNSSEC([RFC4033])は真正性を改善する一手段であり、より安全な転送プロトコル上で DNS 要求を行う手段も有用です。

さらに、IP アドレスを取得した後でも、"http" URI の権威確立はインターネットプロトコルのルーティングに対する攻撃に対して脆弱です。

"https" スキーム(Section 4.2.2)は、ネゴシエートされた接続が保護され、クライアントが通信先サーバの識別がターゲット URI の authority コンポーネントと一致することを適切に検証する場合に、これらの潜在的な攻撃の多くを防止(あるいは少なくとも検出)することを意図しています(Section 4.3.4)。そのような検証を正しく実装するのは困難である場合があります(参照: [Georgiev])。

あるオリジンサーバに対する権威は、プロトコル拡張を通じて委譲され得ます。例えば、[ALTSVC] のようなものです。同様に、接続が権威的と見なされるサーバ群は [RFC8336] のような拡張によって変更され得ます。

非権威的な送信元(共有プロキシキャッシュなど)からの応答を提供することは、パフォーマンスや可用性を改善するうえで有用ですが、その送信元が信頼できるか、あるいは信頼できない応答を安全に使用できる場合に限られます。

残念ながら、ユーザーに対して権威性を伝えることは難しい場合があります。例えば、phishing はユーザーの権威に関する認知を攻撃するもので、ハイパーテキスト内に類似のブランディングを提示することで誤認を誘う場合があります。userinfo が authority コンポーネントを曖昧にすることも助長することがあります(参照: Section 4.2.1)。ユーザーエージェントは、アクションを実行する前にユーザーがターゲット URI を簡単に確認できるようにしたり、userinfo が存在する場合にそれを明確に区別(または拒否)したり、参照元が不明または信頼できない場合に保存された認証情報や Cookie を送信しないようにすることでフィッシング攻撃の影響を軽減できます。

17.2. 仲介者のリスク

HTTP の仲介者は経路上に配置されるため、本質的にオンパス攻撃に都合の良い位置にあります。仲介者が稼働するシステムが侵害されると深刻なセキュリティおよびプライバシーの問題が発生します。仲介者はセキュリティ関連情報や個々のユーザーや組織に関する個人情報、ユーザーやコンテンツ提供者に帰属する専有情報にアクセスできる場合があります。侵害された仲介者、あるいはセキュリティとプライバシーに配慮せずに実装または設定された仲介者は、広範囲の潜在的攻撃に利用され得ます。

共有キャッシュを持つ仲介者は特にキャッシュポイズニング攻撃に脆弱です。この点は Section 7 of [CACHING] に詳述されています。

実装者は、自身の設計やコーディングの決定、運用者に提供する設定オプション(特にデフォルト設定)のプライバシーおよびセキュリティへの影響を考慮する必要があります。

仲介者は、その運用下にある人々とポリシー以上に信頼できるものではありません;HTTP でこの問題を解決することはできません。

17.3. ファイル名・パス名に基づく攻撃

オリジンサーバはしばしばローカルファイルシステムを利用してターゲット URI からリソース表現へのマッピングを管理します。多くのファイルシステムは悪意あるファイル名やパス名に対する保護を目的として設計されていません。したがって、オリジンサーバはターゲットリソースをファイルやフォルダ、ディレクトリにマップする際にシステム上で特別な意味を持つ名前にアクセスしないようにする必要があります。

例えば、UNIX、Microsoft Windows、その他の OS は ".." を現在のディレクトリの上位を示すパス要素として利用し、また特定の名前のパスやファイル名をシステムデバイスへデータを送るために使うことがあります。他のタイプのストレージシステムにも類似の命名慣習が存在するかもしれません。同様に、ローカルストレージシステムは無効または予期しない文字の処理、分解された文字の再構成、大小区別をしない名前の大文字小文字正規化において使いやすさを優先してしまいがちです。

そのような特別な名前に基づく攻撃は、COM ポートからの読み取りをサーバに指示するなどのサービス拒否や、提供されるべきでない構成ファイルやソースファイルの開示に焦点を当てる傾向があります。

17.4. コマンド・コード・クエリ注入に基づく攻撃

オリジンサーバはしばしば URI 内のパラメータをシステムサービスの指定、データベースエントリの選択、またはデータソースの選定に使用します。しかし、リクエストで受け取るデータは信頼できません。攻撃者は要求データ要素(メソッド、ターゲット URI、ヘッダーフィールド、またはコンテンツ)のいずれにも、コマンド呼び出し、言語インタプリタ、あるいはデータベースインターフェースを通したときに命令として誤解され得るデータを含めることができます。

例えば、SQL インジェクションは、ターゲット URI の一部やヘッダーフィールド(例: Host, Referer 等)に追加の照会言語を挿入する一般的な攻撃です。受信データが SELECT 文内に直接使われると、その照会言語が単なる文字列ではなくデータベースコマンドとして解釈される可能性があります。この種の実装上の脆弱性は非常に一般的ですが、防止は容易です。

一般に、リソースの実装は、要求データを命令として処理・解釈される文脈で使用することを避けるべきです。パラメータは固定の文字列と比較してその比較結果に基づいて処理されるべきであり、信頼できないデータを受け入れるインターフェースへ直接渡してはなりません。固定パラメータに基づかない受信データは、誤解釈を避けるために慎重にフィルタリングまたはエンコードされるべきです。

同様の考慮事項は、ログファイルやモニタリングツール内に保存され後で処理されるリクエストデータ、あるいはスクリプトの埋め込みを許すデータ形式に含まれる場合にも適用されます。

17.5. プロトコル要素長に基づく攻撃

HTTP が主にテキストの区切りで表現されるフィールドを使うため、長大(あるいは非常に遅い)データストリームを送信することに基づく攻撃にパーサが脆弱になることがあります。特に実装が長さに上限を設けていないプロトコル要素を期待している場合に問題となります(参照: Section 2.3)。

相互運用性を促進するため、フィールドの最小サイズ制限に関する具体的な推奨が示されています(Section 5.4)。これらはリソースが限られた実装でもサポートできるように選ばれた最小推奨値であり、多くの実装はこれよりもはるかに大きな制限を選択することが期待されます。

サーバはターゲット URI が長すぎるメッセージ(Section 15.5.15)や要求コンテンツが大きすぎる(Section 15.5.14)メッセージを拒否できます。容量制限に関連する追加のステータスコードは拡張で定義されています(参照: [RFC6585])。

受信者は、要求メソッド、レスポンスステータスフレーズ、フィールド名、数値値、チャンク長など、他のプロトコル要素の処理量を慎重に制限するべきです。これらの処理を制限しないと、バッファや算術オーバーフローによる任意コード実行や、サービス拒否攻撃に対する脆弱性の増大を招く可能性があります。

17.6. 共有辞書圧縮を用いる攻撃

暗号化プロトコルに対するいくつかの攻撃は、動的圧縮によって生じるサイズ差を利用して機密情報を露見させます。例えば [BREACH] のような攻撃です。これらの攻撃は、攻撃者が制御するコンテンツと機密情報の間に冗長性を作り出し、両者に対して同じ辞書を使う動的圧縮アルゴリズムが攻撃者制御コンテンツと機密コンテンツが一致する場合により効率よく圧縮することを利用します。

HTTP メッセージは TLS 圧縮、content codings、transfer codings、その他の拡張やバージョン固有のメカニズムを含む複数の方法で圧縮可能です。

このリスクに対する最も効果的な緩和策は、機密データに対して圧縮を無効にするか、攻撃者制御のデータと機密データを厳密に分離して同じ圧縮辞書を共有できないようにすることです。慎重な設計により、HPACK([HPACK])のように限定的なユースケースでは悪用されないと見なせる圧縮方式を設計することも可能です。

17.7. 個人情報の開示

クライアントは、ユーザーがリソースとやり取りするために提供する情報(例:氏名、位置、メールアドレス、パスワード、暗号鍵など)や、ユーザーの閲覧活動に関する情報(履歴、ブックマーク等)を大量に扱うことがあります。実装は個人情報の意図しない開示を防止する必要があります。

17.8. サーバログ情報のプライバシー

サーバはユーザーのリクエストに関する個人データを時間を通じて保存でき、その結果として読書傾向や関心領域を特定できる場合があります。特に仲介者で収集されたログ情報は多くのサイトにまたがるユーザーエージェントの利用履歴を含み、個々のユーザーへ追跡可能です。

HTTP のログ情報は機密性が高く、その取り扱いはしばしば法令によって制約されます。ログ情報は安全に保管され、分析には適切なガイドラインに従う必要があります。個別のエントリ内の個人情報の匿名化は役立ちますが、他のアクセス特性との相関により実際のログトレースが再識別されるのを一般的に防ぐには十分ではありません。したがって、特定クライアントに紐づくアクセス痕跡は、鍵が仮名化されていても公開するのは安全ではありません。

盗難や偶発的な公開のリスクを最小化するため、ログ情報はセキュリティ、監査、または不正防止の運用上必要でなくなった時点で、ユーザー識別子、IP アドレス、ユーザー提供のクエリパラメータ等の個人を特定し得る情報を削除するべきです。

17.9. URI に含まれる機密情報の開示

URI は共有を目的としており、セキュアに保つものではありません。URI は画面に表示されたり、印刷時にテンプレートへ追加されたり、保護されていないブックマークリストに保存されたりします。多くのサーバ、プロキシ、ユーザーエージェントはターゲット URI を第三者に見える場所にログや表示するため、URI に機密性の高い個人識別可能な情報や開示リスクのある情報を含めるのは賢明ではありません。

アプリケーションがクライアント側でユーザー提供情報からターゲット URI を構築する(例えば GET を使ったフォームのクエリフィールド)場合、機密データが URI に含まれてしまう可能性があります。そのような場合は POST を使うことがしばしば推奨されます。POST は通常 URI を構築せず、代わりにリクエスト本文で機密データを送信します。ただしこれによりキャッシュが使えず、本来は安全なリクエストに対して安全でないメソッドを使うことになります。代替策として、URI を構築する前にユーザー提供データを変換する、あるいは機密でない一般的な値だけを含めるようにフィルタすることが考えられます。同様に、クエリの結果を別の(サーバ生成の)URI にリダイレクトすることで、後続のリンクから機密データを取り除き、後から再利用可能なキャッシュ可能な応答を提供できます。

Referer ヘッダーフィールドは、ターゲットサイトに対してそのリクエストを引き起こした文脈を伝えるため、参照元リソースの URI に含まれる個人情報や直近の閲覧履歴を明らかにする可能性があります。Referer ヘッダの制限は Section 10.1.3 でいくつかのセキュリティ考慮に対応する形で説明されています。

17.10. フィールド名のアプリケーション側処理

サーバは受け取ったリクエストを処理してレスポンスのコンテンツを生成するために、非 HTTP のゲートウェイインターフェースやフレームワークを利用することがよくあります。歴史的理由により、そのようなインターフェースは受け取ったフィールド名を外部変数名として渡し、環境変数に適した名前マッピングを用いることがよくあります。

例えば、Common Gateway Interface (CGI) におけるプロトコル特有メタ変数のマッピング(Section 4.1.18 of [RFC3875]で定義)は、CGI の標準変数に対応しない受信ヘッダーフィールドに適用されます;マッピングは各名前に "HTTP_" を付加し、ハイフン ("-") をアンダースコア ("_") に置換するものです。この同じマッピングは、多くのアプリケーションフレームワークに受け継がれており、プラットフォーム間でアプリケーションを移行する際の簡略化に寄与しています。

CGI では、受信した Content-Length フィールドはメタ変数 "CONTENT_LENGTH" として渡され、その値は受信フィールドの値と一致します。対照的に、受信した "Content_Length" ヘッダーフィールドはプロトコル特有メタ変数 "HTTP_CONTENT_LENGTH" として渡され、アプリケーションが誤ってプロトコル特有メタ変数を既定のものの代わりに読んでしまうと混乱を招く可能性があります(この歴史的慣行が Section 16.3.2.1 でアンダースコアを含む新しいフィールド名の作成を避けるよう勧める理由です)。

残念ながら、フィールド名を異なるインターフェース名へマッピングすることは、そのマッピングが不完全または曖昧であるとセキュリティ脆弱性を招く可能性があります。例えば、攻撃者が "Transfer_Encoding" という名前のフィールドを送った場合、単純なインターフェースはそれを "Transfer-Encoding" と同じ変数名にマップしてしまい、リクエストスモギングの脆弱性を生む可能性があります(参照: Section 11.2 of [HTTP/1.1])。

関連リスクを軽減するため、そのようなマッピングを行う実装は、受信され得る名前(HTTP 文法で禁じられているか推奨されない文字を含むものを含む)の全域に対してマッピングを曖昧さなく完全に定義することが勧められます。例えば、通常とは異なる文字を含むフィールド名はリクエストをブロックする、特定フィールドだけを削除する、あるいは他のフィールドと区別するために別のプレフィックスで渡す、といった対処を行うことが考えられます。

17.11. リダイレクト後のフラグメント開示

URI 参照内で使用されるフラグメント識別子はリクエストには送信されませんが、実装者はそれらがユーザーエージェントやレスポンスに起因して実行される拡張やスクリプトから見えることに注意すべきです。特に、リダイレクトが発生し、元のリクエストのフラグメント識別子が Location の新しい参照に継承される場合(Section 10.2.2)、これによりあるサイトのフラグメントが別のサイトへ開示される可能性があります。もし最初のサイトがフラグメントに個人情報を使っているなら、他サイトへのリダイレクト時に(空でも良いので)フラグメント成分を含めることでその継承を阻止すべきです。

17.12. 製品情報の開示

User-AgentSection 10.1.5)、ViaSection 7.6.3)、および ServerSection 10.2.4)のヘッダーフィールドは 送信者のソフトウェアシステムに関する情報を明らかにすることがよくあります。理論的にはこれにより攻撃者が既知の脆弱性を悪用しやすくなる可能性がありますが、実際には攻撃者は見かけ上のソフトウェアバージョンに関わらずあらゆる潜在的穴を試す傾向があります。

ネットワークファイアウォールの内部ホストへのポータルとして機能するプロキシは、ファイアウォール内部のホストを識別する可能性のあるヘッダー情報の転送について特別な注意を払うべきです。Via ヘッダーフィールドは仲介者が機密性の高いマシン名を偽名に置き換えることを可能にします。

17.13. ブラウザフィンガープリンティング

ブラウザフィンガープリンティングは、特定のユーザーエージェントを時間を通じて識別する技術群です。これらの特徴には、基盤となるトランスポートプロトコルの使用法、機能能力、スクリプト環境などに関連する情報が含まれることがありますが、ここで特に関心があるのは HTTP を通じて通信され得る一連の固有の特徴です。フィンガープリンティングは、クッキーなど他のデータ収集手段に対するユーザーの制御が伴わない形でユーザーエージェントの追跡を可能にするためプライバシー上の懸念と見なされます(参照: [Bujlow])。多くの汎用ユーザーエージェント(ウェブブラウザ)は自身のフィンガープリントを減らす措置を講じています。

サーバに対して十分に固有で追跡可能な情報を明らかにする可能性のあるリクエストヘッダーフィールドはいくつかあります。最も明白なのは From ヘッダですが、From は通常ユーザーが自己同定を望む場合にのみ送信されることが期待されます。同様に、Cookie ヘッダーフィールドは再識別を可能にするよう意図されているため、フィンガープリンティングの懸念はクッキーが無効化または制限されている状況にのみ適用されます。

User-Agent ヘッダは、特に他の特徴と組み合わせると特定のデバイスを一意に識別するのに十分な情報を含むことがあります。ただし、ユーザーエージェントがシステムや拡張機能について過度に詳述する場合に限られることが多いです。ユーザーにとって最も予期されない一意情報の供給源は、proactive negotiationSection 12.1)であり、具体的には Accept, Accept-Charset, Accept-Encoding, Accept-Language といったヘッダーフィールドです。

Accept-Language ヘッダを詳細に使用すると、ユーザーが私的と考える情報を明らかにすることがあり得ます。例えば、ある言語集合の理解が特定の民族集団への所属と強く相関する場合があります。プライバシー損失を制限する一つの方策は、ユーザーエージェントが明示的に許可したサイトに対してのみ Accept-Language を送信することであり、許可は Vary ヘッダの検出後の対話を通じて行われ得ます。

プライバシーを強化するためにプロキシを用いる環境では、ユーザーエージェントはプロアクティブネゴシエーションヘッダの送信について控えめであるべきです。高いヘッダーフィールド構成性を提供する汎用ユーザーエージェントは、過度に詳細を提供することによるプライバシー損失についてユーザーに知らせるべきです。極端なプライバシー対策として、プロキシは中継リクエストにおけるプロアクティブネゴシエーションヘッダーフィールドをフィルタすることができます。

17.14. バリデータの保持

本仕様で定義されるバリデータは、表現の妥当性を保証したり、悪意ある変更を防いだり、オンパス攻撃を検出したりすることを目的としたものではありません。せいぜい、それらはすべての参加者が正常に動作している場合に効率的なキャッシュ更新や楽観的な並行書き込みを可能にします。最悪の場合、条件は失敗し、クライアントは条件付きリクエストがない HTTP 交換と比べて特に有害でないレスポンスを受け取るだけです。

エンティティタグはプライバシーリスクを生む形で悪用され得ます。例えば、サイトがユーザーやユーザーエージェントごとに一意な意味的に無効なエンティティタグを意図的に構成し、それを長い鮮度時間を持つキャッシュ可能なレスポンスで送信し、後の条件付きリクエストでそのエンティティタグを読み取ってユーザーやエージェントを再識別する手段とすることが可能です。そのような識別タグは、ユーザーエージェントが元のキャッシュエントリを保持している限り持続的な識別子となります。キャッシュを保持するユーザーエージェントは、クッキーの消去やプライベートブラウジングモードへの切替えなど、プライバシーを維持する操作が行われた際にキャッシュをクリアまたは置換することを保証するべきです。

17.15. レンジを用いたサービス拒否攻撃

無制限の複数レンジ要求は、同じデータの多くの重複レンジを要求することで生じるサーバ側の処理コスト(時間・メモリ・帯域幅)が要求側の労力に比べて大きくなるため、サービス拒否攻撃に利用され得ます。サーバは 2 つを超える重複レンジ、または単一集合内で多くの小さなレンジ(特に順序性のない大量の要求)など、過度なレンジ要求を無視、結合、あるいは拒否すべきです。マルチパートレンジ要求はランダムアクセスをサポートするよう設計されていません。

17.16. 認証に関する考慮事項

HTTP 認証に関する話題はすべてセキュリティ考慮事項に該当するため、以下の考慮事項は網羅的ではありません。さらに、ここで扱うのは一般的な認証フレームワークに関するセキュリティ考慮であり、特定の認証スキームに対するすべての潜在的考慮事項は、それらのスキームを定義する仕様で文書化されるべきです。さまざまな組織が Web アプリケーションセキュリティに関する最新情報や一般的な実装上の落とし穴に関する資料を提供しています(例: [OWASP])。

17.16.1. 資格情報の機密性

HTTP 認証フレームワークは資格情報の機密性を維持する単一のメカニズムを定義しているわけではなく、各認証スキームが送信前に資格情報をどのようにエンコードするかを定義します。この柔軟性は将来のスキーム開発に役立ちますが、独自に機密性を提供しない既存スキームやリプレイ攻撃に十分対抗できないスキームの保護には不十分です。さらに、サーバがユーザーごとに固有の資格情報を期待する場合、その交換は資格情報内の内容が機密であってもユーザーを識別する効果を持ちます。

HTTP はフィールドの機密伝送を提供するために基盤となるトランスポートあるいはセッションレベルの接続のセキュリティ特性に依存しています。個々のユーザー認証に依存するサービスは、資格情報を交換する前に secured な接続を要求します(参照: Section 4.2.2)。

17.16.2. 資格情報とアイドルクライアント

既存の HTTP クライアントやユーザーエージェントは通常、認証情報を無期限に保持する傾向があります。HTTP にはオリジンサーバがクライアントにこれらのキャッシュ済み資格情報を破棄するよう指示するメカニズムがないため、資格情報がどのように取得・管理されるかをプロトコルは認識していません。資格情報の期限切れや取り消しのメカニズムは、認証スキームの定義の一部として指定できます。

資格情報のキャッシュがアプリケーションのセキュリティモデルと干渉する可能性のある状況には次のようなものが含まれます(ただしこれに限定されません):

  • 長期間アイドル状態だったクライアントで、サーバがクライアントに対して資格情報の再入力を促したい場合。
  • ページ上の「ログアウト」や「コミット」ボタンのようなセッション終了の表示を含むアプリケーションで、サーバ側がそれ以降クライアントが資格情報を保持する理由がないと「知っている」場合。

資格情報をキャッシュするユーザーエージェントは、ユーザーが制御して簡単にキャッシュ済み資格情報を破棄できる仕組みを提供することが推奨されます。

17.16.3. 保護領域(Protection Spaces)

"realm" 機構のみに依存して保護領域を確立する認証スキームは、オリジンサーバ上のすべてのリソースに対して資格情報を曝露することになります。あるリソースで認証済みのクライアントは同じオリジンの他のリソースに対して同じ認証資格情報を使用できるため、別のリソースが他のリソースの認証資格情報を収集する可能性が生じます。

これは、オリジンサーバが同一オリジンで複数の当事者のためにリソースをホストする場合に特に問題となります(参照: Section 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 は "Uniform Resource Identifier (URI) Schemes" レジストリ [BCP35]https://www.iana.org/assignments/uri-schemes/ で更新し、Section 4.2Table 2 に示されている恒久的スキームを追加しました。

18.2. メソッドの登録

IANA は "Hypertext Transfer Protocol (HTTP) Method Registry" を https://www.iana.org/assignments/http-methods で更新し、Section 16.1.1 の登録手順と、以下の表に要約されたメソッド名を登録しました。

表 7
メソッド 安全(Safe) 冪等(Idempotent)
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 は "Hypertext Transfer Protocol (HTTP) Status Code Registry" を https://www.iana.org/assignments/http-status-codes で更新し、Section 16.2.1 の登録手順および以下の表に要約されたステータスコード値を登録しました。

表 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 (Unused) 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 (Unused) 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 は Section 16.3.1 に概説されたとおり "Hypertext Transfer Protocol (HTTP) Field Name Registry" を作成しました。

IANA はプロトコルが 'http' の "Permanent Message Header Field Names" および "Provisional Message Header Field Names" のレジストリ(参照: https://www.iana.org/assignments/message-headers/)にあるすべてのエントリをこの新しいレジストリに移動し、次の変更を適用しました:

  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 permanent 12.5.1
Accept-Charset deprecated 12.5.2
Accept-Encoding permanent 12.5.3
Accept-Language permanent 12.5.4
Accept-Ranges permanent 14.3
Allow permanent 10.2.1
Authentication-Info permanent 11.6.3
Authorization permanent 11.6.2
Connection permanent 7.6.1
Content-Encoding permanent 8.4
Content-Language permanent 8.5
Content-Length permanent 8.6
Content-Location permanent 8.7
Content-Range permanent 14.4
Content-Type permanent 8.3
Date permanent 6.6.1
ETag permanent 8.8.3
Expect permanent 10.1.1
From permanent 10.1.2
Host permanent 7.2
If-Match permanent 13.1.1
If-Modified-Since permanent 13.1.3
If-None-Match permanent 13.1.2
If-Range permanent 13.1.5
If-Unmodified-Since permanent 13.1.4
Last-Modified permanent 8.8.2
Location permanent 10.2.2
Max-Forwards permanent 7.6.2
Proxy-Authenticate permanent 11.7.1
Proxy-Authentication-Info permanent 11.7.3
Proxy-Authorization permanent 11.7.2
Range permanent 14.2
Referer permanent 10.1.3
Retry-After permanent 10.2.3
Server permanent 10.2.4
TE permanent 10.1.4
Trailer permanent 6.6.2
Upgrade permanent 7.8
User-Agent permanent 10.1.5
Vary permanent 12.5.5
Via permanent 7.6.3
WWW-Authenticate permanent 11.6.1
* permanent 12.5.5 (予約)

フィールド名 "*" は、Vary ヘッダーフィールドにおける特殊なセマンティクスと競合する可能性があるため予約されています(参照: Section 12.5.5)。

IANA は新しいレジストリの "Content-MD5" エントリを 'obsoleted' ステータスに更新し、ヘッダーフィールドの定義に関する参照として Section 14.15 of [RFC2616](ヘッダフィールドの定義)および更新仕様からフィールド定義を削除した Appendix B of [RFC7231] への参照を追加しました。

18.5. 認証スキームの登録

IANA は "Hypertext Transfer Protocol (HTTP) Authentication Scheme Registry" を https://www.iana.org/assignments/http-authschemes で更新し、Section 16.4.1 の登録手順を追加しました。本書では認証スキーム自体は定義していません。

18.6. コンテンツコーディングの登録

IANA は "HTTP Content Coding Registry" を https://www.iana.org/assignments/http-parameters/ で更新し、Section 16.6.1 の登録手順および以下の表に要約されたコンテンツコーディング名を追加しました。

表 10
名前 説明
compress UNIX の "compress" データ形式 [Welch] 8.4.1.1
deflate "deflate" 圧縮データ([RFC1951])を "zlib" データ形式([RFC1950])内に格納したもの 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 は "HTTP Range Unit Registry" を https://www.iana.org/assignments/http-parameters/ で更新し、Section 16.5.1 の登録手順および以下の表に要約されたレンジ単位名を追加しました。

表 11
レンジ単位名 説明
bytes オクテットの範囲 14.1.2
none レンジ要求がサポートされていないことを示すためのキーワードとして予約 14.3

18.8. メディアタイプの登録

IANA は "Media Types" レジストリを https://www.iana.org/assignments/media-types で更新し、メディアタイプ "multipart/byteranges" の登録情報を Section 14.6 に基づいて追加しました。

IANA は "q" パラメータに関するレジストリ注記を更新し、本ドキュメントの Section 12.5.1 へのリンクを追加しました。

18.9. ポート登録

IANA は "Service Name and Transport Protocol Port Number Registry" を https://www.iana.org/assignments/service-names-port-numbers/ で更新し、UDP または TCP を使用するポート 80 と 443 のサービスについて以下のように更新しました:

  1. この文書を "Reference" として使用すること、そして
  2. 現在未指定の場合は "Assignee" を "IESG" に、"Contact" を "IETF_Chair" に設定すること。

18.10. Upgrade トークンの登録

IANA は "Hypertext Transfer Protocol (HTTP) Upgrade Token Registry" を https://www.iana.org/assignments/http-upgrade-tokens で更新し、Section 16.7 に記述された登録手順および以下の表に要約されたアップグレードトークン名を追加しました。

表 12
名前 説明 期待されるバージョントークン
HTTP Hypertext Transfer Protocol 任意の DIGIT.DIGIT(例: "2.0") 2.5

19. 参考文献

19.1. 規範的参照

[CACHING]
Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, Ed., “HTTP Caching”, STD 98, RFC 9111, DOI 10.17487/RFC9111, 2022年6月.
[RFC1950]
Deutsch, P. and J-L. Gailly, “ZLIB Compressed Data Format Specification version 3.3”, RFC 1950, DOI 10.17487/RFC1950, 1996年5月, <https://www.rfc-editor.org/info/rfc1950>.
[RFC1951]
Deutsch, P., “DEFLATE Compressed Data Format Specification version 1.3”, RFC 1951, DOI 10.17487/RFC1951, 1996年5月, <https://www.rfc-editor.org/info/rfc1951>.
[RFC1952]
Deutsch, P., “GZIP file format specification version 4.3”, RFC 1952, DOI 10.17487/RFC1952, 1996年5月, <https://www.rfc-editor.org/info/rfc1952>.
[RFC2046]
Freed, N. and N. Borenstein, “Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types”, RFC 2046, DOI 10.17487/RFC2046, 1996年11月, <https://www.rfc-editor.org/info/rfc2046>.
[RFC2119]
Bradner, S., “Key words for use in RFCs to Indicate Requirement Levels”, 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., “Matching of Language Tags”, BCP 47, RFC 4647, DOI 10.17487/RFC4647, 2006年9月, <https://www.rfc-editor.org/info/rfc4647>.
[RFC4648]
Josefsson, S., “The Base16, Base32, and Base64 Data Encodings”, RFC 4648, DOI 10.17487/RFC4648, 2006年10月, <https://www.rfc-editor.org/info/rfc4648>.
[RFC5234]
Crocker, D., Ed. and P. Overell, “Augmented BNF for Syntax Specifications: 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, “Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile”, RFC 5280, DOI 10.17487/RFC5280, 2008年5月, <https://www.rfc-editor.org/info/rfc5280>.
[RFC5322]
Resnick, P., Ed., “Internet Message Format”, RFC 5322, DOI 10.17487/RFC5322, 2008年10月, <https://www.rfc-editor.org/info/rfc5322>.
[RFC5646]
Phillips, A., Ed. and M. Davis, Ed., “Tags for Identifying Languages”, BCP 47, RFC 5646, DOI 10.17487/RFC5646, 2009年9月, <https://www.rfc-editor.org/info/rfc5646>.
[RFC6125]
Saint-Andre, P. and J. Hodges, “Representation and Verification of Domain-Based Application Service Identity within Internet Public Key Infrastructure Using X.509 (PKIX) Certificates in the Context of Transport Layer Security (TLS)”, RFC 6125, DOI 10.17487/RFC6125, 2011年3月, <https://www.rfc-editor.org/info/rfc6125>.
[RFC6365]
Hoffman, P. and J. Klensin, “Terminology Used in Internationalization in the IETF”, BCP 166, RFC 6365, DOI 10.17487/RFC6365, 2011年9月, <https://www.rfc-editor.org/info/rfc6365>.
[RFC7405]
Kyzivat, P., “Case-Sensitive String Support in ABNF”, RFC 7405, DOI 10.17487/RFC7405, 2014年12月, <https://www.rfc-editor.org/info/rfc7405>.
[RFC8174]
Leiba, B., “Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words”, 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., “The Transport Layer Security (TLS) Protocol Version 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): Generic Syntax”, STD 66, RFC 3986, DOI 10.17487/RFC3986, 2005年1月, <https://www.rfc-editor.org/info/rfc3986>.
[USASCII]
American National Standards Institute, “Coded Character Set -- 7-bit American Standard Code for Information Interchange”, ANSI X3.4, 1986.
[Welch]
Welch, T., “A Technique for High-Performance Data Compression”, 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 Alternative Services”, RFC 7838, DOI 10.17487/RFC7838, 2016年4月, <https://www.rfc-editor.org/info/rfc7838>.
[BCP13]
Freed, N. and J. Klensin, “Multipurpose Internet Mail Extensions (MIME) Part Four: Registration Procedures”, BCP 13, RFC 4289, DOI 10.17487/RFC4289, 2005年12月.
Freed, N., Klensin, J., and T. Hansen, “Media Type Specifications and Registration Procedures”, 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, “Deprecating the "X-" Prefix and Similar Constructs in Application Protocols”, 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, “Guidelines and Registration Procedures for URI Schemes”, 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: Reviving the CRIME Attack”, 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, “A Survey on Web Tracking: Mechanisms, Implications, and Defenses”, DOI 10.1109/JPROC.2016.2637878, In Proceedings of the IEEE 105(8), 2017年8月.
Barth, A., “HTTP State Management Mechanism”, RFC 6265, DOI 10.17487/RFC6265, 2011年4月, <https://www.rfc-editor.org/info/rfc6265>.
[Err1912]
RFC Errata, Erratum ID 1912, RFC 2978, <https://www.rfc-editor.org/errata/eid1912>.
[Err5433]
RFC Errata, Erratum 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, “The Most Dangerous Code in the World: Validating SSL Certificates in Non-Browser Software”, DOI 10.1145/2382196.2382204, In Proceedings of the 2012 ACM Conference on Computer and Communications Security (CCS '12), pp. 38-49, 2012年10月.
[HPACK]
Peon, R. and H. Ruellan, “HPACK: Header Compression for 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, “Hypertext Transfer Protocol -- 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, “Information technology -- 8-bit single-byte coded graphic character sets -- Part 1: Latin alphabet No. 1”, ISO/IEC 8859-1:1998, 1998.
[Kri2001]
Kristol, D., “HTTP Cookies: Standards, Privacy, and Politics”, ACM Transactions on Internet Technology 1(2), 2001年11月, <http://arxiv.org/abs/cs.SE/0105018>.
[OWASP]
The Open Web Application Security Project, <https://www.owasp.org/>.
[REST]
Fielding, R., “Architectural Styles and the Design of Network-based Software Architectures”, Doctoral Dissertation, University of California, Irvine, 2000年9月, <https://roy.gbiv.com/pubs/dissertation/top.htm>.
[RFC1919]
Chatel, M., “Classical versus Transparent IP Proxies”, RFC 1919, DOI 10.17487/RFC1919, 1996年3月, <https://www.rfc-editor.org/info/rfc1919>.
[RFC2047]
Moore, K., “MIME (Multipurpose Internet Mail Extensions) Part Three: Message Header Extensions for Non-ASCII Text”, 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, “Hypertext Transfer Protocol -- 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, “Use and Interpretation of HTTP Version Numbers”, RFC 2145, DOI 10.17487/RFC2145, 1997年5月, <https://www.rfc-editor.org/info/rfc2145>.
[RFC2295]
Holtman, K. and A. Mutz, “Transparent Content Negotiation in HTTP”, RFC 2295, DOI 10.17487/RFC2295, 1998年3月, <https://www.rfc-editor.org/info/rfc2295>.
[RFC2324]
Masinter, L., “Hyper Text Coffee Pot Control Protocol (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, “MIME Encapsulation of Aggregate Documents, such as HTML (MHTML)”, 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, “Hypertext Transfer Protocol -- 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 Authentication: Basic and Digest Access Authentication”, RFC 2617, DOI 10.17487/RFC2617, 1999年6月, <https://www.rfc-editor.org/info/rfc2617>.
[RFC2774]
Nielsen, H., Leach, P., and S. Lawrence, “An HTTP Extension Framework”, RFC 2774, DOI 10.17487/RFC2774, 2000年2月, <https://www.rfc-editor.org/info/rfc2774>.
[RFC2818]
Rescorla, E., “HTTP Over TLS”, RFC 2818, DOI 10.17487/RFC2818, 2000年5月, <https://www.rfc-editor.org/info/rfc2818>.
[RFC2978]
Freed, N. and J. Postel, “IANA Charset Registration Procedures”, BCP 19, RFC 2978, DOI 10.17487/RFC2978, 2000年10月.
[RFC3040]
Cooper, I., Melve, I., and G. Tomlinson, “Internet Web Replication and Caching Taxonomy”, RFC 3040, DOI 10.17487/RFC3040, 2001年1月.
[RFC3864]
Klyne, G., Nottingham, M., and J. Mogul, “Registration Procedures for Message Header Fields”, BCP 90, RFC 3864, DOI 10.17487/RFC3864, 2004年9月, <https://www.rfc-editor.org/info/rfc3864>.
[RFC3875]
Robinson, D. and K. Coar, “The Common Gateway Interface (CGI) Version 1.1”, RFC 3875, DOI 10.17487/RFC3875, 2004年10月.
[RFC4033]
Arends, R., Austein, R., Larson, M., Massey, D., and S. Rose, “DNS Security Introduction and Requirements”, RFC 4033, DOI 10.17487/RFC4033, 2005年3月.
[RFC4559]
Jaganathan, K., Zhu, L., and J. Brezak, “SPNEGO-based Kerberos and NTLM HTTP Authentication in Microsoft Windows”, RFC 4559, DOI 10.17487/RFC4559, 2006年6月.
[RFC5789]
Dusseault, L. and J. Snell, “PATCH Method for HTTP”, RFC 5789, DOI 10.17487/RFC5789, 2010年3月.
[RFC5905]
Mills, D., Martin, J., Ed., Burbank, J., and W. Kasch, “Network Time Protocol Version 4: Protocol and Algorithms Specification”, RFC 5905, DOI 10.17487/RFC5905, 2010年6月.
[RFC6454]
Barth, A., “The Web Origin Concept”, RFC 6454, DOI 10.17487/RFC6454, 2011年12月.
[RFC6585]
Nottingham, M. and R. Fielding, “Additional HTTP Status Codes”, RFC 6585, DOI 10.17487/RFC6585, 2012年4月.
[RFC7230]
Fielding, R., Ed. and J. Reschke, Ed., “Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing”, RFC 7230, DOI 10.17487/RFC7230, 2014年6月.
[RFC7231]
Fielding, R., Ed. and J. Reschke, Ed., “Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content”, RFC 7231, DOI 10.17487/RFC7231, 2014年6月.
[RFC7232]
Fielding, R., Ed. and J. Reschke, Ed., “Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests”, RFC 7232, DOI 10.17487/RFC7232, 2014年6月.
[RFC7233]
Fielding, R., Ed., Lafon, Y., Ed., and J. Reschke, Ed., “Hypertext Transfer Protocol (HTTP/1.1): Range Requests”, RFC 7233, DOI 10.17487/RFC7233, 2014年6月.
[RFC7234]
Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, Ed., “Hypertext Transfer Protocol (HTTP/1.1): Caching”, RFC 7234, DOI 10.17487/RFC7234, 2014年6月.
[RFC7235]
Fielding, R., Ed. and J. Reschke, Ed., “Hypertext Transfer Protocol (HTTP/1.1): Authentication”, RFC 7235, DOI 10.17487/RFC7235, 2014年6月.
[RFC7538]
Reschke, J., “The Hypertext Transfer Protocol Status Code 308 (Permanent Redirect)”, RFC 7538, DOI 10.17487/RFC7538, 2015年4月.
[RFC7540]
Belshe, M., Peon, R., and M. Thomson, Ed., “Hypertext Transfer Protocol Version 2 (HTTP/2)”, RFC 7540, DOI 10.17487/RFC7540, 2015年5月.
[RFC7578]
Masinter, L., “Returning Values from Forms: multipart/form-data”, RFC 7578, DOI 10.17487/RFC7578, 2015年7月.
[RFC7615]
Reschke, J., “HTTP Authentication-Info and Proxy-Authentication-Info Response Header Fields”, RFC 7615, DOI 10.17487/RFC7615, 2015年9月.
[RFC7616]
Shekh-Yusef, R., Ed., Ahrens, D., and S. Bremer, “HTTP Digest Access Authentication”, RFC 7616, DOI 10.17487/RFC7616, 2015年9月.
[RFC7617]
Reschke, J., “The 'Basic' HTTP Authentication Scheme”, RFC 7617, DOI 10.17487/RFC7617, 2015年9月.
[RFC7694]
Reschke, J., “Hypertext Transfer Protocol (HTTP) Client-Initiated Content-Encoding”, RFC 7694, DOI 10.17487/RFC7694, 2015年11月.
[RFC8126]
Cotton, M., Leiba, B., and T. Narten, “Guidelines for Writing an IANA Considerations Section in RFCs”, BCP 26, RFC 8126, DOI 10.17487/RFC8126, 2017年6月.
[RFC8187]
Reschke, J., “Indicating Character Encoding and Language for HTTP Header Field Parameters”, RFC 8187, DOI 10.17487/RFC8187, 2017年9月.
[RFC8246]
McManus, P., “HTTP Immutable Responses”, RFC 8246, DOI 10.17487/RFC8246, 2017年9月.
[RFC8288]
Nottingham, M., “Web Linking”, RFC 8288, DOI 10.17487/RFC8288, 2017年10月.
[RFC8336]
Nottingham, M. and E. Nygren, “The ORIGIN HTTP/2 Frame”, RFC 8336, DOI 10.17487/RFC8336, 2018年3月.
[RFC8615]
Nottingham, M., “Well-Known Uniform Resource Identifiers (URIs)”, RFC 8615, DOI 10.17487/RFC8615, 2019年5月.
[RFC8941]
Nottingham, M. and P-H. Kamp, “Structured Field Values for HTTP”, RFC 8941, DOI 10.17487/RFC8941, 2021年2月.
[Sniffing]
WHATWG, “MIME Sniffing”, <https://mimesniff.spec.whatwg.org>.
[WEBDAV]
Dusseault, L., Ed., “HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)”, RFC 4918, DOI 10.17487/RFC4918, 2007年6月.

付録 A. 収集された ABNF

以下の収集された ABNF では、リスト規則は Section 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、メッセージのルーティング、およびヘッダーフィールドを紹介する節がここに移されました。

セマンティックな適合性に関する要件は、実装固有の失敗を無視するか回避することを許可する規定に置き換えられました。(Section 2.2

オリジンとオリジンサーバへの権威あるアクセスの記述は、代替サービスや必ずしも TCP に基づかない保護された接続を考慮するために、"http" および "https" URI の両方について拡張されました。(Sections 4.2.1, 4.2.2, 4.3.1, and 7.3.3

ターゲット URI スキームのセマンティクスをチェックし、関連する要件を満たさないリクエストを拒否する明示的な要件が追加されました。(Section 7.4

メディアタイプ、メディアレンジ、期待値のパラメータは、1 つ以上の末尾のセミコロンにより空にできるようになりました。(Section 5.6.6

"Field value" は現在、複数のフィールド行がカンマで結合された後の値を指します — これは圧倒的に一般的な利用法です。単一のヘッダ行の値を指す場合は "field line value" を使用してください。(Section 6.3

トレーラーフィールドの意味は、チャンク転送符号化の詳細を超えて一般化されました。トレーラーフィールドの使用は、送信者がその使用を定義している場合にのみトレーラーとして生成することを許可するようさらに制限され、受信者が対応するフィールド定義がマージを許可し、その方法を定義している場合にのみヘッダ部へのマージを許可します。それ以外の場合、実装はトレーラーフィールドを別に保存するか、マージの代わりに破棄することが推奨されます。(Section 6.5.1

オリジンサーバによるリクエスト URI の絶対形式の優先度が Host ヘッダーフィールドより明示化され、プロキシ処理と整合するようにされました。(Section 7.2

Via フィールドの "received-by" の文法定義は、ホストの URI 文法の変更に伴って RFC 7230 で拡張されましたが、Via にとって望ましくない変更が含まれていました。簡素化のために received-by の生成から uri-host を削除し、既存の pseudonym 文法で包含できるようにしました。特にこの変更により received-by のホスト名に許される文字集合からカンマが除去されました。(Section 7.6.3

B.3. RFC 7231 からの変更点

実装がサポートすべき最小 URI 長が推奨されるようになりました。(Section 4.1

フィールド値に含まれる CR と NUL は拒否されるか SP にマッピングされること、そしてフィールド値が消費される前に先頭と末尾の空白が取り除かれる必要があることが明確化されました。(Section 5.5

メディアタイプ、メディアレンジ、期待値のパラメータは、1 つ以上の末尾のセミコロンにより空にできることが再度明記されました。(Section 5.6.6

HTTP メッセージの抽象データ型が導入され、メッセージの構成要素とそれらのセマンティクスを複数の HTTP バージョンに跨って抽象化して定義するようになりました。これにより内容に関する要件(何が伝えられるか)とメッセージ構文に関する要件(どのように伝えられるか)を区別しやすくなり、初期のプロトコルバージョンの制約が将来の HTTP に焼き付けられるのを避けます。(Section 6

"payload" と "payload body" という用語は "content" に置き換えられ、フィールド名など他の箇所との整合性を保ち、HTTP/2 や HTTP/3 のフレームペイロードと混同しないようにしました。(Section 6.4

"effective request URI" の用語は "target URI" に置き換えられました。(Section 7.1

クライアントの再試行に関する制限は、実装の挙動を反映するように緩和されました。(Section 9.2.2

GET、HEAD、DELETE におけるリクエストボディが相互運用できないことが明確化されました。(Sections 9.3.1, 9.3.2, and 9.3.5

PUT における修飾子としての Content-Range ヘッダーフィールドの使用が許可されるようになりました。(Section 14.4 および Section 9.3.4

OPTIONS メソッドの説明から、Content-Length を設定するという余分な要件が削除されました。(Section 9.3.7

TRACE 応答で "message/http" メディアタイプを必ず使用するという規範的な要件は削除されました。(Section 9.3.8

Expect のリストベース文法は RFC 2616 との互換性のために復元されました。(Section 10.1.1

AcceptAccept-Encoding は応答メッセージでも許可されるようになりました。後者は [RFC7694] により導入されました。(Section 12.3

"Accept Parameters"(accept-params および accept-ext の ABNF 生産規則)は Accept フィールドの定義から削除されました。(Section 12.5.1

Accept-Charset フィールドは現在非推奨です。(Section 12.5.2

Vary ヘッダーフィールドにおける "*" の意味(他の値が存在する場合)について明確化されました。(Section 12.5.5

レンジ単位は大文字小文字を区別せずに比較されます。(Section 14.1

Accept-Ranges フィールドの使用はオリジンサーバに限定されません。(Section 14.3

リダイレクトされたリクエストを作成するプロセスが明確化されました。(Section 15.4

ステータスコード 308(以前は [RFC7538] で定義)は、301、302、および 307 に近い位置で定義されるよう追加されました。(Section 15.4.9

ステータスコード 421(以前は Section 9.1.2 of [RFC7540] で定義)は、その一般的な適用性のために追加されました。421 はもはやヒューリスティックにキャッシュ可能とは定義されていません — レスポンスは接続固有(ターゲットリソースではない)であるためです。(Section 15.5.20

ステータスコード 422(以前は Section 11.2 of [WEBDAV] で定義)は、その一般的な適用性のために追加されました。(Section 15.5.21

B.4. RFC 7232 からの変更点

以前の HTTP の改訂では Last-Modified が強いバリデータであるかを判定する際に任意の 60 秒の制限が課されていましたが(Date と Last-Modified が異なる時計や準備時刻の差により生成される可能性を考慮して)、本仕様では合理的な裁量を許容するよう緩和しました。(Section 8.8.2.2

If-Match および If-Unmodified-Since に関するエッジケースの要件(検証が失敗したために 2xx レスポンスにバリデータを送信してはならないという要求)は削除されました。(Sections 13.1.1 and 13.1.4

If-Unmodified-Since が変更時刻の概念を持たないリソースには適用されないことが明確化されました。(Section 13.1.4

前提条件は、結果が成功になるのを待つのではなく、リクエストのコンテンツを処理する前に評価できるようになりました。(Section 13.2

B.5. RFC 7233 からの変更点

range-unit と ranges-specifier の文法をリファクタリングし、バイトと他の拡張レンジ単位との間の人工的な区別を簡素化しました。other-range-unit の重複する文法を削除して、レンジ単位を一般的に token と定義し、拡張を range-spec(other-range)の範囲に置くことでこれを実現しています。これにより、拡張レンジ単位を含むすべてのレンジ集合においてリスト構文(カンマ)の役割が明確化され、同じデータの複数レンジを示す range-set を表すことができます。拡張文法を range specifier に移動したことで、バイトレンジ固有のプロトコルを別個に指定することも可能になりました。

拡張メソッド上での Range ハンドリングを定義できるようになりました。(Section 14.2

部分的な PUT を実行するための修飾子としての Content-Range ヘッダーフィールドの使用を説明しました。(Section 14.4 および Section 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 (editor)
Adobe
345 Park Ave
San Jose, CA 95110
United States of America
メール: fielding@gbiv.com
URI: https://roy.gbiv.com/
Mark Nottingham (editor)
Fastly
Prahran
Australia
メール: mnot@mnot.net
URI: https://www.mnot.net/
Julian Reschke (editor)
greenbytes GmbH
Hafenweg 16
48155 Münster
Germany
メール: julian.reschke@greenbytes.de
URI: https://greenbytes.de/tech/webdav/