ネットワークエラーロギング

W3C ワーキングドラフト

この文書の詳細情報
このバージョン:
https://www.w3.org/TR/2025/WD-network-error-logging-20250505/
最新の公開バージョン:
https://www.w3.org/TR/network-error-logging/
最新の編集者草案:
https://w3c.github.io/network-error-logging/
履歴:
https://www.w3.org/standards/history/network-error-logging/
コミット履歴
編集者:
Douglas Creager (GitHub)
Ian Clelland (Google)
元編集者:
Ilya Grigorik (Google) - まで
Julia Tuttle (Google) - まで
Arvind Jain (Google) - まで
Alois Reitbauer (Compuware Corp.) - まで
Jatinder Mann (Microsoft) - まで
フィードバック:
GitHub w3c/network-error-logging (プルリクエスト, 新しい Issue, 未解決の Issue)

概要

この文書は、開発者が Web アプリケーションのネットワークエラー報告ポリシーを宣言できるようにする仕組みを定義します。ユーザーエージェントはこのポリシーを使用して、 要求されたリソースを正常に取得できなかった原因となる、発生したネットワークエラーを 報告できます。

この文書のステータス

この節では、この文書が公開された時点でのステータスについて説明します。現在の W3C 公開文書の一覧およびこの技術報告書の最新改訂版は、 https://www.w3.org/TR/ にある W3C 標準および草案 の索引で確認できます。

この文書は、Web パフォーマンス・ワーキング グループによって、 勧告トラックを使用して ワーキングドラフトとして公開されました。

ワーキングドラフトとしての公開は、 W3C およびそのメンバーによる承認を意味するものではありません。

これは草案文書であり、いつでも他の文書によって更新、置換、または廃止される 可能性があります。この文書を進行中の作業以外のものとして 引用することは適切ではありません。

この文書は、 W3C 特許 ポリシーの下で活動するグループによって作成されました。 W3C は、このグループの成果物に関連して 行われた特許開示の公開 一覧を 維持しています。そのページには、 特許を開示するための手順も含まれています。本人が 必須クレームを含むと考える特許について実際に 知っている場合、その者は W3C 特許ポリシーの第6節に従って情報を開示しなければなりません。

この文書は、 2023年11月3日付 W3C プロセス文書に準拠します。

1. はじめに

Web アプリケーションのパフォーマンス特性を正確に測定することは、サイト 開発者が Web アプリケーションを改善する方法を理解するうえで重要な要素です。最悪のケースは、ネットワークエラーによって アプリケーションまたは特定のリソースの読み込みに失敗することであり、このような障害に対処するためには、 開発者は、そのような障害がいつ、どこで、なぜ発生しているのかを特定するためにユーザーエージェントの支援を 必要とします。

現在、アプリケーション開発者は、エンドユーザーからリアルタイムの Web アプリケーション可用性データを取得できません。 たとえば、DNS ルックアップの失敗、 接続タイムアウト、接続のリセット、その他の理由などのネットワークエラーによってユーザーがページを読み込めなかった場合、サイト開発者は この問題を検出して対処することができません。この種のネットワークエラーは、定義上、 クライアントがサーバーとの接続を正常に確立できなかった可能性があるため、サーバー側だけでは検出できないことに注意してください。

既存の方法(合成モニタリングなど)は、あらかじめ定められた地理的位置に監視ノードを配置することで 部分的な解決策を提供しますが、追加のインフラストラクチャ投資を必要とし、 実際のエンドユーザーについて真にグローバルかつほぼリアルタイムの可用性データを提供することはできません。

Network Error Logging (NEL) は、Web アプリケーションが特定のオリジンに対するネットワークエラーをユーザーエージェントが報告するために使用できる 報告ポリシーを宣言できるようにする仕組みを定義することで、この必要性に対応します。Web アプリケーションは、目的の NEL HTTP レスポンスヘッダーフィールドを提供することで NEL の使用を選択し、そのフィールドが目的の NEL ポリシーを記述します。このポリシーは、そのオリジンへのリクエストに関する情報を記録し、 Reporting API を使用して以前に構成されたエンドポイントのグループに、その情報を配信するよう試みるようユーザーエージェントに指示します。その名前が示すとおり、NEL レポートは主にエラーを記述するために使用されます。 ただし、異なるクライアント集団におけるエラーのを判断するためには、 成功したリクエストがいくつ発生しているかも把握する必要があります。これらの成功したリクエストも NEL の仕組みを介して報告できます。

たとえば、TCP 接続の中断によってユーザーエージェントが https://www.example.com からリソースを取得できなかった場合、 ユーザーエージェントは Reporting API を介して次のレポートをキューに入れます。

type
"network-error"
エンドポイントグループ
report_to フィールドによって構成されたエンドポイントグループ
データ
{
  "referrer": "https://referrer.com/",
  "sampling_fraction": 1.0,
  "server_ip": "192.0.2.42",
  "protocol": "http/1.1",
  "elapsed_time": 321,
  "phase": "connection",
  "type": "tcp.aborted"
}

通信されるフィールドとレポートの形式の説明については 5.4 ネットワークエラー レポートを生成するを参照し、NEL の登録および 報告プロセスのより実践的な例については 7. を参照してください。

2. 適合性

非規範的と明示された節と同様に、この仕様に含まれるすべての作成ガイドライン、図、例、および注記は 非規範的です。この仕様のそれ以外のすべての内容は規範的です。

この文書におけるキーワード MAYMUSTMUST NOTOPTIONALREQUIRED、および SHOULD は、 ここに示すように、すべて 大文字で表記されている場合に限り、 BCP 14 [RFC2119] [RFC8174] に記載されているとおりに解釈されます。

アルゴリズムの一部として命令形で表現された要件(たとえば、「先頭の空白文字をすべて取り除く」または 「false を返してこれらの手順を中止する」)は、そのアルゴリズムを導入する際に使用されたキーワード(「must」、 「should」、「may」など)の意味に従って解釈されます。

一部の適合要件は、属性、メソッド、またはオブジェクトに対する要件として表現されています。そのような 要件は、ユーザーエージェントに対する要件として解釈されます。

アルゴリズムまたは特定の手順として表現された適合要件は、最終的な結果が 同等である限り、どのような方法で実装してもかまいません。(特に、この仕様で定義されるアルゴリズムは、 理解しやすいことを意図しており、高い性能を意図したものではありません。)

3. 概念

3.1 ネットワークリクエスト

ネットワークリクエストは、 ユーザーエージェントが、指定されたHTTP ネットワークフェッチによってネットワーク経由でリソースを リクエストしようとすると発生します。

ユーザー エージェントがオフラインであることが分かっている場合(すなわち、navigator. onLinefalse を返す場合)、リクエストによってネットワークリクエストが発生してはなりません。

リクエストネットワークリクエストを発生させてはならないのは、それが 混在コンテンツまたは CORS の失敗によってブロックされた場合です。すべての CORS プリフライトリクエストは、それ自体の ネットワークリクエストを発生させなければなりません。

注記

[FETCH] 標準に従ってリクエストを処理するユーザーエージェントでは、ネットワークリクエストは、 HTTP ネットワークフェッチアルゴリズムの1回の実行に対応します。

