Studying HTTP > RFC-Translations related HTTP

この文書は、 K. Moore: On the use of HTTP as a Substrate (RFC 3205), February 2002. を 橋本英彦 が日本語訳した物です。 この文書の取り扱いについては、[Studying HTTP] の RFC 日本語訳を利用するにあたってに従って下さい。


Network Working Group
Request for Comments: 3205
BCP: 56
Category: Best Current Practice
                K. Moore
 University of Tennessee
           February 2002

基層としての HTTP の使用

この文書の位置付け

この文書は、インターネットコミュニティにおけるインターネット標準化過程プロトコルを規定し、改良のために議論と提案を求めるものである。 このプロトコルの標準化状態と状況については、"Internet Official Protocol Standards" (STD 1) の最新版を参照していただきたい。 この文書の配布に制限は無い。

著作権表示

Copyright © The Internet Society (2002). All Rights Reserved.

概要

最近、他のアプリケーション層のプロトコルのための基層{substrate} としてハイパーテキスト転送プロトコル (HTTP) を使う事に広く関心が持たれてきている。この文書では、既定のポート、URL スキーム、HTTP セキュリティメカニズムの使用を含む、HTTP の使用についての技術的事項を推奨する。

1. 導入

最近、他のアプリケーション層のプロトコルのための基層としてハイパーテキスト転送プロトコル (HTTP) [1] を使う事に広く関心が持たれてきている。この関心を例証する様々な理由は以下のようなものである。

インターネットコミュニティはプロトコルの再利用について長い伝統を持っており、それは FTP [5] や SMTP [6] の基層として Telnet [4] を使用する所まで遡る。 しかし、HTTP 上に新しいプロトコルを配置する事についての最近の関心では、そのような使用が適切であるのはいつか、またそれが適切な状況において HTTP を使うための適切な方法についての疑問の数が増えてきている。特に、HTTP 上に層をなすアプリケーションについては:

この文書ではこれらの疑問への回答としてある計画的決定{designdecisions} を推奨する。

この文書は、全ての場合に頑に守られなければいけない厳格な規則としてというよりも、プロトコル設計者、ワーキンググループ、実装者、IESG のための助言や推奨として意図されたものである。 それ故に、仕様書における適合性を表すための、RFC 2119 にて定義される大文字のキーワードは、この文書中では使用されない。

2. HTTP を使用するための設計選択に関する問題

その利点は上で列挙したにも関わらず、HTTP は全てにおいて使用されるべきであるかどうか、あるいは完全なる HTTP プロトコルが使われるべきかどうかという事についての疑問を尋ねる事には価値がある。

2.1 複雑性

HTTP は単純なプロトコルとして始まっているが、元々の設計では予測していなかった様々な機能の追加によってすぐにより複雑なものとなった。 これらの機能とは、持続的接続、バイトレンジ、内容ネゴシエーション、キャッシュのサポート等を含む。 これらは全て伝統的 web アプリケーションには有用であるが、HTTP の層上のアプリケーションには有用でないかもしれない。 これらの機能をサポートする (あるいは妨げる) 必要性によって、HTTP上に層をなすプロトコルの設計と実装の複雑性が増す事になる。 例え HTTP が実装の負荷を最小化するために "概略を描く{profile}" 事ができる時でさえ、そのような概略を描く努力は、手元の作業により適している目的に応じて作成されたプロトコルを見つける努力に勝るかもしれない。

もし既存の HTTP クライアントやサーバのコードがしばしば再利用できたとしても、HTTP 上に層をなすものと目的に応じて作られたプロトコルを使う事による新たな複雑性は、内部実行可能性{interoperability} の問題の数を増やす事になるだろう。

2.2 負荷{Overhead}

更に、HTTP は "遠隔手続呼出{remote procedure call}" のための転送方法として使用される事があるが、HTTP のプロトコル上の負荷と TCP の接続確立上の負荷によって、HTTP を使うという選択を悲しいものとしてしまう事になるだろう。 予見できる未来において付加物{payload} が小さく (数百バイト以下に) なりそうな場合、UDP, あるいは UDP と TCP の変形{variants} に基づいたプロトコルの使用が考慮されるべきである。 これは、そのプロトコルが頻度激しく使用されたり、あるいは時間やコストがかかるリンクに使用されたりする場合に、特に言える事である。 一方、接続確立上の負荷は、層上のプロトコルが HTTP/1.1 の持続的接続を利用する場合や、同じクライアントとサーバが HTTP 接続が開いている間に複数の相互動作を行うような場合は、取るに足らないものとなるであろう。

