インターネット技術タスクフォース (IETF) I. Grigorik
Request for Comments: 8942 Y. Weiss
カテゴリ: 実験的 Google
ISSN: 2070-1721 2021年2月

HTTP クライアントヒント


概要

HTTP はプロアクティブなコンテンツネゴシエーションを定義しており、リクエストヘッダに表現されたユーザエージェントの特性に基づいてサーバが適切な応答を選択できるようにします。実際には、ユーザエージェントはそれらのリクエストヘッダが使用されるかどうか不明であり、送信すると性能とプライバシーの両方に影響を与えるため、しばしばそれらのヘッダを送信することを躊躇します。

本書は、サーバがプロアクティブなコンテンツネゴシエーションのためにリクエストヘッダの使用を広告するために使用できる Accept-CH レスポンスヘッダを定義し、いわゆる「クライアントヒント」として知られるこれらのヘッダを作成するためのガイドラインを示します。

本メモの状態

本書はインターネット標準トラック仕様ではなく、検討、実験的実装、および評価のために公開されています。

本書はインターネットコミュニティのための実験的プロトコルを定義します。本書はインターネット技術タスクフォース (IETF) の成果物であり、IETF コミュニティの合意を表します。公開審査を受け、インターネット技術運営グループ (IESG) により公開承認を受けています。IESG によって承認されたすべての文書がインターネット標準の候補となるわけではありません。詳細は RFC 7841 のセクション 2 を参照してください。

本書の現在の状態、訂正情報、およびフィードバックの提供方法に関する情報は https://www.rfc-editor.org/info/rfc8942 で入手できます。

Copyright Notice

Copyright (c) 2021 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 Simplified BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Simplified BSD License.


1. 導入

ウェブにアクセスするデバイスは何千種類もあり、それぞれ異なるデバイス能力やユーザ設定情報を持っています。これらのデバイス能力にはハードウェアおよびソフトウェアの特性だけでなく、動的なユーザやユーザエージェントの好みも含まれます。歴史的に、サーバに基づいてコンテンツ配信とユーザ体験を最適化したいアプリケーションは、パッシブな識別(例えば、User-Agent ヘッダフィールド(RFC7231 セクション 5.5.3)を既存のユーザエージェント署名データベースと照合する)に依存したり、HTTP クッキー [RFC6265] や URL パラメータを使用したり、これらや類似のメカニズムを組み合わせてアドホックなコンテンツネゴシエーションを実現してきました。

そのような技術は設定と維持にコストがかかり、アプリケーションやサーバ間での移植性がありません。また、ネゴシエーション中にどのデータが必要で使用されているかをユーザエージェントとサーバの双方が理解することを困難にします:

  • ユーザエージェント検出はすべての静的変数を確実に識別できず、動的なユーザエージェントの好みを推測できず、外部のデバイスデータベースに依存し、キャッシュに優しくなく、受動的なフィンガープリンティングのサーフェスに依存します。
  • クッキーに基づくアプローチはアプリケーションやサーバ間で移植性がなく、JavaScript 実行を必要とするためクライアント側の遅延を追加し、キャッシュに優しくありません。
  • URL パラメータはクッキーに基づくアプローチと同様に移植性に欠け、各リソースの URL 内にコンテンツネゴシエーションデータをエンコードする必要があるため展開が難しいです。

プロアクティブなコンテンツネゴシエーション(RFC7231 セクション 3.4.1)は代替アプローチを提供します。ユーザエージェントは指定された明確なリクエストヘッダを使用してその能力や特性を通知し、サーバはこれらのリクエストヘッダ(または他の暗黙的な特性)に基づいて適切な応答を選択または生成することができます。

しかし、従来のプロアクティブなコンテンツネゴシエーション技術では、ユーザエージェントがこれらのリクエストヘッダを大量に送信することが多く、それがリクエストの「膨張」を引き起こして性能上の懸念を生み、またプライバシー上の問題(受動的にその情報を提供することでサーバによる静的なフィンガープリンティングを許してしまう)が発生します。

