Copyright © 2022 W3C® (MIT, ERCIM, Keio, Beihang). W3C liability, trademark and permissive document license rules apply.
この仕様は、リソースの競合を最小限に抑えながら、他の時間クリティカルな操作と非同期かつ非ブロッキングでデータを送信できるインターフェイスをウェブ開発者が利用できるように定義しています。その一方で、これらのリクエストが目的地に正しく処理されて配信されることを保証します。
このセクションは、この文書が公開された時点での位置付けを説明しています。現在のW3Cの公開物と、この技術レポートの最新の改訂版は、W3C 技術レポート索引(https://www.w3.org/TR/)で確認できます。
この文書は、Web Performance Working Groupによって、勧告トラックを使用して候補勧告ドラフトとして発行されました。
候補勧告としての発行は、W3Cおよびその会員による承認を意味するものではありません。候補勧告ドラフトは、作業グループが次の候補勧告スナップショットに含めることを意図している前回の候補勧告からの変更を統合したものです。
本文書はドラフト文書であり、いつでも更新、置き換え、または廃止される可能性があります。この文書を進行中の作業以外の用途で引用することは不適切です。
本文書は、W3C特許ポリシーに基づいて運営されるグループによって作成されました。 W3Cは、グループの成果物に関連して提出された特許開示の公開リストを維持しています。このページには特許を開示するための手順も記載されています。個人が、必須クレームを含むと考える特許について実際の知識を持っている場合、その情報をW3C特許ポリシー第6条に従って開示する必要があります。
本文書は、2021年11月2日 W3Cプロセス文書に準拠しています。
このセクションは規範的ではありません。
ウェブアプリケーションは、イベント、状態更新、および分析データを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イベントに依存することを避けてください。なぜなら、ページがバックグラウンド状態の場合(例:
visibilityState
がhidden
と等しい)モバイルOSによってプロセスが終了される場合には発火しないからです。
sendBeacon()
メソッドを介して開始されたリクエストは、時間クリティカルな作業と競合したりブロックしたりせず、ユーザーエージェントによってネットワーク効率を改善するために優先順位付けされる可能性があり、ビーコンデータの配信を保証するためにブロッキング操作を使用する必要を排除します。
以下は、sendBeacon()
が行わないこと、および解決を意図していないことです:
sendBeacon()
メソッドは、オフラインストレージや配信の特別な処理を提供しません。ビーコンリクエストは他のリクエストと同様であり、必要に応じて[SERVICE-WORKERS]と組み合わせてオフライン機能を提供できます。sendBeacon()
メソッドは、バックグラウンド同期や転送機能を提供することを意図していません。ユーザーエージェントはビーコンリクエストが迅速かつタイムリーに完了できるよう、受け入れられるペイロードサイズを制限します。
sendBeacon()
メソッドは、リクエストメソッドのカスタマイズ、カスタムリクエストヘッダーの提供、またはリクエストおよびレスポンスの処理プロパティの変更を提供しません。このようなリクエストに対してデフォルト設定以外が必要なアプリケーションは、[FETCH] APIをkeepaliveをtrue
に設定して使用するべきです。
非規範的とマークされたセクションと同様に、この仕様におけるすべての作成ガイドライン、図、例、および注記は非規範的です。それ以外のこの仕様の内容は規範的です。
この文書内のキーワードMAY、MUST、SHOULD、およびSHOULD NOTは、 BCP 14 [RFC2119] [RFC8174] に記載されているように解釈されるべきです。ただし、これらがすべて大文字で表示されている場合に限ります。
可読性を高めるため、この仕様ではこれらの単語をすべて大文字で表示していません。
アルゴリズムの一部として命令形で記述された要件(例:「先頭のスペース文字をすべて削除する」や「falseを返してこれらの手順を中止する」)は、アルゴリズムの冒頭で使用されているキーワード(「must」、「should」、「may」など)の意味で解釈されるべきです。
属性、メソッド、またはオブジェクトに関する要件として記述された適合要件は、ユーザーエージェントに対する要件として解釈されるべきです。
アルゴリズムまたは特定の手順として記述された適合要件は、最終結果が同等である限り、任意の方法で実装することができます。(特に、この仕様で定義されているアルゴリズムは、フォローしやすいことを意図しており、パフォーマンスを目的としていません。)
WebIDL
sendBeacon()
メソッドは、
パラメーターで提供されるデータをdata
url
パラメーターで指定されたURLに送信します:
visibilityState
がhidden
に遷移した際に、すべてのビーコンリクエストを即座に送信するようスケジュールし、これらのリクエストが他の時間クリティカルな高優先度の作業をブロックすることなく完了できるようにしなければなりません(MUST)。
204 No Content
で応答する)が推奨されます。
sendBeacon()
メソッドは、データを転送するために正常にキューに入れることができた場合はtrueを返します。それ以外の場合はfalseを返します。
ユーザーエージェントは、このAPIを介して送信できるデータ量に制限を課します。これにより、このようなリクエストが他のユーザーやブラウザのアクティビティに最小限の影響を与えながら、正常に配信されることが保証されます。キューに入れられるdataの量がユーザーエージェントの制限を超えた場合(HTTP-network-or-cache
fetchで定義されているように)、このメソッドはfalse
を返します。true
の戻り値は、ブラウザがデータを転送のためにキューに入れたことを意味します。ただし、実際のデータ転送は非同期で行われるため、このメソッドはデータ転送が成功したかどうかについての情報を提供しません。
sendBeacon()
メソッドをurlおよび
必要に応じてdataと共に呼び出したとき、次の手順を実行します:
baseをthisの関連設定オブジェクトの API ベース URLに設定します。
originをthisの関連設定オブジェクトの オリジンに設定します。
parsedUrlをurlおよびbaseでURL
パーサー手順を実行した結果に設定します。アルゴリズムがエラーを返す場合、またはparsedUrlのスキームが"http"または"https"でない場合は、"
"例外をスローし、これらの手順を終了します。
TypeError
no-cors
"に設定します。もしdataがnull
でない場合:
false
に設定し、これらの手順を終了します。
Beacon APIによって開始されたリクエストは、自動的にkeepaliveフラグを設定します。同様に、開発者はFetch APIを使用する際に同じフラグを手動で設定することもできます。このフラグが設定されたすべてのリクエストは、Fetch API内で適用される同じ進行中のクオータ制限を共有します。
cors
"に設定します。Content-Type
ヘッダーのCORS-safelisted
request-header値である場合、corsModeを"no-cors
"に設定します。
Content-Type
ヘッダーをheaderListに追加します。
true
に設定し、sendBeacon()
呼び出しを返し、以下の手順を並行して実行します:
sendBeacon()
インターフェースは、データを非同期かつ非ブロッキングで配信するメカニズムを提供します。このAPIを使用して以下を実現できます:
配信されるデータには、例えば、ウェブページでのユーザーのアクティビティに関するデータなど、潜在的に機密性の高い情報が含まれる可能性があります。これはユーザーのプライバシーに影響を与える可能性がありますが、既存の方法(スクリプトによるフォーム送信、画像ビーコン、XHR/Fetchリクエストなど)も同様の機能を提供します。ただし、これらの方法にはさまざまな高コストなパフォーマンスのトレードオフがあります。リクエストはユーザーエージェントによって中断される可能性があり、開発者が同期リクエストを呼び出したり、空ループでスピンしたりすることでユーザーエージェントが他のイベントを処理するのを妨げない限り、リクエストは中断される可能性があります。また、ユーザーエージェントはこれらのリクエストを優先順位付けや統合してシステムリソースの使用を最適化することができません。
sendBeacon()
によって開始されたリクエストは以下の特性に従います:
Content-Type
がCORS-safelisted
request-headerである場合、そのリクエストモードはno-cors
となります。これはそれぞれ画像ビーコンやフォーム投稿に似ています。
Access-Control-Allow-Credentials
,
Access-Control-Allow-Origin
,
Access-Control-Allow-Headers
。
そのため、セキュリティの観点から見ると、Beacon APIは開発者が現在使用している方法と同じセキュリティポリシーに従います。同様に、プライバシーの観点から見ても、結果として得られるリクエストは、APIが呼び出された時点またはページの可視性が変化した時点で即座に開始されるため、開発者がアクセス可能な既存のライフサイクルイベントに限定して情報(例:ユーザーのIPアドレス)が公開されます。ただし、ユーザーエージェントはそのようなリクエストをユーザーに透明性を持って提示するための代替方法を検討する場合があります。
代替手段と比較して、sendBeacon()
APIには2つの制約が適用されます:コールバックメソッドが存在しないこと、およびペイロードサイズがユーザーエージェントによって制限される可能性があることです。それ以外の場合、sendBeacon()
APIには追加の制限はありません。ユーザーエージェントはsendBeacon()
呼び出しの処理をスキップしたり、スロットリングしたりすべきではありません。これらは重要なアプリケーションの状態、イベント、および分析データを含む可能性があるためです。同様に、ユーザーエージェントは「プライベートブラウジング」または同等のモードでsendBeacon()
を無効にすべきではありません。これは、アプリケーションを破壊することを避け、ユーザーがそのようなモードにいることを漏らさないようにするためです。
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に、この作業への貢献に感謝します。