使用されるフェッチアルゴリズム、基盤となるアプリケーションプロトコルおよび トランスポートプロトコルにかかわらず、ネットワークリクエストの処理は、 次の フェーズで構成されます。

  1. DNS 名前解決: ユーザーエージェントは Domain Name System [RFC1034] を使用して、ドメイン名を、そのドメインへの HTTP リクエストを処理できる サーバーIP アドレスへ解決します。
  2. 安全な接続の確立: ユーザーエージェントは サーバーへの接続を開き、この接続上に安全なチャネルを 確立します。
  3. リクエストおよびレスポンスの送信: 安全な チャネルが確立されると、ユーザーエージェントは HTTP リクエストを送信し、レスポンスサーバーから受信できます。

必須の フェーズリクエストおよびレスポンスの 送信のみです。他の フェーズは、すべての ネットワークリクエストで必要になるとは限りません。たとえば、DNS の結果は ユーザーエージェント内でローカルにキャッシュできるため、同じドメインへの以後のリクエストでは DNS 名前解決を省略できます。 同様に、HTTP 持続的接続では、 同じネットワークパーティションキーへの複数のリクエストで開いている接続を共有できます。ただし、複数の フェーズが 発生する場合、それらは 上記の順序で発生します。

編集者注

これらの フェーズの定義を [FETCH] に移して、より再利用しやすくしたいと考えています。

ユーザーエージェントが サーバーから有効な HTTP レスポンスを受信でき、そのレスポンスに 4xx または 5xx ステータスコードが含まれない場合、ネットワークリクエスト成功です。

ネットワークリクエスト成功していない場合、そのリクエストは失敗です。

注記

HTTP エラーレスポンス(すなわち、4xx または 5xx ステータスコードを持つもの)は失敗と見なされるため、 NEL ポリシー失敗 サンプリングレートが、その 成功サンプリングレートの代わりに適用されることに注意してください。

3.2 ネットワークエラー

ネットワークエラーとは、 ネットワークリクエスト失敗させたエラー状態です。

ネットワークエラーには、文字列であるがあります。

ネットワークエラーには、エラーがどのフェーズで 発生したかを記述するフェーズがあります。

dns
エラーは DNS 名前解決中に発生しました
connection
エラーは 安全な接続の 確立中に発生しました
application
エラーは リクエストおよび レスポンスの送信中に発生しました

6. 定義済みのネットワーク エラー型では、いくつかの定義済み ネットワークエラー が定義されています。

3.3 ネットワークエラーレポート

ネットワークエラーレポートとは、Reporting APIレポートであり、 ネットワークエラーを記述します。

ネットワークエラーレポートレポート 型network-error です。

ネットワークエラーレポートは、 ReportingObserver から見えるものではありません

注記

ネットワークエラーレポート ReportingObserver から見えないのは、これらがリクエストを受信する サーバーの管理者または所有者だけに見えることを意図しているためです。もしそれらが ReportingObserver から見える場合、 レポートはリクエストの送信元にも見えることになります。 クロスオリジンリクエストの場合、これによってサーバーのネットワーク構成に関する情報が その管理範囲外の当事者に漏洩する可能性があります。

3.4 NEL ポリシー

NEL ポリシーは、 ネットワークリクエストについてのレポートをオリジンに対して収集するかどうか、収集する場合はどこに送信するかをユーザーエージェントに指示します。 NEL ポリシーは HTTP レスポンスヘッダーを介してユーザーエージェントに配信されます。

NEL ポリシーには、ユーザーエージェントがこの NEL ポリシーを受信したサーバーIP アドレスである受信 IP アドレスがあります。

NEL ポリシーにはオリジンがあります。

NEL ポリシーには、include または exclude のいずれかであるサブドメインフラグがあります。

NEL ポリシーには、リクエストヘッダーのリストと、レスポンス ヘッダーのリストがあり、それぞれはヘッダー 名のリストです。

NEL ポリシーには報告グループがあり、これはこのポリシーのレポートが 送信される Reporting エンドポイントグループの名前です。

NEL ポリシーには、ポリシーが有効であり続ける 秒数を表す ttl があります。

NEL ポリシーには、ユーザーエージェントがポリシーを受信した時刻を表す タイムスタンプである 作成時刻があります。

NEL ポリシーは、その 作成時刻からウォール クロック安全でない現在時刻までの経過時間が 172800 秒(48 時間)を超える場合、古い状態です。

NEL ポリシーは、その 作成時刻からウォール クロック安全でない現在時刻までの経過時間が、その ttl(秒単位)を超える場合、期限切れです。

3.5 サンプリングレート

大量のトラフィックを処理することを想定しているオリジンは、そのオリジンに対して行われるすべての ネットワークリクエストについて NEL レポートを取り込む設備を備えていない可能性があります。オリジンは、各ユーザーエージェントが 送信する NEL レポートの数を制限するために、サンプリング レートを定義できます。通常、成功したリクエストは 失敗したリクエストを大幅に上回るはずなので、オリジンはそれぞれに異なる サンプリングレートを指定できます。

NEL ポリシーには、0.0 以上 1.0 以下の 数値である成功サンプリングレートがあります。

NEL ポリシーには、0.0 以上 1.0 以下の 数値である失敗サンプリングレートがあります。

3.6 ポリシーキャッシュ

適合するユーザーエージェントは、(ネットワークパーティションキーオリジン)のタプルをキーとして、一連の NEL ポリシーを保持する ストレージ機構であるポリシーキャッシュを提供しなければなりません。

このストレージ機構は不透明で、ベンダー固有であり、Web には公開されませんが、この文書で定義する アルゴリズムで使用される次のメソッドを提供しなければなりません。

4. ポリシーの配信

サーバーは、自身が管理するオリジンに対して、 NEL HTTP レスポンスヘッダーを介して NEL ポリシーを定義してもかまいません。

4.1 NEL レスポンスヘッダー

NEL レスポンスヘッダーは、 オリジンNEL ポリシーをユーザーエージェントに伝達するために使用されます。 NEL ヘッダーの ABNF (Augmented Backus-Naur Form) [RFC5234] 構文は次のとおりです。

NEL = json-field-value

ヘッダーの値は、 json-field-value で定義される JSON オブジェクトの配列として解釈されます。配列内の各オブジェクトは、 オリジンに対する NEL ポリシーを定義します。ユーザーエージェントは、配列内の最初の有効な ポリシーを処理し、配列内の追加のポリシーを無視しなければなりません。

ユーザーエージェントは、この仕様で定義された構文に適合しない未知または無効なフィールドまたは値を 無視しなければなりません。有効な NEL ヘッダーフィールドは、少なくとも、この仕様で定義されるすべての 「必須」フィールドを含む1つのオブジェクトを 含まなければなりません。

ユーザーエージェントは、スクリプティング攻撃によるエラー報告の乗っ取りを軽減するため、 meta 要素によって指定された NEL ヘッダーを無視しなければなりません。 NEL ポリシーは、 NEL レスポンスヘッダーを介して配信されなければなりません。

注記

meta 要素に対する制限は [CSP] 仕様と一致しており、同じ理由から、 報告の登録を HTTP ヘッダーフィールドのみに制限しています。

4.1.1 report_to メンバー

report_to メンバーは、この NEL ポリシーのレポートが送信されるエンドポイント グループを指定します。 report_to メンバーは、NEL ポリシーを登録するために必須であり、 以前の登録を削除する意図の場合は任意です。max_ageを参照してください。存在する場合、その値は文字列で なければなりません。それ以外の型は 解析エラーになります。