本書は、サーバが特定のプロアクティブなコンテンツネゴシエーション機能の受信にオプトインでき、それに応じてコンテンツを適応させることを可能にするフレームワークであるクライアントヒントを定義し、このフレームワークを用いるコンテンツネゴシエーション機構のためのガイドラインを示します。また、オリジンがユーザエージェントにこれらのヘッダをリクエストで送るよう明示的に要求できる新しいレスポンスヘッダ Accept-CH も定義します。

クライアントヒントは、ユーザエージェントが実際に使用されるときにのみリクエストヘッダを送信することを保証することで性能上の懸念を緩和し、Accept-CH レスポンスヘッダを通じたサーバによる明示的なオプトインと要求の開示を必要とすることで受動的なフィンガープリンティングのプライバシー懸念を緩和し、受動的なベクトルを能動的なものに変えます。

本書はクライアントヒントの特定の利用法を定義するものではありません。そのような利用法はそれぞれの仕様で定義される必要があります。

そのような利用法の一例として、User-Agent Client Hints [UA-CH] があります。

1.1. 表記規約

この文書中のキーワード "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", および "OPTIONAL" は、すべて大文字で表示される場合に限り、BCP 14 [RFC2119] および RFC8174 の説明に従って解釈されます。

本書では、拡張バッカス・ノアンフォーム (ABNF) 表記を [RFC5234] に従って使用します。


2. クライアントヒント要求ヘッダフィールド

クライアントヒント要求ヘッダフィールドは、HTTP ユーザエージェントがサーバに対して適切な応答を選択するために使用されるデータを示すために使用する HTTP ヘッダフィールドです。それぞれはサーバが応答を適応および最適化するために使用できるユーザエージェントの設定を伝達します。

2.1. クライアントヒントの送信

ユーザエージェントはデフォルト設定、ユーザ設定、およびAccept-CHで表現されたサーバの好みに基づいて、リクエストで送信するクライアントヒントを選択します。ユーザエージェントとサーバは以下に示すオプトインメカニズムを使用して、効率的なコンテンツ適応のために送信する必要があるヘッダフィールドを交渉でき、オプションで(例えば [CLIENT-HINTS-INFRASTRUCTURE] に概説されたような)追加のメカニズムを使用して、同じヘッダフィールドへの第三者のアクセスを制御する委任ポリシーを交渉することができます。ユーザエージェントは、低エントロピーと見なされないヒントを送信する場合にはオプトインを必要とすることをSHOULDです。低エントロピーヒントの例は [CLIENT-HINTS-INFRASTRUCTURE] の低エントロピーヒント表を参照してください。

実装者はクライアントヒントのサポートを実装する際のフィンガープリンティングの影響を認識し、本書のセキュリティに関する考慮事項(セクション 4)に記載された考慮点に従う必要があります。

2.2. クライアントヒントのサーバ処理

1つ以上のクライアントヒントヘッダフィールドを含むリクエストを受け取った場合、サーバはそれらの情報に基づいて応答を最適化できます。その際、かつリソースがキャッシュ可能である場合、サーバは選択した応答に影響を与えるヒントと後続のリクエストに対してその応答が適切であるかどうかを示すために、Vary レスポンスヘッダフィールド(RFC7231 セクション 7.1.4)を生成するMUSTあります。

サーバは理解していないまたはサポートしていないヒントを無視するMUSTです。無視されたヒントをユーザエージェントに示すメカニズムはありません。

さらに、サーバはクライアント処理を助ける関連値を伝える追加のレスポンスヘッダフィールド(使用されるヒントによって指定されるもの)を生成することができます。


3. サーバのサポートの広告

サーバは以下に記述されたメカニズムを使用してクライアントヒントのサポートを広告できます。

3.1. Accept-CH

Accept-CH レスポンスヘッダフィールドは、その値に示されたヒントに対するサーバのサポートを示します。ユーザエージェント情報をクライアントヒント経由で受け取りたいサーバは、できるだけ早い段階でレスポンスに Accept-CH レスポンスヘッダを追加することをSHOULDです。

Accept-CH は Structured Header [RFC8941] です。その値は sf-list であることがMUSTであり、そのメンバーは Tokens でなければなりません。ABNF は次の通りです:

  Accept-CH = sf-list

例えば:

Accept-CH: Sec-CH-Example, Sec-CH-Example-2