2.3 セキュリティ

HTTP は一見したところ良質なセキュリティを提供する事ができる数少ない"成熟した" インターネットプロトコルの一つに見えるが、HTTPのダイジェスト認証や TLS を十分に扱えないようなアプリケーションが多くある。

ダイジェスト認証ではクライアントとサーバの間で秘密 (例えば, パスワード) を共有する必要がある。 加えて各々のクライアントが各々のサーバとの間に使用される秘密を知ってる必要があるが、そのパーティ間でそのような秘密を転送するあらゆるセキュリティを提供しない。共有された秘密は全てが物理的に接して設置されているような小さなグループでは上手く働くであろう; しかし、巨大な、あるいはユーザが分散しているようなコミュニティでは上手く働かないであろう。 更に、サーバが妥協をすれば多数の秘密が晒される事となり、同じ秘密 (やパスワード) が複数のアプリケーションで使われていたら特に危険である。(同様の事柄はクライアントやサーバに基づくTLS にもある - もし秘密鍵が妥協されていれば攻撃者はその鍵を持つ人間のふりをする事ができる。)

TLS やその前身の SSL は元々 web サーバがクライアントを認証するために設計されたものなので、ユーザは (例えば) その人のクレジットカード番号が詐称者には送信されないという事を保証できる。 しかし、多くのアプリケーションはクライアントやサーバを認証する事や、クライアントとサーバの相互認証を提供する必要がある。 TLS は各々の方向での認証を提供する能力は持つが、そのような認証は特定のアプリケーションにとっては適切であるかどうかはわからない。

TLS や SSL をサポートする web ブラウザは一般的に、それらが持つ CA (証明書認証局{certificate authorities}) の一つによって署名された公開鍵を持つ任意のサーバの識別を証明できるようにするために "接続されている" 複数の証明書認証局の公開鍵を送出する。 これが十分に動作している間、全てのセキュアな web サーバの公開鍵はその鍵が代表のブラウザに結び付けられている CA の一つによって署名されなければいけない。 この展開モデルは (相対的に) その鍵が僅かな数の異なるブラウザの中に含まれるような僅かな数の CA によって、その識別を証明する事ができる僅かな数のサーバがある時に働き、それらの公開鍵が署名する。

このスキームは何百万もの潜在的クライアントやサーバを認証するのには上手く働かない。 それを行うにはより多くの数の CA を費やすだろうし、そのそれぞれがサーバによって広く信頼される必要があるだろう。 またそれらの CA は、(少数の) 商業的なものやセキュアな web サーバを走らせる必要がある他の企業の識別を証明するために必要な時間よりも (多数の) 普通のユーザの識別を証明するためにより多くの時間を費やすであろう。

また、TLS によって多数のクライアントを認証するような場面においては、その鍵が全てのサーバに信頼されるような CA のセットがあるような事はないであろう。 それ故にサーバとセキュアな接続を確立しようとする時には潜在的に複数のサーバに認証される必要があるクライアントはそのサーバとの間に使われる鍵に応じて構成される必要があるであろう。

上記の理由により、クライアントの認証には TLS はほとんど使われない。 一般的な技術ではサーバがクライアントを認証し秘密チャンネルを確立する場合や、クライアントが他の方法 - 例えば、HTTP 基本認証やダイジェスト認証を使うユーザ名とパスワード - を使ってサーバを認証する場合には TLS を使う事になっている。

プライバシーが要求されるアプリケーションでは、(過去のアメリカ輸出規制や他の国における暗号技術の使用や輸出の規制に順応させるための) いくつかの SSL 実装によって提供される 40-bit の暗号スイート{ciphersuites} は適切ではない。 TLS 実装に適合している必要がある 56-bit DES 暗号でさえ、リソース中の粗末な投資によっておよそ数日で破られている。 そのため TLS の使用を選択した場合は、適切なプライバシーの保証を提供するため、短い長さの鍵や弱い暗号スイートの使用をやめさせる必要があるかもしれない。 TLS がクライアントによって送られるパスワードのプライバシーを提供するために使用される場合、長い鍵をサポートする事が特に必要である。