注記

NEL レポートの配信を改善するため、サーバーは、 report_to を、リソースを取得しているオリジンとは インフラストラクチャが結合されていない別のオリジンに少なくとも1つのエンドポイントを含むエンドポイントグループに設定すべきです。 そうしないと、問題が解決されるまで(解決されるとしても)ネットワークエラーを報告できません。 また、一部のエンドポイントに到達できない場合の代替手段を提供するため、 複数のエンドポイントを提供すべきです。

4.1.2 max_age メンバー

必須max_age メンバーは、この NEL ポリシーの有効期間を、負でない整数の 秒数として指定します。その値は負でない整数でなければなりません。それ以外の型は 解析エラーになります。

0 は、この オリジンに対するすべての NEL ポリシーポリシーキャッシュから削除します。

注記

NEL レポートの配信を確実にするため、サーバーは、 Reporting エンドポイントグループにも十分に大きな max_age が設定されていることを確認すべきです。Reporting ポリシーが 期限切れになると、NEL ポリシーが期限切れになっていなくても、 NEL レポートは配信されません。

4.1.3 include_subdomains メンバー

任意include_subdomains メンバーは、 このオリジンのすべてのサブドメインに対して(サブドメインの深さに制限なく)この NEL ポリシーを有効にするブール値です。 オブジェクト内に include_subdomains という名前のメンバーが存在しない場合、またはその値が true でない場合、NEL ポリシーは サブドメインに対して有効になりません。

注記

サブドメインに対する NEL レポートの配信を確実にするため、アプリケーションは Reporting エンドポイントグループでも include_subdomains が有効になっていることを確認すべきです。Reporting ポリシーで 有効になっておらず、指定されたサブドメインに別個の Reporting ポリシーも存在しない場合、 NEL ポリシーにそのサブドメインが含まれていても、そのサブドメインの NEL レポートは配信されません。

4.1.4 success_fraction メンバー

任意success_fraction メンバーは、 このオリジンに対する成功した ネットワークリクエストについてのレポートに適用すべき サンプリングレートを定義します。 存在する場合、その値は 0.0 以上 1.0 以下の数値でなければなりません。それ以外の値は 解析エラーになります。このメンバーが存在しない場合、ユーザーエージェントは、このオリジンに対する 成功した ネットワークリクエストについての NEL レポートを収集しません。

4.1.5 failure_fraction メンバー

任意failure_fraction メンバーは、 このオリジンに対する失敗した ネットワークリクエストについてのレポートに適用すべき サンプリングレートを定義します。存在する場合、その 値は 0.0 以上 1.0 以下の数値でなければなりません。 それ以外の値は解析エラーになります。このメンバーが 存在しない場合、ユーザーエージェントは、このオリジンに対する すべての 失敗した ネットワークリクエストについて NEL レポートを収集します。

4.1.6 request_headers メンバー

任意request_headers メンバーは、 このオリジンに関するネットワークエラーレポートに、その名前およびを含めるリクエストヘッダーのリストを定義します。 存在する場合、その値は 文字列のリストでなければなりません。

4.1.7 response_headers メンバー

任意response_headers メンバーは、 このオリジンに関するネットワークエラーレポートに、その 名前およびを含めるレスポンスヘッダーの リストを定義します。存在する場合、その値は 文字列のリストでなければなりません。

4.2 ポリシーヘッダーを処理する

ネットワークリクエストrequest)と、それに対応する レスポンスresponse)が与えられたとき、このアルゴリズムは、 requestオリジンに対する NEL ポリシーを抽出し、それに応じて ポリシーキャッシュを更新します。

  1. 次の条件のいずれかが真である場合、これらの手順を中止します。
  2. originrequestオリジンとします。
  3. key を、request予約済みクライアントを与えて、 ネットワーク パーティションキーを決定するを呼び出した結果とします。
  4. header を、名前が NEL であるレスポンスヘッダーの値とします。
  5. list を、header に対して [HTTP-JFV] の第4節で定義されたアルゴリズムを実行した結果とします。そのアルゴリズムが エラーになる場合、または list が空の場合、これらの 手順を中止します。
  6. itemlist の最初の要素とします。
  7. itemmax_age という名前のメンバーがない場合、またはその メンバーの値が数値でない場合、これらの手順を中止します。
  8. itemmax_age メンバーの値が 0 の場合、ポリシー キャッシュから、そのオリジンorigin であるすべての NEL ポリシーを削除し、残りの手順をスキップします。
  9. itemreport_to という名前のメンバーがない場合、またはその メンバーの値が文字列でない場合、これらの手順を中止します。
  10. itemsuccess_fraction という名前のメンバーがあり、 その 値が 0.0 以上 1.0 以下の範囲の数値でない場合、これらの 手順を中止します。
  11. itemfailure_fraction という名前のメンバーがあり、 その 値が 0.0 以上 1.0 以下の範囲の数値でない場合、これらの 手順を中止します。
  12. itemrequest_headers という名前のメンバーがあり、その 値がリストでない場合、またはそのリスト内のいずれかの要素が文字列でない場合、 これらの手順を中止します。
  13. itemresponse_headers という名前のメンバーがあり、 その 値がリストでない場合、またはそのリスト内のいずれかの要素が文字列でない場合、 これらの手順を中止します。
  14. policy を、プロパティが次のように設定された新しい NEL ポリシーとします。

    受信 IP アドレス
    ユーザーエージェントが response を受信したサーバーIP アドレス
    編集者注

    [FETCH] でこれをより明示的に受け渡すようにします。

    オリジン
    origin
    サブドメインフラグ
    iteminclude_subdomains という名前のメンバーがあり、その値が true の場合は include、 それ以外の場合は exclude
    リクエストヘッダー
    itemrequest_headers メンバーの値
    レスポンスヘッダー
    itemresponse_headers メンバーの値
    報告グループ
    itemreport_to メンバーの値
    ttl
    itemmax_age メンバーの値
    作成時刻
    ウォールクロック安全でない現在時刻
    成功サンプリングレート
    itemsuccess_fraction メンバーが 存在する場合はその値、それ以外の場合は 0.0
    失敗サンプリングレート
    itemfailure_fraction メンバーが 存在する場合はその値、それ以外の場合は 1.0
  15. keyorigin)に対応するエントリが ポリシーキャッシュにすでに存在する場合は、それを policy に置き換えます。それ以外の場合は、(keyorigin)について policyポリシーキャッシュに挿入します。

5. レポートの配信

5.1 リクエスト用のポリシーを選択する

ネットワークリクエストrequest)が与えられたとき、このアルゴリズムは、 ポリシーキャッシュ内のどの NEL ポリシーを、その ネットワークリクエストについてのレポート生成に 使用すべきかを決定します。

  1. originrequestオリジンとします。
  2. key を、request予約済みクライアントを与えて、 ネットワーク パーティションキーを決定するを呼び出した結果とします。
  3. keyorigin)についてポリシーキャッシュにエントリがある場合:
    1. policy をそのエントリとします。
    2. policy期限切れでない場合、それを返します。
  4. originスーパードメイン一致する各 parent origin について:
    1. keyparent origin)についてポリシーキャッシュに エントリがある場合:
      1. policy をそのエントリとします。
      2. policy期限切れでなく、その サブドメインフラグが include の場合、 それを返します。
  5. no policy を返します。