ユーザエージェントが Accept-CH を含む HTTP レスポンスを受け取ると、それはオリジンが後続の同一オリジンリクエストに対して示されたリクエストヘッダフィールドを受け取ることにオプトインしたことを示します。オプトインは安全でないトランスポート(HTTPS とは異なるスキームを使用する)で配信された場合は無視されるMUSTです。オプトインは持続されオリジンに結び付けられることがSHOULDであり、ユーザエージェントの定義するユーザのセッション期間中にサーバのオリジンへの後続リクエストでクライアントヒントの配信を可能にします。あるオプトインは以前に持続されたオプトイン値を上書きし、その代わりに持続されることがSHOULDです。

上記の Accept-CH の例は、ユーザエージェントが "https://site.example" へのナビゲーションに対する応答として受け取り、安全なトランスポートで配信された場合、持続された Accept-CH の設定は "https://site.example" に結び付けられます。例えば "https://site.example/foobar.html" へのナビゲーションにはその後使用されますが、例えば "https://foobar.site.example/" には使用されません。同様に、ナビゲーションの応答から構築されたページによって開始される任意の同一オリジンのリソースリクエスト(例:"https://site.example/image.jpg")にはその設定を使用しますが、クロスオリジンのリソースリクエスト(例:"https://thirdparty.example/resource.js")には使用しません。この設定は "https://other.example/" へのナビゲーションなど、他のオリジンから開始された "https://site.example" へのリソースリクエストには拡張されません。

3.2. キャッシュとの相互作用

1つ以上のクライアントヒントに基づいて応答を選択する場合、かつリソースがキャッシュ可能である場合、サーバはキャッシュキーにどのヒントが影響するかおよび選択された応答が後のリクエストに対して適切かどうかを示すために Vary レスポンスヘッダフィールドを生成する必要があります。

Vary: Sec-CH-Example

上の例はキャッシュキーに Sec-CH-Example ヘッダフィールドを含める必要があることを示します。

Vary: Sec-CH-Example, Sec-CH-Example-2

上の例はキャッシュキーに Sec-CH-Example および Sec-CH-Example-2 ヘッダフィールドを含める必要があることを示します。


4. セキュリティに関する考慮事項

4.1. 情報の露出

本書に依存する機能で使用されるリクエストヘッダフィールドは、プライバシーを考慮したプロアクティブなコンテンツネゴシエーションを可能にし、受動的なフィンガープリンティングベクトルの露出を避けるためにユーザの環境に関する情報を公開します。しかし、実装者は、最悪の場合においては、管理されていない監視されない能動的フィンガープリンティングが受動的なフィンガープリンティングより優れているとは限らないことを念頭に置く必要があります。ユーザのプライバシーの利益を提供するためには、ユーザエージェントはクライアントヒントを使用する機能によって露出される情報の悪用を防ぐさらなるポリシーを適用する必要があります。

これらの機能が露出する情報はユーザについて新たな情報を明らかにする可能性があり、実装者は以下の考慮事項、推奨、およびベストプラクティスを検討すべきです。

基本的な前提は、リクエストヘッダとしてユーザについての情報を露出することは(セキュリティの観点から)他の手段で情報を露出することと同等であるということです。(例えば、オリジンが JavaScript API を使用してその情報にアクセスし、自身のサーバに送信できる場合など。)

