ネットワークエラー記録

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 (プルリクエスト, 新しいイシュー, オープンイシュー)

要約

本書は、開発者がウェブアプリケーションのためのネットワークエラー報告ポリシーを宣言できる仕組みを定義します。ユーザーエージェントはこのポリシーを利用し、要求されたリソースの取得に失敗した際に発生したネットワークエラーを報告できます。

この文書のステータス

このセクションは、公開時点でのこの文書のステータスを説明します。現在のW3C 公開物一覧および本技術レポートの最新版は W3C標準と草案のインデックス(https://www.w3.org/TR/)でご覧いただけます。

この文書はWeb Performance Working Groupによって 勧告トラックを用いて作業草案として公開されました。

作業草案としての公開は、W3Cおよびそのメンバーの支持を意味するものではありません。

これはドラフト文書であり、将来的に他の文書によって更新・差し替え、または廃止される可能性があります。本書を進行中の作業以外のものとして引用するのは不適切です。

本書は W3C特許ポリシーの下で運営されているグループにより作成されました。 W3C本グループ成果物に関連する特許開示の公開リスト を維持しています。そのページには特許を開示するための手順も掲載されています。個人が実際に特許についての知識を持ち、その特許が 必須クレーム を含むと考える場合には、 W3C特許ポリシー6節 に従いその情報を開示しなければなりません。

この文書は 2023年11月3日版 W3Cプロセス文書 に従い管理されています。

1. はじめに

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

現在、アプリケーション開発者はエンドユーザーからウェブアプリケーションの可用性に関するリアルタイム情報を得ることができません。例えば、ユーザーがネットワークエラー(DNSルックアップ失敗、接続タイムアウト、リセットコネクションなど)が原因でページの読み込みに失敗した場合、サイト開発者はこの問題を検知し対処することができません。これらの種類のネットワークエラーは、定義上、クライアントがサーバーとの接続確立に成功できていない可能性があるため、サーバーサイドだけでは検知できません。

既存手法(シンセティックモニタリング等)は、あらかじめ決められた地理的位置に監視ノードを設置することで部分的な解決策を提供しますが、追加インフラ投資が必要であり、実際のエンドユーザーのグローバルかつほぼリアルタイムの可用性情報は提供できません。

Network Error Logging(NEL)は、このニーズに対応するため、ウェブアプリケーションがユーザーエージェントにオリジン単位でネットワークエラーを報告させるための報告ポリシーを宣言する仕組みを定義します。ウェブアプリケーションは、所望のNEL HTTPレスポンスヘッダーフィールドを提供することでNELの利用を選択し、このNELポリシーを記述します。このポリシーはユーザーエージェントに対し、そのオリジンへのリクエストに関する情報を記録し、Reporting APIを用いて事前に設定されたエンドポイントグループへその情報を配信するよう指示します。名前の通り、NELレポートは主にエラーを記述するために使用されます。しかし、異なるクライアント集団間でのエラーを判断するためには、成功したリクエスト数も知る必要があり、これらの成功リクエストもNELの仕組みで報告可能です。

例えば、ユーザーエージェントがhttps://www.example.comからリソース取得時にTCP接続が中断された場合、ユーザーエージェントはReporting APIを経由して次のレポートをキューに追加します:

type
"network-error"
endpoint group
report_toフィールドで設定されたエンドポイントグループ
data
{
  "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 NOTOPTIONALREQUIREDSHOULDといったキーワードは、BCP 14[RFC2119] [RFC8174]で説明される通りに解釈されます。ただし、このように大文字で表現されている場合に限ります。

アルゴリズム中に命令形で記載された要求(例:「先頭の空白文字を取り除く」「falseを返してこれらの手順を中止する」など)は、そのアルゴリズムを導入する際に用いられているキーワード("must"、"should"、"may"等)の意味内容で解釈されます。

属性・メソッド・オブジェクトに対する要件として書かれているものは、ユーザーエージェントへの要件として解釈されます。

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

3. 概念

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

A ネットワークリクエストは、ユーザーエージェントが特定のrequestに対して ネットワーク越しにリソースをHTTP-network fetchしようと試みるときに発生します。

requestは、ユーザーエージェントがオフラインであることが判明している場合(すなわちnavigator. onLinefalseを返すとき)、network requestを発生させてはなりません(MUST NOT)

requestは、mixed contentCORSの失敗によりブロックされる場合、network requestを発生させてはなりません(MUST NOT)。任意のCORS-preflight requestは、それ自体のnetwork request必ず(MUST)発生させなければなりません。

注記

FETCH 標準に従ってrequestsを処理するユーザーエージェントにとって、network requestは、HTTP-network fetchアルゴリズムの一実行に対応します。

使用されるフェッチアルゴリズムや基盤となるアプリケーション・トランスポートプロトコルが何であれ、network requestの処理は次のフェーズから構成されます:

  1. DNS解決: ユーザーエージェントはドメイン名をserverがそのドメインへのHTTP requestsをサービスできるように、RFC1034で定義されるDomain Name Systemを使用してIP addressに解決します。
  2. セキュア接続の確立: ユーザーエージェントはserverへ接続を開き、その接続上でセキュアチャネルを確立します。
  3. リクエストとレスポンスの送受信: セキュアチャネルが確立されると、ユーザーエージェントはHTTPのrequestを送信し、responseserverから受信できます。

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

編集者注

これらのフェーズの定義を[FETCH]へ移動し、再利用可能にしたいと考えています。

network request は、ユーザーエージェントがサーバーから有効なHTTPレスポンスを受信でき、かつそのレスポンスが 4xx または 5xx ステータスコードでない場合、成功 (successful) とみなされます。

network requestは、成功(successful)でない場合、failed(失敗)とされます。

注記

HTTPエラー応答(すなわち4xxまたは 5xxステータスコードを持つもの)はfailures(失敗)と見なされるため、これらはそのNEL policyfailure sampling rateの対象となり、successful sampling rateの対象にはなりません。

3.2 ネットワークエラー

ネットワークエラーは、network requestfailする原因となったエラー条件です。

ネットワークエラーは文字列であるtype(タイプ)を持ちます。

ネットワークエラーは、どのphase(フェーズ)でエラーが発生したかを示す属性を持ちます。

dns
エラーはDNS解決中に発生しました
connection
エラーはセキュア接続確立中に発生しました
application
エラーはリクエストとレスポンスの送受信中に発生しました

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

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

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

ネットワークエラーレポートreport typenetwork-errorです。

ネットワークエラーレポートは、ReportingObserverに対して表示されません(NOT visible)

注記

ネットワークエラーレポートReportingObserverに表示されないのは、これらのレポートがリクエストを受信するサーバーの管理者または所有者にのみ表示されることを意図しているためです。もしReportingObserverに表示されると、リクエストの送信者(originator)にも表示されてしまい、クロスオリジンのリクエストではサーバーのネットワーク構成に関する情報がその管理外の第三者へ漏洩する可能性があります。

3.4 NELポリシー

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

NELポリシーは、受信IPアドレスを持ちます。これはユーザーエージェントがこのサーバーから受け取った IPアドレスです。

NELポリシーオリジンを持ちます。

NELポリシーsubdomainsフラグを持ち、これは includeまたはexcludeです。

NELポリシーは、リクエストヘッダーのリストと、レスポンスヘッダーのリストを持ち、どちらもヘッダー名のリストです。

NELポリシーレポートグループを持ちます。これはこのポリシーのレポートを送信するReportingの エンドポイントグループの名前です。

NELポリシーは、有効期間を秒数で表すttl(有効期限)を持ちます。

NELポリシーは、ユーザーエージェントがそのポリシーを受信した時刻を表す作成時刻(creation)を持ちます。

NELポリシーは、作成時刻から creationウォールクロックunsafe current time の差が172800秒(48時間)を超えるとstale(陳腐化)とみなされます。

NELポリシーは、 作成時刻から creationウォールクロックunsafe current time との差がそのttl(秒)より大きい場合、expired(期限切れ)とみなされます。

3.5 サンプリングレート

大量のトラフィックを扱う可能性のあるoriginは、各ユーザーエージェントが送信するすべてのnetwork requestについてのNELレポートを受信する体制が整っていない可能性があります。オリジンは、各ユーザーエージェントが提出するNELレポート数を制限するために、サンプリングレートを定義できます。通常、successful(成功した)リクエストは failed(失敗した)リクエストよりはるかに多いはずであるため、オリジンはそれぞれに異なるサンプリングレートを指定できます。

NELポリシーは、0.0から1.0の範囲の数値であるsuccessful sampling rate(成功サンプリングレート)を持ちます。

NELポリシーは、0.0から1.0の範囲の数値であるfailure sampling rate(失敗サンプリングレート)を持ちます。

3.6 ポリシーキャッシュ

準拠したユーザーエージェントは、ポリシーキャッシュを提供することが必須(MUST)です。これは NELポリシーの集合を保持するストレージ機構で、(network partition key, origin)のタプルでキー付けされます。

このストレージ機構は不透明でベンダー固有でありウェブに公開されませんが、本仕様が定義するアルゴリズムで使用される以下のメソッドを提供することが必須(MUST)です:

4. ポリシー配信

サーバーは、管理しているオリジンに対してNELポリシーNEL HTTPレスポンスヘッダー経由で定義してもよい(MAY)

4.1 NEL レスポンスヘッダー

NEL レスポンスヘッダーは、 オリジンNELポリシーをユーザーエージェントに伝達するために使用されます。 NELヘッダーのABNF(拡張バッカス・ナウア記法)[RFC5234]による構文は以下の通りです:

NEL = json-field-value

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

ユーザーエージェントは、この仕様で定義された構文に適合しない未知もしくは無効なフィールドや値は無視(MUST)しなければなりません。有効なNELヘッダーフィールドには、少なくともこの仕様で定義された全ての "REQUIRED" フィールドを含むオブジェクトが1個存在しなければなりません。

ユーザーエージェントは、エラー報告の乗っ取りを防ぐため、meta要素によって指定されたNELヘッダーを無視しなければなりません(MUST)NELポリシーは、必ず NEL レスポンスヘッダーで配信されなければなりません。

注記

meta要素での制限は[CSP]仕様と同様で、同様の理由で報告登録をHTTPヘッダーフィールドだけに限定しています。

4.1.1 report_to メンバー

report_toメンバーは、このNELポリシーのレポートが送信されるエンドポイントグループを指定します。 report_toメンバーはNELポリシーの登録時に必須(REQUIRED)であり、過去の登録を削除する場合は省略可能(OPTIONAL)です(max_ageを参照)。存在する場合、その値は文字列でなければなりません(MUST)。他の型はパースエラーとなります。

注記

NELレポートの配信率向上のため、サーバーは、リソース取得元のオリジンのインフラと連動しない代替オリジン上に少なくとも1つのエンドポイントを含むエンドポイントグループreport_toに設定すべきです。そうでない場合、問題が解決しない限りネットワークエラーは報告されません。複数のエンドポイントを設定し、到達不能時に備えることも推奨されます。

4.1.2 max_age メンバー

必須(REQUIRED)であるmax_ageメンバーは、このNELポリシーの有効期間(秒単位の非負整数値)を指定します。その値は非負整数でなければなりません(MUST)。他の型はパースエラーとなります。

0を指定すると、このNELポリシーオリジンに対してポリシーキャッシュから削除されます。

注記

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

4.1.3 include_subdomains メンバー

省略可能(OPTIONAL)include_subdomainsメンバーは、このNELポリシーをすべてのサブドメイン(階層無制限)に対して有効にするブール値です。 include_subdomainsという名前のメンバーが無い、または値がtrueでない場合は対象のサブドメインに対しNELポリシーは有効化されません。

注記

サブドメインのNELレポート配信を確実にするため、アプリケーションはReportingエンドポイントグループinclude_subdomains有効化で構成しておく必要があります。Reportingポリシーがそうでないか、対象サブドメインのReportingポリシーが存在しない場合、サブドメインのNELレポートは配信されません(NELポリシーがサブドメインを含んでいても)。

4.1.4 success_fraction メンバー

省略可能(OPTIONAL)success_fractionメンバーは、このオリジンの成功したネットワークリクエストに関するレポートへ適用されるサンプリングレートを定義します。存在する場合、その値は0.0から1.0までの数値でなければなりません(MUST)。それ以外の値はパースエラーとなります。本メンバーがない場合、ユーザーエージェントはこのオリジンの成功したネットワークリクエストについてNELレポートを収集しません

4.1.5 failure_fraction メンバー

省略可能(OPTIONAL)failure_fractionメンバーは、このオリジンの失敗したネットワークリクエストに関するレポートに適用されるサンプリングレートを定義します。存在する場合、その値は0.0から1.0までの数値でなければなりません(MUST)。それ以外の値はパースエラーとなります。未指定の場合、ユーザーエージェントはこのオリジンのすべての失敗したネットワークリクエストについてNELレポートを収集します。

4.1.6 request_headers メンバー

省略可能(OPTIONAL)request_headersメンバーは、リクエストヘッダーのうち、名前を、このネットワークエラーレポート内で含めるもののリストを定義します。存在する場合、その値は文字列のリストでなければなりません(MUST)

4.1.7 response_headers メンバー

省略可能(OPTIONAL)response_headersメンバーは、レスポンスヘッダーのうち、名前を、このネットワークエラーレポート内で含めるもののリストを定義します。存在する場合、その値は文字列のリストでなければなりません(MUST)

4.2 ポリシーヘッダーの処理

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

  1. 以下のいずれかの条件が真であれば、これらの手順を中止すること:
  2. originrequestオリジンとする。
  3. keyを、requestreserved clientを引数にネットワークパーティションキーを決定で得られる値とする。
  4. headerNELという名前のレスポンスヘッダーの値とする。
  5. listを[HTTP-JFV]4章のアルゴリズムをheaderに実行した結果とする。そのアルゴリズムがエラーになる、またはlistが空の場合、これらの手順を中止する。
  6. itemlistの最初の要素とする。
  7. itemmax_ageというメンバーが存在しない、またはその値が数値でなければ、これらの手順を中止する。
  8. itemmax_ageメンバー値が0なら、このoriginNELポリシーポリシーキャッシュから削除し、以降の手順をスキップする。
  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
    サブドメインフラグ
    include_subdomainsという名前のメンバーがtrueであればinclude、 それ以外はexclude
    リクエストヘッダー
    request_headersメンバーの値
    レスポンスヘッダー
    response_headersメンバーの値
    レポートグループ
    report_toメンバーの値
    ttl
    max_ageメンバーの値
    作成時刻
    ウォールクロックunsafe current time
    成功サンプリングレート
    success_fractionメンバーの値(存在しなければ0.0
    失敗サンプリングレート
    failure_fractionメンバーの値(存在しなければ1.0
  15. 既に(key, origin)のポリシーキャッシュエントリが存在すれば、それをpolicyで置き換え、そうでなければ(key, origin)のポリシーキャッシュpolicyを挿入する。

5. レポート配信

5.1 リクエストに対するポリシーの選択

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

  1. originrequestオリジン とする。
  2. keyrequestreserved client を引数に ネットワークパーティションキーを決定 で得られる値とする。
  3. (key, origin) のポリシーキャッシュエントリが存在する場合:
    1. policy をそのエントリとする。
    2. policy期限切れでない場合、それを返す。
  4. originスーパーオリジン一致(親オリジン)それぞれについて:
    1. (key, parent origin) のポリシーキャッシュエントリが存在する場合:
      1. policy をそのエントリとする。
      2. policy期限切れでなく、かつpolicyサブドメインフラグがincludeの場合、それを返す。
  5. ポリシーなし を返す。

5.2 リクエストヘッダーの抽出

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

  1. headers を新規の空のECMAScriptオブジェクトとする。
  2. policyリクエストヘッダーリストの各 header name について:
    1. requestヘッダーリストheader name含まない場合、このリストの次のheader nameに進む。
    2. values を空のECMAScriptリストとする。
    3. requestヘッダーリスト内の、nameheader nameである各headerについて、headervaluevaluesに追加する。
    4. headers に、名前をheader name、値をvaluesとする新しいプロパティを追加する。
  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ヘッダーリスト内の、nameheader nameである各headerについて、headervaluevaluesに追加する。
    4. headers に、名前をheader name、値をvaluesとする新しいプロパティを追加する。
  3. headers を返す。

5.4 ネットワークエラーレポートの生成

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

  1. requestオリジンに対し"起源が潜在的に信頼できるか?"アルゴリズムの結果がPotentially Trustworthyない場合、nullを返す。
  2. originrequestオリジンとする。
  3. policy5.1 リクエストに対するポリシーの選択request に対して実行した結果とする。 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進表記(例: 192.0.2.1)。[RFC1123]
    • IPv6ホストは8セットの16ビット数をコロン区切り16進で(例: x:x:x:x:x:x:x:x)。[RFC4291]
    protocol
    リソース取得時に用いられたネットワークプロトコル(ALPN Protocol IDで識別)。 情報がなければ""
  8. report bodyphase プロパティが dns または connection でない場合、以下のプロパティを追加:
    referrer
    requestのリファラー(関連するreferrer policyによる)。
    method
    requestリクエストメソッド
    request_headers
    5.2 リクエストヘッダーの抽出requestpolicy に対して実行した結果。
    response_headers
    5.3 レスポンスヘッダーの抽出responsepolicy に対して実行した結果。
    status_code
    HTTPレスポンスのステータスコード(利用可能なら)。なければ0
  9. originpolicyorigin と異なり、policyサブドメインフラグが include で、かつ report bodyphase プロパティが dns でない場合は、nullを返す。
    注記

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

  10. report bodyphase プロパティがdnsでなく、かつserver_ipが空でなく、かつpolicy受信IPアドレスと等しくない場合:
    1. report bodyphasedns に設定する。
    2. report bodytypedns.address_changed に設定する。
    3. report bodyrequest_headersresponse_headersstatus_codeelapsed_time プロパティをクリアする。
    4. report body内でDNS解決時点で取得できない情報に由来するすべてのフィールドがクリアされていることを保証する。
    注記

    この手順は、サーバーとNELポリシーの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. 下記パラメータで ネットワークレポートの生成 を呼び出す:
    type
    network-error
    data
    report body
    endpoint group
    policyレポートグループ
    url
    URLシリアライザーurlに対して実行した結果

6. 定義済みネットワークエラータイプ

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

ユーザーエージェントは、カスタムネットワークエラー タイプ(例えば新しいプロトコルへの対応や、既存プロトコルのより詳細なエラー記述のため)を追加してこのリストを拡張してもよい(MAY)。この場合、ユーザーエージェントはエラー報告のシンプルかつ一貫した処理のため、[group].[optional-subgroup].[error-name]というドット区切りパターンのtype名を推奨(SHOULD)します。例えば、コレクターはカテゴリやサブグループ単位で集計が可能になります。

6.1 DNS解決エラー

このセクションのすべてのネットワークエラーDNS解決フェーズで発生し、そのphasednsとなります。

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

6.2 セキュア接続確立エラー

このセクションのすべてのネットワークエラーセキュア接続確立フェーズで発生し、そのphaseconnectionとなります。

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 リクエスト・レスポンス送信エラー

このセクションのすべてのネットワークエラーリクエスト・レスポンス送信フェーズで発生し、そのphaseapplicationとなります。

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ミリ秒後にナビゲーションを中止しました。最終的に、ネットワークエラー発生直後、つまりレポートのageは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ポリシーが配信されていたため、ユーザーエージェントはこのリクエストについてネットワークエラー レポートを生成します。レポートはネットワークエラー発生直後、すなわちageは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の所有者は、たとえばnew-subdomain.example.comをIPアドレスへ解決するリソースレコードの追加を忘れた場合など、DNSサーバー構成ミスを検出できます。ユーザーエージェントが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_headersresponse_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が3つのサーバー(それぞれ異なるIPアドレス)で処理されている場合を考えます。サービス所有者はDNSをexample.com192.0.2.1192.0.2.2192.0.2.3に解決されるよう構成し、ユーザーエージェントがこれら3つにリクエストを分散するよう任せています。サービス所有者は次の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ポリシーが含まれており、ユーザーエージェントはreceived IP address192.0.2.1に設定します。received IP addressがサーバーの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に新たなリクエストを送り、再びsuccessとなるレスポンスを受信します。このレスポンスもNELポリシー付きで、received IP address192.0.2.2に更新されます。この場合も、IPがサーバーIPと一致するので次のレポートが生成されます:

    {
      "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のレポートを生成すべきですが、NELポリシーのreceived IP address192.0.2.2)が今回のリクエスト先IPと一致しないため、そのサーバーが本当に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ポリシーを受信したことがあっても、ポリシーのreceived IP addressには直近で受信した場所(ここでは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ポリシーをユーザーエージェントに登録できます。そうすることで、ポリシー有効なオリジンからのリソース取得でネットワークエラーが発生すると、ユーザーエージェントは詳細なネットワークエラーレポートを生成し、アプリケーション開発者が原因調査を行うことができます。

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

サードパーティによる埋め込みリソースの場合、リソース提供者は失敗を検知・観測できないことが多いです。例えば、example.comwidget.com/thing.jsリソースを自サイトに埋め込み、example.com訪問ユーザーがネットワークエラーでそのリソースを取得できなかった場合、widget.com側はその失敗自体に気づくことができません。

この課題に対処するため、widget.comは自身のホストにNELポリシーを登録できます。これによって、ファースト/サードパーティ出自を問わず、登録済みNELポリシーのあるオリジンからリソース取得時にネットワークエラーが発生した場合、ユーザーエージェントはエラーをレポートし、提供者が原因を調査できるようにします。

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

NELはユーザーのネットワーク構成に関する新たな情報を公開する可能性のあるネットワークエラーレポートを提供します。例えば、攻撃者がNELレポーティングを悪用してユーザーのネットワーク構成を調査したり、ユーザー内部ネットワーク上のサーバーをスキャンしたりできる可能性があります。また、HSTSやHPKP、CSPピン留めと同様に、保存されたNELポリシーが一意の(ユーザー毎の)レポートURIを使用してHTTPクッキーと同様の識別子として「スーパーCookie」として機能するリスクがあります。

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

さらに、NELのポリシーキャッシュネットワークパーティションキーごとに分割管理されるため、ある埋め込みコンテキストで保存されたNELポリシーは他のコンテキスト(例えば異なるトップレベルサイトに埋め込んだ場合)で利用されません。

NELは既存のサーバーサイド監視の補完を意図しています。NELレポートは基本的にリクエスト先サービス所有者だけに送信されるべきです。DNS解決中のエラーについては、NELポリシーポリシーオリジンを含むドメイン名前空間ツリーの所有者から受信された場合のみNELレポートが生成されます。セキュア接続確立リクエスト・レスポンス送信で発生したエラーは、そのリクエストが送信されたサーバーの所有者から受信したNELポリシーがある場合のみレポートが生成されます。

この理由により、受信IPアドレスチェックとサブドメインフラグの扱いには設計上の根拠があります。ポリシーの受信IPアドレスが実際ユーザーエージェントが通信するサーバーのIPアドレスと一致しているか確認することで、ポリシー適用範囲がオリジンだけでなく実際のサーバーにも及ぶようにし、たとえば攻撃者が自身のサーバーから有効期限の長いNELポリシーを配布した後でネームサーバーを書き換え、ポリシーオリジンを別サーバーに向けた場合のDNSリバインディング攻撃を防ぎます。この検証がない場合、ユーザーエージェントは後者サーバーの情報を攻撃者に送信してしまう恐れがあります。

同様に、サブドメインNELポリシーは、ポリシーオリジンのサブドメイン配下であっても、DNS解決フェーズでのみレポート生成に使えます。このフェーズではまだ実際のサーバーが存在せず、ポリシーの出自がリクエストオリジンのスーパーオリジンからであることのみを根拠とします。これにより特定ドメインツリーの所有者がDNS設定ミス(7.3 DNSの誤設定)検出にNELを使いつつ、悪意あるDNSエントリーによる支配外サーバー情報収集を防ぎます。

情報漏洩防止のため、リクエストに関わるNELレポートには、サーバーが該当リクエスト処理時に閲覧できない情報は一切含まれません。DNS解決エラー時のNELレポートもDNS自体から取得可能な情報しか含みません。これにより、サーバーが通常アクセスできる以上の情報をNEL経由でユーザーから収集できないようにします。なお、NELレポートにはserver_ipフィールドでWebサイトの公開IPアドレスが含まれる点に注意してください。これはロードバランサやトランスペアレントなMITMプロキシ背後など、NELヘッダー発行側サービスが常に把握できるとは限りません。

注記

例えば、NELレポートにはどのDNSリゾルバリクエストドメイン名をIPアドレスに解決したかの情報は一切含まれません。

上記の制限に加えて、ユーザーエージェントは必須(MUST)で次の対応を行います:

NEL導入時には、指定されたコレクターに配信されるNELレポートのプライバシー影響についても考慮すべき(SHOULD)です。例えば、レポートには機密データを含むURL(「Capability URL」など)が用いられる場合があり、特別な注意が必要となることや、そうしたURLを第三者に配信しない目的で独自コレクターを運用する必要が生じることもあります([CAPABILITY-URLS]参照)。

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]
Good Practices for Capability URLs. Jeni Tennison. W3C. 2014年2月18日. FPWD. URL: https://www.w3.org/TR/capability-urls/
[CSP]
Content Security Policy Level 3. Mike West; Antonio Sartori. W3C. 2025年4月30日. W3C作業草案. URL: https://www.w3.org/TR/CSP3/
[ECMA-262]
ECMAScript Language Specification. Ecma International. URL: https://tc39.es/ecma262/multipage/
[fetch]
Fetch Standard. Anne van Kesteren. WHATWG. Living Standard. URL: https://fetch.spec.whatwg.org/
[hr-time]
High Resolution Time. Yoav Weiss. W3C. 2024年11月7日. W3C作業草案. URL: https://www.w3.org/TR/hr-time-3/
[html]
HTML Standard. Anne van Kesteren; Domenic Denicola; Dominic Farolino; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[HTTP-JFV]
A JSON Encoding for HTTP Header Field Values. J. Reschke. IETF. 2017年10月24日. アクティブインターネットドラフト. URL: https://datatracker.ietf.org/doc/html/draft-reschke-http-jfv
[infra]
Infra Standard. Anne van Kesteren; Domenic Denicola. WHATWG. Living Standard. URL: https://infra.spec.whatwg.org/
[mixed-content]
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. Editor's Draft. URL: https://w3c.github.io/reporting/network-reporting.html
[referrer-policy]
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]
Domain names - concepts and facilities. P. Mockapetris. IETF. 1987年11月. インターネット標準. URL: https://www.rfc-editor.org/rfc/rfc1034
[RFC1123]
Requirements for Internet Hosts - Application and Support. R. Braden, Ed. IETF. 1989年10月. インターネット標準. URL: https://www.rfc-editor.org/rfc/rfc1123
[RFC2119]
Key words for use in RFCs to Indicate Requirement Levels. S. Bradner. IETF. 1997年3月. 現行最良慣行. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC3864]
Registration Procedures for Message Header Fields. G. Klyne; M. Nottingham; J. Mogul. IETF. 2004年9月. 現行最良慣行. URL: https://www.rfc-editor.org/rfc/rfc3864
[RFC4291]
IP Version 6 Addressing Architecture. R. Hinden; S. Deering. IETF. 2006年2月. 草案標準. URL: https://www.rfc-editor.org/rfc/rfc4291
[RFC5234]
Augmented BNF for Syntax Specifications: ABNF. D. Crocker, Ed.; P. Overell. IETF. 2008年1月. インターネット標準. URL: https://www.rfc-editor.org/rfc/rfc5234
[RFC6797]
HTTP Strict Transport Security (HSTS). J. Hodges; C. Jackson; A. Barth. IETF. 2012年11月. 提案標準. URL: https://www.rfc-editor.org/rfc/rfc6797
[RFC8174]
Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words. B. Leiba. IETF. 2017年5月. 現行最良慣行. URL: https://www.rfc-editor.org/rfc/rfc8174
[RFC9110]
HTTP Semantics. R. Fielding, Ed.; M. Nottingham, Ed.; J. Reschke, Ed. IETF. 2022年6月. インターネット標準. URL: https://httpwg.org/specs/rfc9110.html
[RFC9112]
HTTP/1.1. R. Fielding, Ed.; M. Nottingham, Ed.; J. Reschke, Ed. IETF. 2022年6月. インターネット標準. URL: https://httpwg.org/specs/rfc9112.html
[secure-contexts]
Secure Contexts. Mike West. W3C. 2023年11月10日. CRD. URL: https://www.w3.org/TR/secure-contexts/
[url]
URL Standard. Anne van Kesteren. WHATWG. Living Standard. URL: https://url.spec.whatwg.org/