5.2 リクエストヘッダーを抽出する

ネットワークリクエストrequest)と NEL ポリシーpolicy)が与えられたとき、このアルゴリズムはポリシーの指示に従って リクエストからヘッダー値を抽出します。

  1. headers を新しい空の ECMAScript オブジェクトとします。
  2. policyリクエストヘッダーリスト内の各 header name について:
    1. requestヘッダーリストheader name含まない場合、 リスト内の次の header name に進みます。
    2. values を空の ECMAScript リストとします。
    3. requestヘッダーリスト内で、名前header name である各 header について、headervalues に追加します。
    4. 名前が header name で、値が values である新しいプロパティを headers に追加します。
  3. headers を返します。

5.3 レスポンスヘッダーを抽出する

レスポンスresponse)と NEL ポリシーpolicy)が与えられたとき、このアルゴリズムはポリシーの指示に従って レスポンスからヘッダー値を抽出します。

  1. headers を新しい空の ECMAScript オブジェクトとします。
  2. policyレスポンスヘッダーリスト内の各 header name について:
    1. responseヘッダーリストheader name含まない場合、 リスト内の次の header name に進みます。
    2. values を空の ECMAScript リストとします。
    3. responseヘッダーリスト内で、名前header name である各 header について、headervalues に追加します。
    4. 名前が header name で、値が values である新しいプロパティを headers に追加します。
  3. headers を返します。

5.4 ネットワークエラーレポートを生成する

ネットワークリクエストrequest)とそれに対応する レスポンスresponse)が与えられたとき、このアルゴリズムは、一致するいずれかの NEL ポリシーによって指示されている場合、request についてのレポートを生成し、 レポートと NEL ポリシーを返します。それ以外の場合、この アルゴリズムは null を返します。

  1. requestオリジンに対して「オリジンは潜在的に 信頼できるか?」アルゴリズムを実行した結果が Potentially Trustworthy ではない場合、null を返します。
  2. originrequestオリジンとします。
  3. policy を、request に対して 5.1 リクエスト用のポリシーを選択するを実行した結果とします。 policyno policy の場合、null を返します。
  4. このリクエストに対する有効なサンプリングレートを決定します。
  5. このリクエストについて報告するかどうかを決定します。roll を 0.0 以上 1.0 以下の乱数とします。roll > sampling rate の場合、null を返します。
  6. report body を、次のプロパティを持つ新しい ECMAScript オブジェクトとします。 [ECMA-262]
    sampling_fraction
    sampling rate
    elapsed_time
    リソースのフェッチ開始から、完了するかユーザーエージェントによって中止されるまでに 経過したミリ秒数。
    phase
    request失敗した場合、その ネットワーク エラーフェーズrequest成功した場合は "application"
    type
    request失敗した場合、その ネットワークエラーrequest成功した場合は、 "ok"
  7. report bodyphase プロパティが dns でない場合、次のプロパティを report body に追加します。
    server_ip
    利用可能な場合、ユーザーエージェントがリクエストを送信したサーバーの IP アドレス。 それ以外の場合は空文字列。
    • IPv4 アドレスによって識別されるホストは、 ドット付き10進表記(0 から 255 の範囲の4つの10進数を "." で区切った並び)で表されます。[RFC1123]
    • IPv6 アドレスによって識別されるホストは、 8個の16ビット部分の順序付きリスト( x:x:x:x:x:x:x:x の並びで、各 'x' はアドレスの8個の16ビット部分を表す 1〜4桁の16進数字)として表されます。[RFC4291]
    protocol
    利用可能な場合、ALPN Protocol ID によって識別される、リソースの取得に使用された ネットワークプロトコル。 それ以外の場合は ""
  8. report bodyphase プロパティが dns または connection でない場合、次の プロパティを report body に追加します。
    referrer
    requestクライアントに関連付けられたリファラーポリシーによって決定された request のリファラー。
    method
    requestリクエストメソッド
    request_headers
    requestpolicy に対して 5.2 リクエストヘッダーを抽出するを実行した結果。
    response_headers
    responsepolicy に対して 5.3 レスポンスヘッダーを抽出するを実行した結果。
    status_code
    利用可能な場合、HTTP レスポンスのステータスコード。それ以外の場合は 0
  9. originpolicyオリジンと等しくなく、policyサブドメインフラグが include であり、report bodyphase プロパティが dns でない場合、 null を返します。
    注記

    この手順により、サブドメインNEL ポリシーは、リクエストDNS 名前解決 フェーズ中に限り、 ポリシーオリジンのサブドメインについてのレポート生成に使用できます。 詳細については 9. プライバシーに関する考慮事項を参照してください。

  10. report bodyphase プロパティが dns でなく、report bodyserver_ip プロパティが空でなく、かつ policy受信 IP アドレスと等しくない場合:
    1. report bodyphasedns に設定します。
    2. report bodytypedns.address_changed に設定します。
    3. report bodyrequest_headersresponse_headersstatus_code、および elapsed_time プロパティを消去します。
    4. 表明: DNS 名前解決中に利用できない 情報から派生した report body のすべてのフィールドが 消去されています。
    注記

    この手順は、サーバーポリシーの IP アドレスが一致しない場合、NEL レポートを 「格下げ」します。 これはプライバシー保護であり、NEL レポートがそのレポートで記述されるサービスの 所有者にのみ送信されることを保証します。IP アドレスが一致しない場合、ユーザーエージェントが検証できるのは、 NEL ポリシーオリジンドメイン名の所有者によって送信されたことだけです。このポリシーが、その サーバーの所有者によって送信されたことは検証できません。このドメイン名はそのサーバーに解決されます。したがって、 レポートを格下げして、 DNS 名前解決に関する情報のみを含むようにします。詳細については 9. プライバシーに 関する考慮事項および 7.5 複数の IP アドレスを持つオリジンを参照してください。

  11. policy古い場合、policyポリシーキャッシュから削除します。
  12. report bodypolicy を返します。

5.5 ネットワークレポートを配信する

ECMAScript オブジェクト(report body、通常は ネットワークエラー レポートを生成するから返された後、呼び出し側の仕様によって拡張されたもの)と、それに 一致する NEL ポリシーpolicy)およびネットワークリクエストrequest)が与えられたとき、このアルゴリズムはレポートを配信用にキューに入れます。

  1. urlrequest の URL とします。

  2. urlフラグメントを消去します。

  3. report bodyphase プロパティが dns または connection の場合:

    1. urlパスおよびクエリを消去します。

  4. 次のパラメーターを与えてネットワークレポートを生成するを実行します。

    network-error
    データ
    report body
    エンドポイントグループ
    policy報告グループ
    url
    url に対してURL シリアライザーを実行した結果。

6. 定義済みのネットワークエラー型

定義済みの ネットワークエラー がいくつかあります。

ユーザーエージェントは、このリストをカスタムの ネットワークエラー で拡張してもよいです。たとえば、 新しいプロトコルに対応したり、既存のエラーについてより詳細な 説明を提供したりする場合です。その場合、ユーザーエージェントは、 エラーレポートの単純かつ一貫した処理を容易にするため、 名について ドット区切りのパターン ([group].[optional-subgroup].[error-name])に 従うべきです。たとえば、収集側はカテゴリ および/または1つ以上のサブグループごとの集計を提供できます。