上記の文は、ダイジェスト認証や TLS が一般に他の認証システムに比べて劣っている、あるいは HTTP 以外に他のアプリケーション中で使われるのに適していないという事という風に捉えられるべきではない。 TLS やダイジェスト認証での多くの制限はまた他の認証方法やプライバシーシステムにあてはまる。 ここでの要点は TLS もダイジェスト認証も認証やプライバシーを解決するための "魔法の妖精が振り掛ける粉{magic pixie dust}" では無いという事である。 全ての場合において、アプリケーションの設計者は認証方法やプライバシーのメカニズムを選択する前にアプリケーションのユーザが要求する認証やプライバシーに十分に注意を払って決定しなければいけない。

また TLS は他の TCP ベースのプロトコルにも使用できる事や、HTTP ダイジェスト認証に似た SASL [7] メカニズムがあるという事にも注意せよ。 そのため TLS やダイジェストのような認証方法から利益を得るために HTTP を使う必要は無い。しかし、HTTP API は既に TLS やダイジェスト認証をサポートしているであろう。

2.4 プロクシ、ファイアウォール、NAT との互換性

HTTP の使用についてしばしば引用された理由の一つは、プロクシやファイアウォール、あるいはネットワークアドレストランスレイタ (NAT) を通り抜ける能力である。 ファイアウォールや NAT の不運な一つの結果は、個々の新しいプロトコルに適応させるための明示的な許可 (あるいはファイアウォールや NAT のソフトウェアのアップグレードさえも) が必要とされる事により、新しいインターネットアプリケーションを展開させる事がより難しくなっているという事である。 ファイアウォールや NAT の存在は、プロトコル設計者が HTTP を含む既存のプロトコルの上に新しいアプリケーションを層にするための強い動機を作るものである。

しかし、もしサイトのファイアウォールが未知のプロトコルの使用を妨げる場合、これはおそらくファイアウォール管理者の側で決定された意識的なポリシーである。 もっともそのようなポリシーがセキュリティを増強する際に制限された値であるというのであれば、これは要点の近くにある。 つまり、well-known ポート番号は様々な目的のために真に有用であり、またポート番号への過負荷はそのユーティリティを破壊するものになる。 サイトのセキュリティポリシーの裏をかこうと試みる事はそうする事を正当とする証拠として受け入れられるものではない。

既存のファイアウォールが新しいプロトコルとの互換性をより容易にもたせられるように、"ファイアウォールにやさしい" プロトコルのためのガイドラインを確立する事は有用であろう。

2.5 HTTP の使用を考慮する時に尋ねられる質問

3. ポート 80 の再使用に関する問題

IANA は HTTP の使用のために TCP ポート番号 80 を予約していた。 それは実質的に新しいサービスが従来から使用するポート 80 を強奪する事は、それが基層として HTTP を使用するという事でさえ、適切ではない。 以下の内いずれかが真実の場合、HTTP の新しい用途は "実質的に新しいサービス" と考えられるかもしれないし、それ故に新しいポートを要求する。

4. URL 中の http: スキームの再使用に関する問題

様々な URL スキームが広く使用されており、その内の多くが標準化されている過程の中にある。実際、URL スキームは URL の残りの部分の解釈を管理するための "タグ" として役立つだけでなく、アクセスされているリソースあるいはサービスの種類の粗い識別をできるようにする。例えば、web ブラウザは一般的に、ユーザが "http" URL 上をマウスクリックする時と "mailto"URL 上をクリックする時で異なるレスポンスを提供する。

この決定を行う中で使用されるかもしれない基準のいくつかを以下に示す:

[8] 中の規則によれば、"http:" URI は URL スキーム名における "IETFTree" の一部であり、また IETF は "IETF Tree" の管理者である。 IESG がIETF における意志決定の中心であるので、IESG はあるリソースへアクセスする HTTP の上に乗るプロトコルが http: を使うべきか、それとも他の URL先頭部{prefix} を使うべきかを決定する権限を持つ。