クライアントヒントは明示的なオプトインメカニズムであるため、ユーザの環境に関する情報にアクセスしたいサーバはそれを積極的に要求する必要があり、クライアントやプライバシー研究者がどのオリジンがそのデータを収集しているかを追跡し、必要に応じて対応できるようになります。ヘッダに基づくオプトインにより受動的なフィンガープリンティングベクトルの削除が可能になります。例として、ユーザエージェントは User-Agent 文字列によって露出する情報を削減し、User-Agent Client Hints [UA-CH] を通じてその情報への能動的アクセスを可能にすることができます。あるいは、ユーザエージェントはスクリプトを通じて既に利用可能な情報(例:Save-Data クライアントヒント <https://wicg.github.io/savedata/#save-data-request-header-field>)を公開することで、受動的フィンガープリンティングの表面を増やすことなく同等の情報を提供することができます。クライアントヒント機能をサポートし、ある情報をオプトインしたサーバに送信するユーザエージェントは、同等の情報を受動的に送信することを避けるべきです。

したがって、本書に依拠してクライアントヒントヘッダを定義する機能は、既にユーザエージェントによってアプリケーションに提供されている情報(既存のリクエストヘッダ、HTML、CSS、または JavaScript など)でない新しい情報を提供してはならないMUST NOTです。

そのような機能は露出される情報の次の側面を考慮する必要があります:

エントロピー:
非常に詳細なデータを露出すると、異なるオリジンへの複数のリクエスト間でユーザを識別するのに利用され得ます。ヘッダフィールド値の表現できる範囲を減らすか、現在の値の正確な表現ではなく近似となる列挙された範囲に制限することで、プライバシーを改善しリンク可能性のリスクを低減できます。
機微性(センシティビティ):
機能はユーザの機微な情報を露出してはSHOULD NOTなりません。そのため、アプリケーションが利用できるが特定のユーザ操作(例えば許可プロンプトやユーザのアクティベーション)により制限されている情報は、クライアントヒントとして露出してはSHOULD NOTです。
時間による変化:
機能は、状態変化自体が(例:JavaScript のコールバックを通じて)露出されない限り、時間とともに変化するユーザ情報を露出してはSHOULD NOTです。

異なる機能は低エントロピー、非機微、静的な情報(例:ユーザエージェント情報)と高エントロピー、機微、動的な情報(例:位置情報)の間の空間の異なる点に位置します。ユーザエージェントは特定の機能によって提供される価値とこれらの考慮事項とのトレードオフを検討し、機能ごとやその他の細かい基準で異なるポリシーを持つことを望むかもしれません。

実装者は、どのクライアントヒントヘッダフィールドが広告されるかを制御するためにユーザおよびサーバ制御のメカニズムとポリシーの両方を検討すべきです:

  • 実装者は、一部またはすべてのクライアントヒントヘッダフィールドの配信をオプトインオリジンのみに制限することをSHOULD検討すべきであり、オプトインオリジンが明示的に別のオリジンにクライアントヒントヘッダフィールドの要求を委任する許可を与えていない限りは除きます。
  • プライバシー上の懸念と帯域幅制限の間のバランスをユーザに許可する選択メカニズムを提供することを検討する実装者は、受動的フィンガープリンティングのリスクのようなプライバシー影響をユーザに説明することが困難または事実上不可能である可能性があることも考慮する必要があります。
  • 特定のユースケースや脅威モデルに特化した実装は、クライアントヒントヘッダフィールドの一部またはすべての送信を回避してもよい(MAY)。例えば、リンク可能性のリスクが高いヘッダフィールドの送信を回避するなどです。

ユーザエージェントはサイトデータ、閲覧キャッシュ、クッキー、またはそれに類するものがクリアされたときに保持されたオプトイン設定をクリアすることがMUSTです。

4.2. 導入およびセキュリティリスク

新しいリクエストヘッダを導入するにはいくつかの考慮事項があります:

  • 既存のヘッダフィールド名の使用による潜在的な衝突
  • ヘッダフィールド値で伝達されるデータの特性

新しいクライアントヒントの作成者は、それらがクライアント側コンテンツ(例:スクリプト)によって追加可能である必要があるか、それともクライアントヒントがユーザエージェントによって独占的に設定される必要があるかを慎重に検討することが勧められます。後者の場合、ヘッダフィールド名の "Sec-" プレフィックスはスクリプトや他のアプリケーションコンテンツがユーザエージェント内でそれらを設定することを防ぐ効果があります。"Sec-" プレフィックスを使用することは、ユーザエージェント(アプリケーションコンテンツではなく)が値を生成したことをサーバに示します。詳細は [FETCH] を参照してください。

慣例として、クライアントヒントであるリクエストヘッダは CH- プレフィックスを使用することが推奨されており、これにより CH-Foo のようにフレームワークを使用していることを識別しやすくなります。"Sec-" プレフィックスと組み合わせると Sec-CH-Foo のようになります。これによりプログラム的に識別しやすくなり(例えばプライバシーフィルタが認識しないヒントをリクエストから削除する場合など)、扱いやすくなります。

Accept-CH オプトインメカニズムを使用して交渉されたクライアントヒントのリクエストヘッダは、フィールド名が sf-token に一致するMUSTです。

4.3. 悪用検出

能動的フィンガープリンティング情報へのアクセスを追跡するユーザエージェントは、クライアントヒントヘッダの発行を同等の API へのアクセスと同様に考慮することをSHOULD検討すべきです。

クライアントヒントの悪用に関する研究は、クライアントヒントを含むリクエストに対する HTTP レスポンスが異なる値を持つものや値を持たないものとどのように異なるかを調べることが考えられます。これにより、どのクライアントヒントが使用されているかを明らかにし、その使用をさらに分析することができます。


5. ヒント送信のコスト

クライアントヒントをサーバに送信することはリクエストのバイトサイズ増加を招きます。この増加の一部は HTTP ヘッダ圧縮スキームで軽減できますが、送信する各新しいヒントは依然として帯域幅の増加をもたらします。サーバはクライアントヒントの受信にオプトインする際にその点を考慮すべきであり、コンテンツ適応の目的で使用されない限りヒントを受信するためにオプトインすべきではないSHOULD NOTです。

リクエストバイトサイズの増加のため、本書に依拠してクライアントヒントを定義する機能は、それらのヒントを特定のリクエスト先([FETCH])に限定して送信することを検討してもよいMAYです。そこではヒントがより有用である可能性が高くなります。


6. IANA に関する考慮事項

本書に依拠する機能は、追加されるリクエストヘッダフィールドを "Permanent Message Header Field Names" レジストリに登録することが期待されています [RFC3864]

本書は "Accept-CH" HTTP レスポンスヘッダフィールドを定義します。IANA はそれを同じレジストリに登録しました。

6.1. Accept-CH

ヘッダフィールド名:
Accept-CH
適用プロトコル:
HTTP
ステータス:
experimental
著者/変更管理者:
IETF
仕様文書:
本 RFC のセクション 3.1
関連情報:
クライアントヒントに関するもの

7. 参考文献

7.1. 規範的参照

[RFC2119]
Bradner, S., “Key words for use in RFCs to Indicate Requirement Levels”、BCP 14、RFC 2119、1997年3月、<https://www.rfc-editor.org/info/rfc2119>。
[RFC3864]
Klyne, G., Nottingham, M., and J. Mogul、“Registration Procedures for Message Header Fields”、BCP 90、RFC 3864、2004年9月、<https://www.rfc-editor.org/info/rfc3864>。
[RFC5234]
Crocker, D., Ed. and P. Overell、“Augmented BNF for Syntax Specifications: ABNF”、STD 68、RFC 5234、2008年1月、<https://www.rfc-editor.org/info/rfc5234>。
[RFC7231]
Fielding, R., Ed. and J. Reschke, Ed.、“Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content”、RFC 7231、2014年6月、<https://www.rfc-editor.org/info/rfc7231>。
[RFC7234]
Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, Ed.、“Hypertext Transfer Protocol (HTTP/1.1): Caching”、RFC 7234、2014年6月、<https://www.rfc-editor.org/info/rfc7234>。
[RFC8174]
Leiba, B., “Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words”、BCP 14、RFC 8174、2017年5月、<https://www.rfc-editor.org/info/rfc8174>。
[RFC8941]
Nottingham, M. and P-H. Kamp、“Structured Field Values for HTTP”、RFC 8941、2021年2月、<https://www.rfc-editor.org/info/rfc8941>。

謝辞

Mark Nottingham、Julian Reschke、Chris Bentzel、Ben Greenstein、Tarun Bansal、Roy Fielding、Vasiliy Faronov、Ted Hardie、Jonas Sicking、Martin Thomson、および IETF HTTP ワーキンググループの多数の他のメンバーに感謝します。貴重な助言とフィードバックを頂きました。


著者の連絡先

Ilya Grigorik
Google
EMail: ilya@igvita.com
URI: https://www.igvita.com/
Yoav Weiss
Google
EMail: yoav@yoav.ws
URI: https://blog.yoav.ws/