6.1 DNS 名前解決エラー

この節のすべての ネットワークエラーDNS 名前解決中に発生するため、フェーズdns です。

dns.unreachable
DNS サーバーに到達できない
dns.name_not_resolved
DNS サーバーは応答したが、アドレスを解決できない
dns.failed
前述のエラーに該当しない理由により DNS サーバーへのリクエストが失敗した
dns.address_changed
対応する NEL ポリシーが受信されて以降、リクエストのオリジンについて 解決された IP アドレスが変更されたことを示す

6.2 安全な接続の 確立エラー

この節のすべての ネットワークエラー安全な 接続の確立中に発生するため、 フェーズconnection です。

tcp.timed_out
サーバーへの TCP 接続がタイムアウトした
tcp.closed
TCP 接続がサーバーによって閉じられた
tcp.reset
TCP 接続がリセットされた
tcp.refused
TCP 接続がサーバーによって拒否された
tcp.aborted
TCP 接続が中止された
tcp.address_invalid
IP アドレスが無効である
tcp.address_unreachable
IP アドレスに到達できない
tcp.failed
前述のエラーに該当しない理由により TCP 接続が失敗した
tls.version_or_cipher_mismatch
バージョンまたは暗号スイートの不一致により TLS 接続が中止された
tls.bad_client_auth_cert
無効なクライアント証明書により TLS 接続が中止された
tls.cert.name_invalid
無効な名前により TLS 接続が中止された
tls.cert.date_invalid
無効な証明書の日付により TLS 接続が中止された
tls.cert.authority_invalid
無効な発行機関により TLS 接続が中止された
tls.cert.invalid
無効な証明書により TLS 接続が中止された
tls.cert.revoked
失効したサーバー証明書により TLS 接続が中止された
tls.cert.pinned_key_not_in_cert_chain
キーピニングエラーにより TLS 接続が中止された
tls.protocol.error
TLS プロトコルエラーにより TLS 接続が中止された
tls.failed
前述のエラーに該当しない理由により TLS 接続が失敗した

6.3 リクエストおよび レスポンスの送信エラー

この節のすべての ネットワークエラーは、 リクエストおよびレスポンスの送信中に発生するため、 フェーズapplication です。

http.error
ユーザーエージェントはレスポンスを正常に受信したが、そのレスポンスのステータスコードが 4xx または 5xx だった
http.protocol.error
HTTP プロトコルエラーにより接続が中止された
http.response.invalid
レスポンスが空である、content-length が一致しない、不適切なエンコーディングがある、および/またはユーザーエージェントが レスポンスを処理できないその他の状態がある
http.response.redirect_loop
リダイレクトループが検出されたためリクエストが中止された
http.failed
前述のエラーに該当しない HTTP プロトコル上のエラーにより接続が失敗した
abandoned
リソースの取得が完了する前にユーザーが中止した
unknown
エラー型が不明である

7.

7.1 ポリシー定義の例

> GET / HTTP/1.1
> Host: example.com

< HTTP/1.1 200 OK
< ...
< Report-To: {"group": "network-errors", "max_age": 2592000,
              "endpoints": [{"url": "https://example.com/upload-reports"}]}
< NEL: {"report_to": "network-errors", "max_age": 2592000}

この NEL ヘッダーは NEL ポリシーを定義し、 example.com に関するネットワークエラーを network-errors という名前のエンドポイントグループに報告するようユーザーエージェントに指示します。この ポリシーは2592000秒(30日間)適用されます。

上記の登録は、レスポンスが潜在的に信頼できるオリジンから通信された場合にのみ成功することに注意してください。

> GET / HTTP/1.1
> Host: example.com

< HTTP/1.1 200 OK
< ...
< NEL: {"max_age": 0}

この NEL ヘッダーは、example.com に対する 既存の NEL ポリシーをすべて削除するようユーザーエージェントに指示します。

7.2 ネットワークエラーレポートの例

この節には、登録済みの NEL ポリシーを持つ オリジンでネットワークエラーが発生した際に、 ユーザーエージェントがキューに入れる可能性のある ネットワークエラー レポートの例を示します。 レポートをアップロードする際に [REPORTING] API によって作成される 完全なレポートペイロードを示します。ペイロードの body フィールドには、 ネットワークエラーレポート本文が含まれます。

{
  "age": 0,
  "type": "network-error",
  "url": "https://www.example.com/",
  "body": {
    "sampling_fraction": 0.5,
    "referrer": "http://example.com/",
    "server_ip": "2001:DB8:0:0:0:0:0:42",
    "protocol": "h2",
    "method": "GET",
    "request_headers": {},
    "response_headers": {},
    "status_code": 200,
    "elapsed_time": 823,
    "phase": "application",
    "type": "http.protocol.error"
  }
}

このレポートは、ユーザーエージェントが example.com から www.example.com へのナビゲーションを試み、 2001:DB8::42 への名前解決に成功したことを示しています。しかし、 ユーザーエージェントは HTTP/2(h2)プロトコルを介してサーバーから 200 レスポンスを受信したものの、 通信中にプロトコルエラーが発生し、ナビゲーションを中止せざるを得ませんでした。 ユーザーエージェントは、ナビゲーション開始から823ミリ秒後にナビゲーションを中止しました。 最後に、ユーザーエージェントはネットワークエラーの発生直後にこのレポートを送信しました。 すなわち、レポートの経過時間は0です。

{
  "age": 0,
  "type": "network-error",
  "url": "https://widget.com/thing.js",
  "body": {
    "sampling_fraction": 1.0,
    "referrer": "https://www.example.com/",
    "server_ip": "",
    "protocol": "",
    "method": "GET",
    "request_headers": {},
    "response_headers": {},
    "status_code": 0,
    "elapsed_time": 143,
    "phase": "dns",
    "type": "dns.name_not_resolved"
  }
}

上記のレポートは、ユーザーエージェントが https://www.example.com/ から https://widget.com/thing.js を取得しようとしたことを示しています。しかし、ユーザーエージェントは DNS 名(widget.com)を解決できず、リクエストは 143ミリ秒後にユーザーエージェントによって中止されました。 widget.com への以前のリクエストによって有効な NEL ポリシーが配信されていたため、ユーザーエージェントはこのリクエストについてネットワークエラー レポートを生成します。レポートは ネットワークエラーの発生直後にアップロードされました。すなわち、レポートの経過時間は 0です。

7.3 DNS の設定不備

> GET / HTTP/1.1
> Host: example.com

< HTTP/1.1 200 OK
< ...
< Report-To: {"group": "network-errors", "max_age": 2592000,
              "endpoints": [{"url": "https://example.com/upload-reports"}]}
< NEL: {"report_to": "network-errors", "max_age": 2592000, "include_subdomains": true}

この NEL ヘッダーにより、 example.com の所有者は、自身の DNS サーバーを誤って構成した場合を検出できます。たとえば、 new-subdomain.example.com を IP アドレスに解決する新しいリソースレコードを追加し忘れた場合です。ユーザーエージェントが new-subdomain.example.com にリクエストを送信しようとすると、次の レポートを生成する可能性があります。