"TLS あるいは SSL を使用する" という事を意味するために URL スキームに("http:" に対する "https:" のように) "s" を付加するという慣習は、標準的ではなく、制限的であるという事に注意せよ。 多くのアプリケーションにおいて、単一の "TLS あるいは SSL を使用する" ビットは、たとえクライアントが適切な証明書{credentials} を持っていたとしても、それがサーバにクライアント自身を認証する必要があるという情報を伝えるのに十分ではない。 例えば、TLS を用いて十分なセキュリティの確保を保証するために、アプリケーションは特定のサーバに認証するために使用される受理可能な暗号化スイート{ciphersuites} のリスト、あるいはクライアント証明書から構成される必要があるかもしれない。 URL 中に認証あるいは他の接続セットアップ情報を指定する事が必要な時は、URL 先頭部の中にではなく、URL パラメータの中で通信されるべきである。

5. MIME メディアタイプの使用に関する問題

HTTP はその付加物{payload} にラベリングするために MIME メディアタイプシステム [9] を使用するので、HTTP の層上の多くのアプリケーションはそれが使用されるための MIME メディアタイプを定義するか、あるいは選択する必要があるだろう。 特にマルチパート構造を使用する時は、メディアタイプの選択はより注意が必要である。特に:

6. 既存の、そして新しい HTTP メソッドに関する問題

HTTP 上で動作する新しいサービスは、新しいポートを割り当てるよりも、一つ以上の新しい HTTP メソッドを定義すべきであるという事が提案されている。 新しいメソッドの使用は適切であるかもしれないが、全てにおいて十分であるわけではない。 新しいプロトコルでの使用のための一つ以上の新しいメソッドの定義する事自体は、新しいポートや新しい URL タイプの使用の必要性を軽減するものではない。

7. HTTP クライアント、サーバ、プロクシのコードの再使用に関する問題

先に述べたように、新しいプロトコルの基層としての HTTP を使う主要な理由の一つとして、既存の HTTP クライアント, サーバ, プロクシ等のコードを再利用できるという事がある。 しかし、HTTP はそのような層状化をするために設計されてはいない。 既存の HTTP クライアントやコードは、それらに結び付けられた "http" という前提をもっているであろう。 例えば、層上のプロトコル名やそのバージョン番号とは対照的に、クライアントライブラリやプロクシは "http:" URL を期待し、またクライアントやサーバはリクエストやレスポンス中で "HTTP/1.1" を送る (またそれを期待している) であろう。

既存のクライアントライブラリは新しい URL タイプを理解できないだろう。既存のクライアントライブラリを新しい HTTP 層上のアプリケーションクライアントとして作動させるために、アプリケーションはその URL を "httpに等価な" 形式に変換する必要があるだろう。 例えば、サービス "xyz" がport ### を使用して HTTP 上に層をなす場合に、HTTP クライアントを呼び出す時、xyz クライアントはそのライブラリを呼び出すためにその URL を"xyz://host/something" 形式から "http://host:###/something" へと変換する必要があるだろう。 これは HTTP クライアントライブラリを呼び出す時にのみなされるべきである - そのような URL はプロトコルの他の部分では使用されるべきではないし、ユーザに見せるべきでもない。

クライアントが直接オリジンサーバにリクエストを送っている時は通常 URL先頭部("http:") は送られない事に注意せよ。 そのためクライアントライブラリを呼び出す時に xyz: URL を http: URL に変換しても実際には http:URL が外に向けて送られるべきではない。 しかし同じクライアントがプロクシサーバへリクエストを送っている時は、クライアントは通常それらのリクエスト中の全体の URL (http: 先頭部を含む) を送るであろう。そのリクエストがオリジンサーバへと送られる場合は、そのプロクシは http: 先頭部を取り除くだろう。

