ビーコン

W3C 候補勧告ドラフト

この文書の詳細情報
このバージョン:
https://www.w3.org/TR/2022/CRD-beacon-20220803/
最新公開バージョン:
https://www.w3.org/TR/beacon/
最新編集ドラフト:
https://w3c.github.io/beacon/
履歴:
https://www.w3.org/standards/history/beacon
コミット履歴
テストスイート:
https://w3c-test.org/beacon/
実装レポート:
https://w3c.github.io/test-results/beacon/
編集者:
(Shopify)
(Compuware Corp.)
元編集者:
(Google Inc.) - 2015年1月1日まで
(Microsoft Corp.) - 2014年2月1日まで
フィードバック:
GitHub w3c/beacon (プルリクエスト, 新しい問題, オープンな問題)
public-web-perf@w3.org タイトル行に [beacon] … メッセージのトピック … を含めてください (アーカイブ)
実装
Beaconを使用できますか?

概要

この仕様は、リソースの競合を最小限に抑えながら、他の時間クリティカルな操作と非同期かつ非ブロッキングでデータを送信できるインターフェイスをウェブ開発者が利用できるように定義しています。その一方で、これらのリクエストが目的地に正しく処理されて配信されることを保証します。

この文書の位置付け

このセクションは、この文書が公開された時点での位置付けを説明しています。現在のW3Cの公開物と、この技術レポートの最新の改訂版は、W3C 技術レポート索引(https://www.w3.org/TR/)で確認できます。

この文書は、Web Performance Working Groupによって、勧告トラックを使用して候補勧告ドラフトとして発行されました。

候補勧告としての発行は、W3Cおよびその会員による承認を意味するものではありません。候補勧告ドラフトは、作業グループが次の候補勧告スナップショットに含めることを意図している前回の候補勧告からの変更を統合したものです。

本文書はドラフト文書であり、いつでも更新、置き換え、または廃止される可能性があります。この文書を進行中の作業以外の用途で引用することは不適切です。

本文書は、W3C特許ポリシーに基づいて運営されるグループによって作成されました。 W3Cは、グループの成果物に関連して提出された特許開示の公開リストを維持しています。このページには特許を開示するための手順も記載されています。個人が、必須クレームを含むと考える特許について実際の知識を持っている場合、その情報をW3C特許ポリシー第6条に従って開示する必要があります。

本文書は、2021年11月2日 W3Cプロセス文書に準拠しています。

1. イントロダクション

このセクションは規範的ではありません。

ウェブアプリケーションは、イベント、状態更新、および分析データを1つ以上のサーバーに報告するリクエストを発行する必要がある場合があります。これらのリクエストは通常、クライアント側でのレスポンス処理を必要とせず(例: 204または200 HTTPレスポンスコードと空のレスポンスボディ)、重要なリソースのフェッチ、入力への反応、アニメーションの実行などの高優先度操作とネットワークおよび計算リソースを競合させるべきではありません。しかし、このような一方向リクエスト(ビーコン)は、重要なアプリケーションや計測データの配信も担当しており、開発者はその配信を確保するために高コストな方法を使用せざるを得ません:

上記の配信および処理要件の不一致により、ほとんどの開発者が難しい選択を迫られ、ユーザーエクスペリエンスを損なうブロッキング技術が広く採用されています。この仕様では、リソース競合を最小限に抑えつつ、データの非同期かつ非ブロッキング配信をスケジュールできるインターフェースをウェブ開発者が利用できるように定義しています。このインターフェースは、次のことを保証します:

以下の例は、sendBeacon()メソッドを使用して、イベント、クリック、および分析データを配信する方法を示しています:

<html>
<script>
  // クライアント側イベントを記録する非ブロッキングビーコンを送信
  function reportEvent(event) {
    var data = JSON.stringify({
      event: event,
      time: performance.now()
    });
    navigator.sendBeacon('/collector', data);
  }

  // ページがバックグラウンド状態に移行するときに(ページ可視性API)、
  // セッション分析データを含む非ブロッキングビーコンを送信
  document.addEventListener('visibilitychange', function() {
    if (document.visibilityState === 'hidden') {
      var sessionData = buildSessionReport();
      navigator.sendBeacon('/collector', sessionData);
    }
  });
</script>

<body>
 <a href='http://www.w3.org/' onclick='reportEvent(this)'>
 <button onclick="reportEvent('some event')">クリックしてください</button>
</body>
</html>
注記

上記の例では、visibilitychange イベント([PAGE-VISIBILITY-2]で定義)を使用してセッションデータの配信をトリガーします。 このイベントは、ページがバックグラウンド状態に移行するとき(例: ユーザーが別のアプリケーションに切り替える、ホーム画面に戻るなど)やアンロードされるときに、モバイルデバイスで発火することが保証されている唯一のイベントです。 unloadイベントに依存することを避けてください。なぜなら、ページがバックグラウンド状態の場合(例: visibilityStatehiddenと等しい)モバイルOSによってプロセスが終了される場合には発火しないからです。

sendBeacon()メソッドを介して開始されたリクエストは、時間クリティカルな作業と競合したりブロックしたりせず、ユーザーエージェントによってネットワーク効率を改善するために優先順位付けされる可能性があり、ビーコンデータの配信を保証するためにブロッキング操作を使用する必要を排除します。

以下は、sendBeacon()が行わないこと、および解決を意図していないことです:

2. 適合性

非規範的とマークされたセクションと同様に、この仕様におけるすべての作成ガイドライン、図、例、および注記は非規範的です。それ以外のこの仕様の内容は規範的です。

この文書内のキーワードMAYMUSTSHOULD、およびSHOULD NOTは、 BCP 14 [RFC2119] [RFC8174] に記載されているように解釈されるべきです。ただし、これらがすべて大文字で表示されている場合に限ります。

可読性を高めるため、この仕様ではこれらの単語をすべて大文字で表示していません。

アルゴリズムの一部として命令形で記述された要件(例:「先頭のスペース文字をすべて削除する」や「falseを返してこれらの手順を中止する」)は、アルゴリズムの冒頭で使用されているキーワード(「must」、「should」、「may」など)の意味で解釈されるべきです。

属性、メソッド、またはオブジェクトに関する要件として記述された適合要件は、ユーザーエージェントに対する要件として解釈されるべきです。

アルゴリズムまたは特定の手順として記述された適合要件は、最終結果が同等である限り、任意の方法で実装することができます。(特に、この仕様で定義されているアルゴリズムは、フォローしやすいことを意図しており、パフォーマンスを目的としていません。)

3. ビーコン

3.1 sendBeacon() メソッド

WebIDLpartial interface Navigator {
    boolean sendBeacon(USVString url, optional BodyInit? data = null);
};

sendBeacon()メソッドは、dataパラメーターで提供されるデータをurlパラメーターで指定されたURLに送信します:

注記
Beacon APIはレスポンスコールバックを提供しません。このようなリクエストに対するレスポンスボディを省略すること(例:204 No Contentで応答する)が推奨されます。

パラメーター

url

urlパラメーターは、データを送信するURLを示します。

data

dataパラメーターは、送信されるBodyInitデータです。

戻り値

sendBeacon()メソッドは、データを転送するために正常にキューに入れることができた場合はtrueを返します。それ以外の場合はfalseを返します。

注記

ユーザーエージェントは、このAPIを介して送信できるデータ量に制限を課します。これにより、このようなリクエストが他のユーザーやブラウザのアクティビティに最小限の影響を与えながら、正常に配信されることが保証されます。キューに入れられるdataの量がユーザーエージェントの制限を超えた場合(HTTP-network-or-cache fetchで定義されているように)、このメソッドはfalseを返します。trueの戻り値は、ブラウザがデータを転送のためにキューに入れたことを意味します。ただし、実際のデータ転送は非同期で行われるため、このメソッドはデータ転送が成功したかどうかについての情報を提供しません。

3.2 処理モデル

sendBeacon()メソッドをurlおよび 必要に応じてdataと共に呼び出したとき、次の手順を実行します:

  1. basethis関連設定オブジェクトAPI ベース URLに設定します。

  2. originthis関連設定オブジェクトオリジンに設定します。

  3. parsedUrlurlおよびbaseURL パーサー手順を実行した結果に設定します。アルゴリズムがエラーを返す場合、またはparsedUrlスキームが"http"または"https"でない場合は、"TypeError"例外をスローし、これらの手順を終了します。

  4. headerListを空のリストに設定します。
  5. corsModeを"no-cors"に設定します。
  6. もしdatanullでない場合:

    1. transmittedDataおよびcontentTypeを、keepalive flagを設定してdataのバイトストリームを抽出した結果に設定します。
    2. keepaliveが有効なリクエストで送信キューに入れることができるデータ量をtransmittedDataのサイズが超える場合(HTTP-network-or-cache fetchで定義されているように)、戻り値をfalseに設定し、これらの手順を終了します。
      注記

      Beacon APIによって開始されたリクエストは、自動的にkeepaliveフラグを設定します。同様に、開発者はFetch APIを使用する際に同じフラグを手動で設定することもできます。このフラグが設定されたすべてのリクエストは、Fetch API内で適用される同じ進行中のクオータ制限を共有します。

    3. もしcontentTypeがnullでない場合:
      • corsModeを"cors"に設定します。
      • もしcontentTypeの値がContent-TypeヘッダーのCORS-safelisted request-header値である場合、corsModeを"no-cors"に設定します。
      • contentTypeの値を持つContent-TypeヘッダーをheaderListに追加します。
  7. 戻り値をtrueに設定し、sendBeacon()呼び出しを返し、以下の手順を並行して実行します:
    1. reqを次のように初期化された新しいリクエストに設定します:

      メソッド
      POST
      クライアント
      this関連設定オブジェクト
      url
      parsedUrl
      ヘッダーリスト
      headerList
      オリジン
      origin
      keepalive
      true
      ボディ
      transmittedData
      モード
      corsMode
      資格情報モード
      include
      発信者タイプ
      "beacon"
    2. Fetch req

4. プライバシーとセキュリティ

sendBeacon()インターフェースは、データを非同期かつ非ブロッキングで配信するメカニズムを提供します。このAPIを使用して以下を実現できます:

配信されるデータには、例えば、ウェブページでのユーザーのアクティビティに関するデータなど、潜在的に機密性の高い情報が含まれる可能性があります。これはユーザーのプライバシーに影響を与える可能性がありますが、既存の方法(スクリプトによるフォーム送信、画像ビーコン、XHR/Fetchリクエストなど)も同様の機能を提供します。ただし、これらの方法にはさまざまな高コストなパフォーマンスのトレードオフがあります。リクエストはユーザーエージェントによって中断される可能性があり、開発者が同期リクエストを呼び出したり、空ループでスピンしたりすることでユーザーエージェントが他のイベントを処理するのを妨げない限り、リクエストは中断される可能性があります。また、ユーザーエージェントはこれらのリクエストを優先順位付けや統合してシステムリソースの使用を最適化することができません。

sendBeacon()によって開始されたリクエストは以下の特性に従います:

そのため、セキュリティの観点から見ると、Beacon APIは開発者が現在使用している方法と同じセキュリティポリシーに従います。同様に、プライバシーの観点から見ても、結果として得られるリクエストは、APIが呼び出された時点またはページの可視性が変化した時点で即座に開始されるため、開発者がアクセス可能な既存のライフサイクルイベントに限定して情報(例:ユーザーのIPアドレス)が公開されます。ただし、ユーザーエージェントはそのようなリクエストをユーザーに透明性を持って提示するための代替方法を検討する場合があります。

代替手段と比較して、sendBeacon() APIには2つの制約が適用されます:コールバックメソッドが存在しないこと、およびペイロードサイズがユーザーエージェントによって制限される可能性があることです。それ以外の場合、sendBeacon() APIには追加の制限はありません。ユーザーエージェントはsendBeacon()呼び出しの処理をスキップしたり、スロットリングしたりすべきではありません。これらは重要なアプリケーションの状態、イベント、および分析データを含む可能性があるためです。同様に、ユーザーエージェントは「プライベートブラウジング」または同等のモードでsendBeacon()を無効にすべきではありません。これは、アプリケーションを破壊することを避け、ユーザーがそのようなモードにいることを漏らさないようにするためです。

A. 謝辞

Alois Reitbauer、Arvind Jain、Anne van Kesteren、Boris Zbarsky、Chase Douglas、Daniel Austin、Jatinder Mann、James Simonsen、Jason Weber、Jonas Sicking、Nick Doty、Philippe Le Hegaret、Todd Reifsteck、Tony Gentilcore、William Chan、およびYoav Weissに、この作業への貢献に感謝します。

B. 参考文献

B.1 規範的参考文献

[fetch]
Fetch 現行標準。Anne van Kesteren。WHATWG。 現行標準。URL: https://fetch.spec.whatwg.org/
[html]
HTML 現行標準。Anne van Kesteren、Domenic Denicola、Ian Hickson、Philip Jägenstedt、Simon Pieters。WHATWG。現行標準。URL: https://html.spec.whatwg.org/multipage/
[RFC2119]
RFCで要件レベルを示すためのキーワード。S. Bradner。IETF。1997年3月。現行標準。URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC8174]
RFC 2119のキーワードにおける大文字と小文字の曖昧さ。B. Leiba。IETF。2017年5月。現行標準。URL: https://www.rfc-editor.org/rfc/rfc8174
[url]
URL 現行標準。Anne van Kesteren。WHATWG。 現行標準。URL: https://url.spec.whatwg.org/
[webidl]
Web IDL 現行標準。Edgar Chen、Timothy Gu。 WHATWG。現行標準。URL: https://webidl.spec.whatwg.org/

B.2 参考情報文献

[PAGE-VISIBILITY-2]
ページ可視性 レベル2。Ilya Grigorik、Marcos Caceres。W3C。2022年6月23日。W3C候補勧告。URL: https://www.w3.org/TR/page-visibility-2/
[SERVICE-WORKERS]
サービスワーカー 1。Alex Russell、Jungkee Song、Jake Archibald、Marijn Kruisselbrink。W3C。2019年11月19日。W3C候補勧告。URL: https://www.w3.org/TR/service-workers-1/