{
  "age": 0,
  "type": "network-error",
  "url": "https://new-subdomain.example.com/",
  "body": {
    "sampling_fraction": 1.0,
    "server_ip": "",
    "protocol": "http/1.1",
    "method": "GET",
    "request_headers": {},
    "response_headers": {},
    "status_code": 0,
    "elapsed_time": 48,
    "phase": "dns",
    "type": "dns.name_not_resolved"
  }
}

7.4 キャッシュ検証の監視

> GET / HTTP/1.1
> Host: example.com

< HTTP/1.1 200 OK
< ...
< Report-To: {"group": "network-errors", "max_age": 2592000,
              "endpoints": [{"url": "https://example.com/upload-reports"}]}
< NEL: {"report_to": "network-errors", "max_age": 2592000, "success_fraction": 1.0,
        "request_headers": ["If-None-Match"], "response_headers": ["ETag"]}
< ETag: 01234abcd

この例では、example.com の所有者は、 サーバー上でホストされているリソースの異なるバージョンを識別するために、 ETag レスポンス ヘッダーを使用します。その後、ユーザーエージェントは If-None-Match リクエストヘッダーを使用して、現在クライアント側でキャッシュされているリソースのバージョンを サーバーに通知できます。これにより、クライアントが保持する既存のコピーが 最新であれば、サーバーはリソースの内容を生成して 送信することを回避できます。

このドメインの NEL ヘッダーに request_headers および response_headers フィールドを 含めることで、ブラウザーは、そのリクエストについて作成するすべての NEL レポートに If-None-Match リクエストヘッダーと ETag レスポンスヘッダーのコピーを 含めるようになり、サイト所有者がキャッシュポリシーの 有効性を追跡できるようになります。

上記を踏まえ、次の一連のイベントを考えます。

  1. ユーザーエージェントは example.comリクエストを送信し、 サーバーから成功したレスポンスを受信します。 これには、リソースのバージョンを示す ETag ヘッダーが含まれます。 ユーザーエージェントは次の NEL レポートを生成します。

    {
      "age": 0,
      "type": "network-error",
      "url": "https://example.com/",
      "body": {
        "sampling_fraction": 1.0,
        "server_ip": "192.0.2.1",
        "protocol": "http/1.1",
        "method": "GET",
        "request_headers": {},
        "response_headers": {
          "ETag": ["01234abcd"]
        },
        "status_code": 200,
        "elapsed_time": 1392,
        "phase": "application",
        "type": "ok"
      }
    }
  2. しばらくして、ユーザーエージェントは example.com に別のリクエストを送信します。 ユーザーエージェントは元のリソースのコピーを ローカルキャッシュにまだ保持しており、そのバージョンを If-None-Match リクエスト ヘッダーに含めます。サーバーは このバージョンを確認し、まだ最新であることを認識して、 キャッシュされたリソースのコピーがまだ有効であることをユーザーエージェントに通知する 304 レスポンスを送信します。ユーザーエージェントは 次のレポートを生成します。

    {
      "age": 0,
      "type": "network-error",
      "url": "https://example.com/",
      "body": {
        "sampling_fraction": 1.0,
        "server_ip": "192.0.2.1",
        "protocol": "http/1.1",
        "method": "GET",
        "request_headers": {
          "If-None-Match": ["01234abcd"]
        },
        "response_headers": {
          "ETag": ["01234abcd"]
        },
        "status_code": 304,
        "elapsed_time": 45,
        "phase": "application",
        "type": "ok"
      }
    }
  3. さらに後に、ユーザーエージェントは example.com にさらに別のリクエストを送信します。 ユーザーエージェントは同じリソースのコピーを ローカルキャッシュにまだ保持しており、前の 例と同様に、そのバージョンを If-None-Match リクエスト ヘッダーに含めます。しかし今回は、サーバーがリソースの新しい バージョンが利用可能であることを認識します。サーバーはこの リソースの内容を生成してクライアントに送信し、新しいバージョンを 新しい ETag レスポンスヘッダー値にエンコードします。ユーザー エージェントは次のレポートを生成します。

    {
      "age": 0,
      "type": "network-error",
      "url": "https://example.com/",
      "body": {
        "sampling_fraction": 1.0,
        "server_ip": "192.0.2.1",
        "protocol": "http/1.1",
        "method": "GET",
        "request_headers": {
          "If-None-Match": ["01234abcd"]
        },
        "response_headers": {
          "ETag": ["56789ef01"]
        },
        "status_code": 200,
        "elapsed_time": 935,
        "phase": "application",
        "type": "ok"
      }
    }

7.5 複数の IP アドレスを持つオリジン

ドメイン名が複数の IP アドレスに解決されるオリジンでは、NEL は、 オリジンの所有者が、リクエストを処理する サーバーの所有者と同一であることを検証できないため、 エラーの原因に関する情報を少なくして、エラーレポートを「格下げ」することがあります。

例として、example.com が、それぞれ異なる IP アドレスを持つ3台の サーバーによって処理されると仮定します。サービスの所有者は、 example.com192.0.2.1192.0.2.2、および 192.0.2.3 に解決するよう DNS を構成し、ユーザーエージェントが これら3つの IP アドレス間でリクエストを分散することに依存します。サービス所有者は 次の NEL ポリシーを配信します。

> GET / HTTP/1.1
> Host: example.com

< HTTP/1.1 200 OK
< ...
< Report-To: {"group": "network-errors", "max_age": 2592000,
              "endpoints": [{"url": "https://example.com/upload-reports"}]}
< NEL: {"report_to": "network-errors", "max_age": 2592000,
        "success_fraction": 1.0, "failure_fraction": 1.0}

上記を踏まえ、次の一連のイベントを考えます。

  1. ユーザーエージェントは 192.0.2.1リクエストを送信し、 サーバーから成功したレスポンスを受信します。 このレスポンスには上記の NEL ポリシーが含まれ、ユーザー エージェントはポリシーの受信 IP アドレス192.0.2.1 に設定します。受信 IP アドレスサーバーの IP アドレスと一致するため(成功した リクエストでは必ず一致します)、次の NEL レポートを生成します。

    {
      "age": 0,
      "type": "network-error",
      "url": "https://example.com/",
      "body": {
        "sampling_fraction": 1.0,
        "server_ip": "192.0.2.1",
        "protocol": "http/1.1",
        "method": "GET",
        "request_headers": {},
        "response_headers": {},
        "status_code": 200,
        "elapsed_time": 57,
        "phase": "application",
        "type": "ok"
      }
    }
  2. ユーザーエージェントは 192.0.2.2 に新しいリクエストを送信し、別の成功した レスポンスを受信します。このレスポンスにも NEL ポリシーが含まれ、 ユーザーエージェントはポリシーの受信 IP アドレス192.0.2.2 に更新します。受信 IP アドレスサーバーの IP アドレスと一致するため(成功した リクエストでは必ず一致します)、次の NEL レポートを生成します。

    {
      "age": 0,
      "type": "network-error",
      "url": "https://example.com/",
      "body": {
        "sampling_fraction": 1.0,
        "server_ip": "192.0.2.2",
        "protocol": "http/1.1",
        "method": "GET",
        "request_headers": {},
        "response_headers": {},
        "status_code": 200,
        "elapsed_time": 34,
        "phase": "application",
        "type": "ok"
      }
    }
  3. 次にユーザーエージェントは 192.0.2.3リクエストを送信しようとしますが、 サーバーへの接続を確立できません。ユーザーエージェントは依然として NEL ポリシーポリシーキャッシュに保持しており、理想的にはこのポリシーを使用して、 失敗した ネットワークリクエストについて tcp.timed_out レポートを生成します。しかし、ポリシーの受信 IP アドレス192.0.2.2)が、このリクエストの送信先 IP アドレスと一致しないため、ユーザーエージェントは 192.0.2.3 のサーバーが実際に example.com の所有者によって所有されていることを検証できません。したがって、ユーザーエージェントは レポートを dns.address_changed に格下げしなければなりません。

    {
      "age": 0,
      "type": "network-error",
      "url": "https://example.com/",
      "body": {
        "sampling_fraction": 1.0,
        "server_ip": "192.0.2.3",
        "protocol": "http/1.1",
        "method": "GET",
        "request_headers": {},
        "response_headers": {},
        "status_code": 0,
        "elapsed_time": 0,
        "phase": "dns",
        "type": "dns.address_changed"
      }
    }
  4. 次にユーザーエージェントは 192.0.2.1 に別のリクエストを送信しようとしますが、 再びサーバーへの接続を確立できません。ユーザーエージェントは過去のある時点で 192.0.2.1 から NEL ポリシーを受信していたものの、ポリシーの 受信 IP アドレスは、 直近にどこから受信したかのみを記録します。この場合は 192.0.2.2 です。したがって、ユーザーエージェントは レポートを dns.address_changed に格下げしなければなりません。

    {
      "age": 0,
      "type": "network-error",
      "url": "https://example.com/",
      "body": {
        "sampling_fraction": 1.0,
        "server_ip": "192.0.2.1",
        "protocol": "http/1.1",
        "method": "GET",
        "request_headers": {},
        "response_headers": {},
        "status_code": 0,
        "elapsed_time": 0,
        "phase": "dns",
        "type": "dns.address_changed"
      }
    }