既存の HTTP クライアントライブラリやサーバはリクエストやレスポンスを"HTTP/1.1" (あるいは異なるバージョン) として転送するだろう。 そのようなライブラリやサーバの新しいプロトコルへの再利用を容易にするために、そのようなプロトコルはそれ故自身のプロトコル名やバージョン番号よりも"HTTP/1.1" を転送し、また受け入れる必要があるだろう。 HTTP 上に層をなすプロトコルの設計者はプロトコル変換時に "HTTP/1.1" を受け入れるかどうかを明示的に選択すべきである。

あるアプリケーションのためには、特定の HTTP の機能、例えばプロクシによってレスポンスのキャッシュを無効にするようなものの使用を要求したりまた制限したりする必要があるかもしれない。 それ故に HTTP 上に層をなすそれぞれのプロトコルは HTTP が使用されるであろう特定の方法、特に、クライアントやサーバがどのように HTTP プロクシと相互動作すべきかを詳説しなければならない。

8. HTTP ステータスコードの使用に関する問題

HTTP の三桁のステータスコードは、従来の HTTP アプリケーション (例えば、ドキュメントの回収や、フォームに基づいた問い合わせ) を備えた使用のために設計されており、それとは異なるアプリケーションにおいて遭遇したエラーの詳細を通信するのには恐らく適していない。 HTTP ステータスコードと、アプリケーションによって必要とされるコードの間に近い一致があるように思われる時でさえ、他のプロトコルの再使用で得た経験は、使用法における微妙な変化がありそうだという事を示している。 しかも、これはオリジナルのプロトコル (この場合は HTTP) と任意の層上のアプリケーションの両方の相互運用を下げる事になるであろう。

それ故に HTTP ステータスコードは層上のアプリケーションの微妙なエラーを示すために使われるべきではない。 リクエストメッセージボディの内容に起因するエラーを示すためには、せいぜい "一般的な" HTTP コード 200 (完全なる成功) と 500 (完全なる失敗) を使うべきである。 特定の環境下においては、 エラーの性質についての付加的詳細レスポンスメッセージボディ中に含む事ができる。200 や 500 以外のステータスコードは、そのエラーがHTTP サーバやその中継物によって発見された時にのみ使用すべきである。

層上のアプリケーションは新しい HTTP ステータスコードを定義すべきではない。 使用できるステータスコードのセットは少なく、異なる層上のアプリケーション間でのコード割り当てで矛盾がおこるかもしれないし、またそれらが主流である HTTP の将来のバージョンやその拡張によって必要とされるかもしれないからである。

層上のアプリケーションが HTTP における成功あるいは失敗についての同じ概念を共有しない場合、HTTP のエラーコードの使用には問題がある。 クライアントがオリジンサーバに直接接続せず、一つ以上の HTTP キャッシュやプロクシを経由するような場合に、問題は生じる。 (HTTP が中継物を経て通信するという能力がしばしば HTTP を再使用する主要な動機であるので、そのような中継物の存在中で作動するアプリケーションの能力は非常に重要であると考えられる。) そのようなキャッシュやプロクシは HTTP のエラーコードを解釈し、それらのコードに基づいた追加的な処置を講じてもよい。 例えば、オリジンサーバ (や他の適切な条件の下) から 200 エラーコードを受信した場合、プロクシはそのレスポンスをキャッシュして、同様のリクエストへのレスポンスとしてそれを再発行する事ができる。 あるいは、プロクシは"有用な" エラーメッセージを付加するために 500 エラーコードを返すリクエストの結果を修正する事ができる。他のレスポンスコードでは他の振る舞いをするであろう。

それ故に次のような指針が与えられる:

9. HTTP の再使用に関する推奨の概要

  1. 全てのプロトコルは適切なセキュリティを提供すべきである。あるアプリケーションが必要とするセキュリティはそのアプリケーションや想定された使用環境によって広く異なるであろう。HTTP のみ、あるいはそのプロトコルの基層として TLS を使うだけでは、全ての環境において適切なセキュリティを自動的には提供できないし、そのアプリケーションのためのセキュリティ問題を分析する必要があるそのプロトコル開発者を安心させない。
  2. 新しいプロトコル - HTTP を使うものに制限されないものを含む - は、ユーザのファイアウォールポリシーを、特に既存のプロトコルのように見せ掛ける事によって、妨げようとすべきではない。"実質的新サービス"は既存のポートを再使用すべきではない。
  3. 一般的に、新しいプロトコルやサービスは http: や他の URL スキームを再使用すべきではない。
  4. 基層として HTTP を使う各々の新しいプロトコル仕様書は、HTTP がそのプロトコルによって使われる事になっている明確な方法を記述すべきであり、そこにはどのようにクライアントやサーバがプロクシと相互動作するのかを含むべきである。
  5. 新しいサービスは HTTP ステータスコードの使用に関して section 8 中のガイドラインに従うべきである。

10. セキュリティについての考察

この文書のほとんどはセキュリティについてである。 section 2.3 では HTTPのセキュリティは特定のアプリケーションについて必要なものを満たしているかどうかを、section 2.4 では新しい HTTP ベースのプロトコルとファイアウォールの間の相互動作を、section 3 ではファイアウォールから妨げられないようにするために別のポートの使用する事について、section 4 ではセキュリティレベルを特定するための URL 接頭辞の "s" 先頭部の不適切性について、それぞれ議論するものである。

11. 参照文献

1
Fielding, R., Gettys, J., Mogul, J., Frystyk, H., Masinter, L., Leach, P. and T. Berners-Lee, Hypertext Transfer Protocol -- HTTP/1.1, RFC 2616, June 1999.
2
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, June 1999.
3
Dierks, T. and C. Allen, The TLS Protocol Version 1.0, RFC 2246, January 1999.
4
Postel, J. and J. Reynolds, Telnet Protocol Specification, STD 8, RFC 854, May 1983.
5
Postel, J. and J. Reynolds, File Transfer Protocol, STD 9, RFC 959, October 1985.
6
Klensin, J., Simple Mail Transfer Protocol, RFC 2821, April 2001.
7
Myers, J., Simple Authentication and Security Layer (SASL), RFC 2222, October 1997.
8
Petke, R. and I. King, Registration Procedures for URL Scheme Names, BCP 35, RFC 2717, November 1999.
9
Freed, N. and N. Borenstein, Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types, RFC 2046, November 1996.
10
Howes, T., Smith, M. and F. Dawson, A MIME Content-Type for Directory Information, RFC 2425, September 1998.
11
Bray, T., Paoli, J. and C. Sperberg-McQueen, Extensible Markup Language (XML), World Wide Web Consortium Recommendation REC-xml-19980210, February 1998. http://www.w3.org/TR/1998/REC-xml-19980210.
12
Murata, M., St. Laurent, S. and D. Kohn, XML Media Types , RFC 3023, January 2001.

12. 筆者のアドレス

 Keith Moore
 University of Tennessee
 Computer Science Department
 1122 Volunteer Blvd, Suite 203
 Knoxville TN, 37996-3450

 EMail: moore@cs.utk.edu

13. 著作権表示全文

Copyright © The Internet Society (2002). All Rights Reserved.

この文章とその翻訳は、複製し他人に配布する事ができ、またその実装についてのコメント、その他の方法を用いた説明、その補助となるような派生的作業はそれらの中に上の著作権表示とこの段落を含む事によって、その全て又は一部を、いかなる制約も受けずに、作成、複製、発表、及び配布する事ができる。 しかしながら、インターネット標準化プロセスにて定義されている著作権のための手続きに従わなければならないような場合の中でインターネット標準を開発するという目的に必要である、あるいは英語以外の言語に翻訳する必要があるという場合を除いて、この文章自体を、その著作権表示や、インターネット学会あるいは他のインターネット団体への参照を削除するような、いかなる変更もできない。

上で認めた制限された許諾は永続的なものであり、インターネット学会及びその継承者や譲渡者によって取り消される事は無い。

この文書とここに含まれた情報は、"そのまま {AS IS}" である事を基に提供され、インターネット学会、及び IETF は、この中の情報の使用が、商用利用及び特定用途においていかなる権利もいかなる暗黙的保障も侵害していないという保障への制限を含め、明示的に又は暗黙的に、全ての保障を放棄する

謝辞

RFC Editer 機構の資金は、現在インターネット学会から提供されている。


#TOP
Copyright © 1999-2008 橋本英彦 (H-Hash), All Rights Reserved.