8. ユースケース

8.1 ナビゲーション失敗の 報告

ユーザーによって開始されたナビゲーションリクエスト(たとえば、リンクのクリック、ロケーション バーへの直接入力、ユーザー操作に起因してスクリプトによって開始されたものなど)は、さまざまな接続上の理由によって失敗する可能性があります。 DNS 障害、TCP エラー、TLS プロトコル違反などです。これらのエラーは、ネットワークの 設定不備、一時的なルーティングの問題、サーバーの停止、マルウェアまたはユーザーに対するその他の攻撃 などによって引き起こされる可能性があります。

このような場合、宛先ホストは、定義上、 リクエストが自身のインフラストラクチャに到達するのを確認できず、問題を調査することもできないため、失敗したナビゲーションに気付かないことがよくあります。これに 対処するため、ホストはユーザーエージェントに NEL ポリシーを登録できます。このポリシーは、 調査できるように、このような失敗のレポートをどこへ配信すべきかを指定します。

8.2 ファーストパーティ サブリソース取得失敗の報告

一般的なアプリケーションは数十個のリソースを必要とし、それらの取得は通常 HTML、CSS、または JavaScript を介して開始されます。このようなリソースを要求するアプリケーションは、そのような 取得のほとんどについて失敗を観測できます(たとえば onerror コールバックを介して)が、失敗が発生した理由についての詳細なネットワーク エラーレポート、たとえば DNS 障害、TCP エラー、TLS プロトコル違反などにはアクセスできません。

これに対処するため、アプリケーションは、サブリソースの取得元となる ファーストパーティホストについて、関連する NEL ポリシーをユーザーエージェントに登録できます。その後、そのようなポリシーが存在し、 登録済みの NEL ポリシーを持つオリジンからのリソースについてネットワークエラーが発生した場合、ユーザー エージェントは詳細なネットワークエラーレポートを報告し、アプリケーション開発者が エラーを調査できるようにします。

8.3 サードパーティ サブリソース取得失敗の報告

リソースがサードパーティによって埋め込まれる場合、そのリソースの提供者は、多くの場合、 障害を計測して観測することができません。たとえば、example.com がそのサイトに widget.com/thing.js リソースを埋め込み、example.com を訪問しているユーザーが ネットワークエラーによってそのリソースの取得に失敗した場合、widget.com ホストはその失敗を認識することも 検出することもできません。

これに対処するため、widget.com は自身のホストに対する NEL ポリシーを登録できます。その後、そのようなポリシーが 存在し、登録済みの NEL ポリシーを持つオリジンからリソースを取得する際に、ファーストパーティまたはサードパーティのオリジンのどちらから 要求されているかに関係なくネットワークエラーが発生した場合、ユーザー エージェントはネットワークエラーを報告し、提供者がエラーを調査できるようにします。

9. プライバシーに関する考慮事項

NEL は、ユーザーのネットワーク構成に関する新たな情報を露出する可能性のある ネットワークエラーレポートを提供します。たとえば、攻撃者は NEL 報告を悪用してユーザーのネットワーク構成を調査したり、 ユーザーの内部ネットワーク上のサーバーをスキャンしたりする可能性があります。また、HSTS、HPKP、および ピン留めされた CSP ポリシーと同様に、保存された NEL ポリシーは、 カスタムの(ユーザーごとの) 報告 URI を持つ固有のポリシーを設定し、HTTP Cookie と組み合わせて(またはその代わりに) 識別子として機能させることにより、「スーパー Cookie」として使用される可能性があります。

上記のリスクの一部を軽減するため、NEL の登録は 潜在的に信頼できるオリジンに制限され、ネットワークエラー レポートの配信も同様に潜在的に信頼できるオリジンに制限されます。 これにより、一時的な HTTP MITM が NEL を 永続的なトラッカーとして容易に悪用することを防ぎます。

さらに、NEL ポリシーキャッシュは、 ネットワークパーティションキーを使用して分割されるため、ある埋め込みコンテキストで サイトについて保存された NEL ポリシーは、別のコンテキストでは使用されません (たとえば、別のトップレベルサイトによって埋め込まれている場合)。

NEL は、既存のサーバー側監視を補完することを目的としています。NEL レポートは、 要求されているサービスの所有者にのみ送信すべきです。 DNS 名前解決中に発生するエラーの場合、NEL レポートは、 ポリシーオリジンを含む ドメイン名前空間ツリーの所有者から NEL ポリシーを受信していた場合にのみ 生成されます。 安全な接続の 確立または リクエストおよびレスポンスの送信中に発生するエラーの場合、NEL レポートは、リクエストの送信先である サーバーの所有者から NEL ポリシーを受信していた場合にのみ 生成されます。

この根拠は、NEL ポリシー受信 IP アドレス およびサブドメインフラグの扱いを説明するものです。 ポリシーの受信 IP アドレスサーバーの IP アドレスと一致することを確認することで、NEL はポリシーの信頼境界を、 ポリシーのオリジンだけでなく、ユーザーエージェントが通信している 特定のサーバーまで含むように拡張します。これは、 たとえば DNS リバインディング攻撃を防ぐのに役立ちます。この攻撃では、攻撃者が自身の所有するサーバーから 長期間有効な NEL ポリシーを配信し、その後 ネームサーバーを変更してポリシーオリジンを自身が 制御していないサーバーに解決させます。受信 IP アドレスの検証がなければ、 ユーザーエージェントは2番目のサーバーについてのレポートを 攻撃者に送信することになります。

同様に、サブドメインNEL ポリシーには 制限があり、リクエストDNS 名前解決 フェーズ中に限り、 ポリシーオリジンのサブドメインについてのレポート生成に使用できます。 このフェーズでは、所有権を検証すべきサーバーは 存在せず、ポリシーがリクエストオリジンのスーパードメインから受信されたという事実だけで、 エラーの所有権を確立するには十分です。これにより、 ドメイン名前空間ツリーの特定部分の所有者は NEL を使用して 7.3 DNS の設定不備 エラーを検出できる一方で、 悪意のある DNS エントリを使用して自身が 制御していないサーバーに関する情報を収集することは防止されます。

情報漏洩を防ぐため、リクエストについての NEL レポートには、 サーバーリクエストを処理する際に見えない情報は一切 含まれません。DNS 名前解決中のエラーの場合、 NEL レポートには DNS 自体から利用できる情報のみが含まれます。これにより、 サーバーが NEL を悪用して、 すでにアクセス可能な情報を超えてユーザーに関する情報を収集することを防ぎます。NEL レポートには Web サイトの公開 IP アドレスがレポート 本文server_ip フィールドに含まれることに注意してください。この情報は、NEL ヘッダーを生成するサービスが常に 知っているとは限りません。たとえば、そのサービスがロード バランサーまたはその他の透過的な MitM プロキシの背後にある場合です。

注記

例として、NEL レポートには、リクエストドメイン名を IP アドレスに解決するためにどの DNS リゾルバーが使用されたかについての情報は、特に一切含まれません。

上記の制限に加えて、ユーザーエージェントは次のことをしなければなりません

NEL を導入する際、開発者は、指定された収集先に 配信される NEL レポートのプライバシーへの影響を考慮すべきです。たとえば、レポートには機密データを含む URL(たとえば 「Capability URL」)が含まれる場合があり、特別な予防措置が必要になることがあります([CAPABILITY-URLS] を参照)。 また、そのような URL が第三者に報告されることを防ぐため、開発者が独自の NEL 収集先を運用する必要がある場合があります。

10. IANA に関する考慮事項

恒久的メッセージヘッダーフィールドレジストリは、次の登録で更新すべきです([RFC3864])。

10.1 NEL

ヘッダーフィールド名
NEL
適用可能なプロトコル
http
ステータス
標準
著者/変更管理者
W3C
仕様文書
この仕様(NEL レスポンスヘッダーを参照)

A. 索引

A.1 この仕様で定義される 用語

A.2 参照によって定義される用語

B. 謝辞

この文書では、[CSP] および [RFC6797] 仕様のテキストを、それらの 仕様のライセンスで許可されている範囲で再利用しています。また、Julia Tuttle、Chris Bentzel、Todd Reifsteck、Aaron Heady、および Mark Nottingham の有益なコメントと本作業への貢献に心から感謝します。

C. 参考文献

C.1 規範的参考文献

[CAPABILITY-URLS]
Capability URL のグッドプラクティス. Jeni Tennison. W3C. 2014年2月18日. FPWD. URL: https://www.w3.org/TR/capability-urls/
[CSP]
コンテンツセキュリティポリシー レベル3. Mike West; Antonio Sartori. W3C. 2025年4月30日. W3C ワーキングドラフト. URL: https://www.w3.org/TR/CSP3/
[ECMA-262]
ECMAScript 言語仕様. Ecma International. URL: https://tc39.es/ecma262/multipage/
[fetch]
Fetch 標準. Anne van Kesteren. WHATWG. 現行標準. URL: https://fetch.spec.whatwg.org/
[hr-time]
高分解能時間. Yoav Weiss. W3C. 2024年11月7日. W3C ワーキングドラフト. URL: https://www.w3.org/TR/hr-time-3/
[html]
HTML 標準. Anne van Kesteren; Domenic Denicola; Dominic Farolino; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. 現行 標準. URL: https://html.spec.whatwg.org/multipage/
[HTTP-JFV]
HTTP ヘッダーフィールド値の JSON エンコーディング. J. Reschke. IETF. 2017年10月24日. 有効な Internet-Draft. URL: https://datatracker.ietf.org/doc/html/draft-reschke-http-jfv
[infra]
Infra 標準. Anne van Kesteren; Domenic Denicola. WHATWG. 現行標準. URL: https://infra.spec.whatwg.org/
[mixed-content]
混在コンテンツ. Emily Stark; Mike West; Carlos IbarraLopez. W3C. 2023年2月23日. CRD. URL: https://www.w3.org/TR/mixed-content/
[network-reporting]
Network Reporting API. W3C. 編集者草案. URL: https://w3c.github.io/reporting/network-reporting.html
[referrer-policy]
リファラーポリシー. Jochen Eisinger; Emily Stark. W3C. 2017年1月26日. W3C 勧告候補. URL: https://www.w3.org/TR/referrer-policy/
[REPORTING]
Reporting API. Douglas Creager; Ian Clelland; Mike West. W3C. 2024年8月13日. W3C ワーキングドラフト. URL: https://www.w3.org/TR/reporting-1/
[RESOURCE-TIMING-2]
Resource Timing. Yoav Weiss; Noam Rosenthal. W3C. 2025年2月13日. CRD. URL: https://www.w3.org/TR/resource-timing/
[RFC1034]
ドメイン名 - 概念と 機能. P. Mockapetris. IETF. 1987年11月. Internet Standard. URL: https://www.rfc-editor.org/rfc/rfc1034
[RFC1123]
インターネットホストの要件 - アプリケーション およびサポート. R. Braden, Ed. IETF. 1989年10月. Internet Standard. URL: https://www.rfc-editor.org/rfc/rfc1123
[RFC2119]
要件レベルを示すために RFC で使用する キーワード. S. Bradner. IETF. 1997年3月. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC3864]
メッセージヘッダー フィールドの登録手順. G. Klyne; M. Nottingham; J. Mogul. IETF. 2004年9月. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc3864
[RFC4291]
IP バージョン6 アドレス アーキテクチャ. R. Hinden; S. Deering. IETF. 2006年2月. Draft Standard. URL: https://www.rfc-editor.org/rfc/rfc4291
[RFC5234]
構文仕様のための拡張 BNF: ABNF. D. Crocker, Ed.; P. Overell. IETF. 2008年1月. Internet Standard. URL: https://www.rfc-editor.org/rfc/rfc5234
[RFC6797]
HTTP Strict Transport Security (HSTS). J. Hodges; C. Jackson; A. Barth. IETF. 2012年11月. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc6797
[RFC8174]
RFC 2119 キーワードにおける大文字と小文字の曖昧さ. B. Leiba. IETF. 2017年5月. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc8174
[RFC9110]
HTTP セマンティクス. R. Fielding, Ed.; M. Nottingham, Ed.; J. Reschke, Ed. IETF. 2022年6月. Internet Standard. URL: https://httpwg.org/specs/rfc9110.html
[RFC9112]
HTTP/1.1. R. Fielding, Ed.; M. Nottingham, Ed.; J. Reschke, Ed. IETF. 2022年6月. Internet Standard. URL: https://httpwg.org/specs/rfc9112.html
[secure-contexts]
セキュアコンテキスト. Mike West. W3C. 2023年11月10日. CRD. URL: https://www.w3.org/TR/secure-contexts/
[url]
URL 標準. Anne van Kesteren. WHATWG. 現行標準. URL: https://url.spec.whatwg.org/