高解像度時間

W3C作業草案

この文書の詳細
このバージョン:
https://www.w3.org/TR/2024/WD-hr-time-3-20241107/
最新公開バージョン:
https://www.w3.org/TR/hr-time-3/
最新エディター草案:
https://w3c.github.io/hr-time/
履歴:
https://www.w3.org/standards/history/hr-time-3/
コミット履歴
テストスイート:
https://wpt.live/hr-time/
実装レポート:
https://wpt.fyi/hr-time/
編集者:
Yoav Weiss (Google LLC)
以前の編集者:
(Google LLC) - 2021年03月01日まで
(Google LLC) - 2015年01月01日まで
(Microsoft Corp.) - 2014年02月01日まで
フィードバック:
GitHub w3c/hr-time (プルリクエスト, 新しい課題, オープン課題)
ブラウザーサポート:
caniuse.com

概要

本仕様は、タイムオリジンと現在時刻をサブミリ秒精度で提供するAPIを定義します。これにより、システムクロックのズレや調整の影響を受けません。

この文書のステータス

このセクションは、公開時点での文書のステータスについて説明します。現行のW3C 公開文書および本技術レポートの最新改訂は、W3C技術レポート一覧(https://www.w3.org/TR/)で確認できます。

本文書は、Webパフォーマンス作業グループ勧告プロセスに従い、作業草案として公開したものです。

作業草案として公開されたことは、W3Cおよびそのメンバーによる承認を意味するものではありません。

本文書はドラフトであり、随時更新、差替え、廃止される可能性があります。進行中の作業以外のものとして引用することは不適切です。

本文書は、 W3C特許ポリシー の下で運営されるグループによって作成されました。 W3Cは、 グループ成果物に関連する特許開示の公開リスト を管理しています。このページでは特許開示の方法も案内しています。個人が、必須クレームを含むと考える特許を実際に知っている場合、 W3C特許ポリシー第6節に従って情報を開示する必要があります。

本文書は 2023年11月03日 W3Cプロセス文書 に従って作成されています。

1. はじめに

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

ECMAScript言語仕様[ECMA-262]では、 Date オブジェクトは1970年1月1日UTCからのミリ秒単位の時刻値を表すと定義されています。ほとんどの場合、この時刻の定義は十分であり、約285,616年間の任意の瞬間についてミリ秒精度で時刻を表すことができます。

実際には、これらの時刻の定義はクロックのずれやシステムクロックの調整の影響を受けます。時刻値は必ずしも単調増加するとは限らず、後続の値が減少したり、同じ値になることもあります。

例えば、以下のスクリプトでは、計算されたdurationが正数、負数、またはゼロとなる場合があります。

var mark_start = Date.now();
doTask(); // タスクを実行
var duration = Date.now() - mark_start;

特定のタスクにおいて、この時刻の定義では十分でない場合があります。

本仕様はDate.now() [ECMA-262]の挙動を変更することを提案しません。これは現在のカレンダー時刻の値を取得するのに有用であり、長い利用実績があります。 DOMHighResTimeStamp型、 Performance.now()メソッド、 Performance.timeOrigin属性は、 Performanceインターフェイスの一部であり、上記の課題を解決します。これらはサブミリ秒分解能で単調増加する時刻値を提供します。

補足

サブミリ秒分解能の提供は本仕様の必須要件ではありません。実装は、プライバシーやセキュリティの理由でタイマー分解能を制限し、サブミリ秒タイマーを公開しない選択をすることも可能です。サブミリ秒分解能に依存するユースケースは、その場合満たされない可能性があります。

1.1 ユースケース

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

本仕様はいくつかの機能を定義しています。安定した単調クロックに基づくタイムスタンプを、文脈をまたいで比較可能にし、サブミリ秒分解能も可能です。

パフォーマンス測定において安定した単調クロックが必要となる理由は、無関係なクロックのずれが測定値を歪めてしまい、役に立たなくなるためです。例えば、Documentへのナビゲーションやリソース取得、スクリプトの実行時間を正確に測定する際には、サブミリ秒分解能かつ単調増加するクロックが望ましいです。

文脈間でタイムスタンプを比較することは、例えばWorkerとメインスレッド間で作業を同期したり、イベントタイムラインの統一ビューを作成する際に不可欠です。

最後に、サブミリ秒タイマーの必要性は以下のユースケースに関連します。

1.2

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

開発者は、WorkerSharedWorkerなど、 異なるタイムオリジンを持つイベントも含め、アプリケーション全体のタイムラインを構築したい場合があります。そのようなイベントを同じタイムライン上に表示するには、 DOMHighResTimeStampPerformance.timeOrigin属性を使って変換できます。

// ---- worker.js -----------------------------
// 共有ワーカースクリプト
onconnect = function(e) {
  var port = e.ports[0];
  port.onmessage = function(e) {
    // ワーカーでの実行時間計測
    var task_start = performance.now();
    result = runSomeWorkerTask();
    var task_end = performance.now();
  }

  // 他のコンテキストに結果とエポック基準のタイムスタンプを送信
  port.postMessage({
    'task': 'ワーカーのタスク',
    'start_time': task_start + performance.timeOrigin,
    'end_time': task_end + performance.timeOrigin,
    'result': result
  });
}

// ---- application.js ------------------------
// ドキュメント内のタスク計測
var task_start = performance.now();
runSomeApplicationTask();
var task_end = performance.now();

// 実行時パフォーマンスデータをアップロードする開発者提供メソッド
reportEventToAnalytics({
  'task': 'ドキュメントのタスク',
  'start_time': task_start,
  'duration': task_end - task_start
});

// ワーカーのタイムスタンプをドキュメントのタイムオリジンに変換
var worker = new SharedWorker('worker.js');
worker.port.onmessage = function (event) {
  var msg = event.data;

  // エポック基準のタイムスタンプをドキュメントのタイムオリジンに変換
  msg.start_time = msg.start_time - performance.timeOrigin;
  msg.end_time = msg.end_time - performance.timeOrigin;

  reportEventToAnalytics(msg);
}

2. 時間の概念

2.1 クロック

クロックは、時間の経過を追跡し、アルゴリズムステップが実行されている 安全でない現在時刻を報告できます。 クロックには様々な種類があります。Webプラットフォーム上のすべてのクロックは、1ミリ秒のクロック時間が実世界の1ミリ秒と一致するように設計されていますが、正確に一致できない場合の扱い方が異なります。

2.2 モーメントと持続時間

クロック安全でない現在時刻は、 安全でないモーメントを返します。 時刻の粗化はこれらの安全でないモーメント粗化されたモーメントまたは単に モーメントに変換します。 安全でないモーメントモーメントは異なるクロック間では比較できません。

補足

モーメントおよび安全でないモーメントは時点を表し、直接数値として保存できません。 実装では通常、モーメントを他の固定時点からの 持続時間 として表現しますが、仕様書ではモーメント自体を扱うべきです。

持続時間は、同じクロック上の モーメント同士の距離です。どちらの端点も 安全でないモーメントであってはならず、 これにより持続時間やその差分は 9.1 クロックの分解能での懸念を軽減します。 持続時間はミリ秒、秒などで測定されます。 すべてのクロックが同じ速度でカウントしようとするため、 持続時間には関連するクロックがありません。 1つのクロック上の2つのモーメントから算出した 持続時間は、 2番目のクロック上のモーメントに加えることで、 さらに新しいモーメントを生成できます。

持続時間(duration from)aからbまで は次のアルゴリズムによって求めます:

  1. 検証abと同じ クロックによって作成されたものであること。
  2. 検証aおよびbの両方が 粗化されたモーメントであること。
  3. aからbまでの時間を 持続時間として返す。 baより前の場合は、負の 持続時間となる。

持続時間は、暗黙的に DOMHighResTimeStampとして利用できます。 持続時間をタイムスタンプに暗黙的に変換するには、 持続時間dを与え、dに含まれるミリ秒数を返します。

3. 仕様策定者向けツール

1ページ内(1つの環境設定オブジェクトの範囲)で時間を測定する場合は、settingsObject現在の相対タイムスタンプを使用します。 これはsettingsObjectタイムオリジンからsettingsObject現在の単調時刻までの持続時間として定義されます。 この値は持続時間タイムスタンプへの暗黙的変換によって JavaScriptのDOMHighResTimeStampとして直接公開できます。

UAの1回の実行内で時間を測定する場合、環境設定オブジェクトタイムオリジンが比較の基準として適切でない場合は、 モーメント環境設定オブジェクト現在の単調時刻を使って作成します。 環境設定オブジェクト settingsObject現在の単調時刻 は次の手順で求めます:

  1. unsafeMonotonicTime単調クロック安全でない現在時刻として取得する。
  2. 時刻の粗化unsafeMonotonicTimesettingsObjectクロスオリジン分離機能で呼び出し、その結果を返す。

モーメントは、モノトニッククロックから直接JavaScriptやHTTPで表現することはできません。代わりに、2つのこのようなモーメント間の持続時間を公開します。

複数回のUA実行にまたがる時間測定には、現在の粗化された壁時計時刻、または(クロスオリジン分離機能のある文脈でより高精度が必要な場合は) 環境設定オブジェクト現在の壁時計時刻を使ってモーメントを作成します。 現在の粗化された壁時計時刻は、時刻の粗化壁時計安全でない現在時刻に対して呼び出した結果です。

環境設定オブジェクト settingsObject現在の壁時計時刻 は次の手順で求めます:

  1. unsafeWallTime壁時計安全でない現在時刻として取得する。
  2. 時刻の粗化unsafeWallTimesettingsObjectクロスオリジン分離機能で呼び出し、その結果を返す。

壁時計からのモーメントを使用する際は、ユーザーが時計を前後に調整する場合があることを設計に反映してください。

壁時計からのモーメントは、Unixエポックからそのモーメントまでのミリ秒数をJavaScriptの Dateコンストラクターに渡すか、 Unixエポックからそのモーメントまでのナノ秒数を Temporal.Instant コンストラクターに渡すことで表現できます。

類似の表現をコンピューター間で送信することは避けてください。そうするとユーザーの時計のズレが漏洩し、 トラッキングベクトルとなります。 代わりに、単調クロックモーメントのように、2つのモーメント間の持続時間を送信する方法を使ってください。

3.1

DOMイベントが発生した時刻は以下のように報告できます:

  1. eventtimeStamp属性を、 this関連設定オブジェクト現在の相対タイムスタンプで初期化する。

エラーレポートの経過時間は以下で計算できます:

  1. report生成時刻settings現在の単調時刻で初期化する。

後で:

  1. dataを下記のキー/値ペアを持つマップとする:
    age
    report生成時刻context関連設定オブジェクト現在の単調時刻の差をミリ秒単位で計算し、最も近い整数に丸めたもの。
    ...

複数日間のアトリビューションレポートの有効期限は以下のように扱えます:

  1. sourceを新しいアトリビューションソース構造体とし、その項目は:
    ...
    発生時刻(source time)
    context現在の壁時計時刻
    有効期限(expiry)
    parse a duration stringvalue["expiry"]を解釈したもの

数日後:

  1. もしcontext現在の壁時計時刻sourceの発生時刻(source time)+有効期限(expiry)より小さい場合、 レポートを送信する。

4. タイムオリジン

Unixエポックは、 壁時計上で1970年1月1日 00:00:00 UTCに対応する モーメントです。

何らかの方法で通信可能な環境設定オブジェクト群ごとに、 Unixエポックの推定単調時刻があり、 これは単調クロック上の モーメントであり、以下の手順で初期化されます:

  1. wall time壁時計安全でない現在時刻として取得する。
  2. monotonic time単調クロック安全でない現在時刻として取得する。
  3. epoch timemonotonic time - (wall time - Unixエポック) とする。
  4. Unixエポックの推定単調時刻epoch timeに対して 時刻の粗化アルゴリズムを呼び出した結果で初期化する。
課題 1
上記の「何らかの通信可能なsettings-object群」はより明確に定義する必要があります。これは familiar withに類似していますが、 Workerも含みます。

パフォーマンス測定では、関連する環境設定オブジェクトの初期化の早い段階での モーメントからの 持続時間を報告します。 そのモーメントは、その設定オブジェクトの タイムオリジンに格納されます。

タイムオリジンタイムスタンプを取得するには、 グローバルオブジェクト globalを与え、次の手順を実行します。この手順は 持続時間を返します。

  1. timeOriginglobal関連設定オブジェクトタイムオリジンとする。

    補足

    Window文脈では、 この値は ナビゲーション開始時刻を表します。 WorkerServiceWorkerでは、 ワーカーが実行された時刻を表します。 [service-workers]

  2. 持続時間Unixエポックの推定単調時刻から timeOriginまでとして返す。
補足

タイムオリジンタイムスタンプを取得するで返される値は、 globalタイムオリジンが発生した Unixエポックからの時間にほぼ一致します。 ただしこれは、Date.now()をタイムオリジンで実行したときの値とは異なる場合があります。 前者はシステムやユーザーによるクロック調整、クロックのずれなどの影響を受けない 単調クロックに基づいて記録されるためです。

時刻の粗化アルゴリズムは、 あるクロック上の 安全でないモーメント timestampと、オプションの真偽値crossOriginIsolatedCapability(デフォルトfalse)を与え、以下の手順を実行します:
  1. 時間分解能を100マイクロ秒、またはより高い 実装定義値とする。
  2. crossOriginIsolatedCapabilityがtrueなら、 時間分解能を5マイクロ秒、またはより高い 実装定義値とする。
  3. 実装定義の方法で、 timestampを粗化し、分解能が時間分解能を超えないようにジッター処理も行う。
  4. timestampモーメントとして返す。
相対高分解能時刻は、 単調クロックからの 安全でないモーメント timeグローバルオブジェクト globalを与え、以下の手順で返される持続時間です:
  1. coarse timetimeglobal関連設定オブジェクトクロスオリジン分離機能時刻の粗化アルゴリズムを呼び出した結果とする。
  2. coarse timeglobalに対して 相対高分解能粗化時刻を返す。
相対高分解能粗化時刻は、 単調クロックからの モーメント coarseTimeグローバルオブジェクト globalを与え、 global関連設定オブジェクトタイムオリジンから coarseTimeまでの 持続時間を返します。

現在の高分解能時刻は、 グローバルオブジェクト current globalを与え、 安全でない共有現在時刻current global相対高分解能時刻アルゴリズムの結果を返します。

粗化された共有現在時刻は、 オプションの真偽値crossOriginIsolatedCapability(デフォルトfalse)を与え、 時刻の粗化アルゴリズムを 安全でない共有現在時刻crossOriginIsolatedCapabilityで呼び出し、その結果を返します。

安全でない共有現在時刻は、 単調クロック安全でない現在時刻を返します。

5. DOMHighResTimeStamp型定義

DOMHighResTimeStamp型は、 ミリ秒単位の持続時間を格納するために使用されます。文脈によっては、この型は 持続時間後のモーメントを表す場合があります。 例えばタイムオリジンUnixエポックなどの基準となるモーメントからの持続時間です。

WebIDLtypedef double DOMHighResTimeStamp;

DOMHighResTimeStampは、 計測が可能な精度でミリ秒単位の時刻を表すべきSHOULDであり、タイミング攻撃を防ぐ必要があります。 詳細は9.1 クロックの分解能を参照してください。

補足

DOMHighResTimeStampdouble型であり、 エポック基準の時刻(Unixエポックから モーメントまでのミリ秒数)を有限の分解能で表すことができます。 2023年のモーメントでは、その分解能は約0.2マイクロ秒です。

6. EpochTimeStamp型定義

WebIDLtypedef unsigned long long EpochTimeStamp;
補足: レガシープラットフォーム機能

EpochTimeStampは、 Unixエポックから モーメントまでのミリ秒数(整数値)を 壁時計上で表します(うるう秒は除外)。 これを利用する仕様書は、ミリ秒数の解釈方法を定義する必要があります。

7. Performanceインターフェイス

WebIDL[Exposed=(Window,Worker)]
interface Performance : EventTarget {
    DOMHighResTimeStamp now();
    readonly attribute DOMHighResTimeStamp timeOrigin;
    [Default] object toJSON();
};

7.1 now()メソッド

now()メソッドはMUST 現在の高分解能時刻により this関連グローバルオブジェクト持続時間)を与え、ミリ秒数を返さなければならない。

now() メソッドをPerformanceオブジェクトに対し、 同じタイムオリジンで呼び出した場合は、 同じ単調クロックを利用しなければならないMUSTnow()メソッドから 取得した時刻値のうち、時系列的に記録された2つの値の差分は、同じ タイムオリジンであれば 決して負になってはならないMUST

7.2 timeOrigin属性

timeOrigin属性はMUST 持続時間として タイムオリジンタイムスタンプを取得する関連グローバルオブジェクトに対して返されるミリ秒数を返さなければならない。

Performance.timeOriginで返される時刻値は 単調クロックタイムオリジンで共有される)を利用しなければならないMUST。 参照点は[ECMA-262] time 定義―詳細は9. セキュリティに関する考慮事項を参照。

7.3 toJSON()メソッド

toJSON()が呼ばれた場合は、 [WEBIDL]の default toJSON stepsを実行する。

8. WindowOrWorkerGlobalScopeミックスインへの拡張

8.1 performance属性

インターフェースミックスインWindowOrWorkerGlobalScope上の performance属性は、 グローバルオブジェクトから パフォーマンス関連の属性やメソッドへのアクセスを可能にします。

WebIDLpartial interface mixin WindowOrWorkerGlobalScope {
  [Replaceable] readonly attribute Performance performance;
};

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

9.1 クロックの分解能

測定やスケジューリング目的で正確なタイミング情報にアクセスすることは、多くのアプリケーションにとって一般的な要求事項です。 例えば、アニメーションや音声などページ上のアクティビティを調整するには、高分解能時刻へのアクセスが良好なユーザー体験を提供するために必要です。 また、測定により重要なコードコンポーネントのパフォーマンスを追跡したり、リグレッションを検出したりできます。

しかし、同じ正確なタイミング情報へのアクセスは、攻撃者によって見えないデータやアクセスできないデータを推測・推論するための悪意ある用途にも使われる可能性があります。 例えばキャッシュ攻撃、統計的フィンガープリンティングやマイクロアーキテクチャ攻撃は、プライバシー・セキュリティ上の懸念点であり、 悪意あるウェブサイトが様々なブラウザやアプリケーションの高分解能タイミングデータを利用してユーザーの区別、特定、または関連しない同一プロセスのユーザーデータを露呈する場合があります。 詳細は [CACHE-ATTACKS]、 [SPECTRE] も参照してください。

本仕様は、従来のEpochTimeStampで公開されていたミリ秒分解能よりも高精度な サブミリ秒分解能を提供するAPIを定義しています。 ただし、この新しいAPIがなくても攻撃者は繰り返し実行や統計分析によって高分解能の推定値を取得できる可能性があります。

この新APIがそのような攻撃の精度や速度を大幅に向上させないようにするため、 DOMHighResTimeStamp型の 最小分解能は攻撃を防ぐのに十分不正確であるべきです。

必要に応じて、ユーザーエージェントは時刻の粗化の処理モデルにおいて 時間分解能をより高い値に設定し、アーキテクチャやソフトウェアの制約、その他の事情による プライバシー・セキュリティの懸念に対処するべきです。

このような攻撃を軽減するために、ユーザーエージェントは必要と思われる技術を自由に導入できます。 その導入はブラウザーのアーキテクチャやユーザーのデバイス、コンテンツ、クロスオリジンデータの悪用可能性、その他現実的な事情により異なる場合があります。

こうした技術には以下が含まれます:

タイミングのサイドチャネル攻撃を完全に防ぐのは実質的に不可能です。 全ての操作が機密情報の値に依存しない時間で実行されるか、アプリケーションがタイム関連のプリミティブ(クロック、タイマー、カウンター等)から完全隔離される必要があります。 いずれもブラウザーやアプリ開発者の負担や、アプリのパフォーマンス・応答性への悪影響を考えると現実的ではありません。

補足
クロック分解能は未解決かつ発展途上の研究分野であり、全ブラウザーに適用できる業界合意や明確な勧告はありません。 議論を追うにはIssue 79を参照してください。

9.2 クロックドリフト

本仕様は、タイムオリジンのゼロ時刻のサブミリ秒分解能も提供するAPIを定義しており、 これはアプリケーションに単調クロックを公開し、すべてのブラウザーコンテキスト間で共有されていなければなりません。 単調クロックは物理時間に結びつける必要はありませんが、 [ECMA-262]の time定義を基準に設定することが推奨されます。 これはユーザーに新しいフィンガープリントエントロピーを露呈しないためであり、 例えばこの時刻はアプリケーション側で容易に取得できますが、新たな論理クロックを公開すると新情報となるためです。

ただし上記の仕組みがあっても単調クロックは 追加的なクロックドリフト分解能を提供し得ます。 今日では、アプリケーションは時刻(日時)と単調時刻(Date.now()now())を 同一コンテキスト内で複数回記録し、それらの間のドリフト(自動やユーザーによる時計調整による)を観測できます。 timeOrigin属性により、 攻撃者はタイムオリジン単調クロックによる報告値)と タイムオリジンの現在の日時推定値 (例:performance.timeOriginDate.now() - performance.now() の差分)を比較し、 長期間にわたり両クロックのドリフトを観測することが可能となります。

実際には、同様の時刻ドリフトはアプリケーションが複数回ナビゲーションすることで観測できます。 各コンテキストで論理時刻を記録し、クライアントやサーバーの時刻同期機構を使ってユーザーの時計の変化を推測できます。 同様に、TCPタイムスタンプなど下位レイヤーの仕組みでも、複数回の訪問不要でサーバー側に高分解能情報が露呈する場合があります。 したがって、このAPIで提供される情報はユーザーについて新たな、または従来は利用できなかったエントロピーを 露呈しないようにすべきです。

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

タイムオリジンの現行定義では、 Documentに対して、 ドキュメントのオリジンへリクエストが到達する前の クロスオリジンリダイレクトの合計時間を公開しています。これはクロスオリジン情報の漏洩につながりますが、 パフォーマンス指標の大きな破壊を起こさずにどう緩和するかは未決定です。

この議論を追うには、Navigation Timing Issue 160を参照してください。

11. 適合性

非規範的と明記されたセクションのほか、本仕様書中のすべての執筆ガイドライン、図、例、補足も非規範的です。 それ以外はすべて規範的です。

本書におけるMUSTおよびSHOULDというキーワードは、 BCP 14 [RFC2119] [RFC8174] で示されている通り、全て大文字で表記されている場合のみ、ここで定める意味で解釈されます。

一部の適合性要件は属性、メソッド、オブジェクトへの要件として記述されていますが、 それらはユーザーエージェントへの要件として解釈されます。

A. 索引

A.1 本仕様で定義された用語

A.2 他の仕様で定義された用語

B. IDL索引

WebIDLtypedef double DOMHighResTimeStamp;

typedef unsigned long long EpochTimeStamp;

[Exposed=(Window,Worker)]
interface Performance : EventTarget {
    DOMHighResTimeStamp now();
    readonly attribute DOMHighResTimeStamp timeOrigin;
    [Default] object toJSON();
};

partial interface mixin WindowOrWorkerGlobalScope {
  [Replaceable] readonly attribute Performance performance;
};

C. 謝辞

この文書の執筆・貢献にあたり、Arvind Jain、Angelos D. Keromytis、Boris Zbarsky、Jason Weber、Karen Anderson、Nat Duca、Philippe Le Hegaret、Ryosuke Niwa、Simha Sethumadhavan、Todd Reifsteck、Tony Gentilcore、Vasileios P. Kemerlis、Yoav Weiss、Yossef Oren 各氏に感謝します。

D. 参考文献

D.1 標準参考文献

[dom]
DOM標準. Anne van Kesteren. WHATWG. 現行標準. URL: https://dom.spec.whatwg.org/
[ECMA-262]
ECMAScript言語仕様. Ecma International. URL: https://tc39.es/ecma262/multipage/
[html]
HTML標準. Anne van Kesteren; Domenic Denicola; Dominic Farolino; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. 現行標準. URL: https://html.spec.whatwg.org/multipage/
[infra]
Infra標準. Anne van Kesteren; Domenic Denicola. WHATWG. 現行標準. URL: https://infra.spec.whatwg.org/
[RFC2119]
RFCで要件レベルを示すキーワード. S. Bradner. IETF. 1997年3月. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC8174]
RFC 2119 キーワードの大文字・小文字曖昧性. B. Leiba. IETF. 2017年5月. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc8174
[SPECTRE]
Spectre攻撃: 投機的実行の悪用. Paul Kocher; Jann Horn; Anders Fogh; Daniel Genkin; Daniel Gruss; Werner Haas; Mike Hamburg; Moritz Lipp; Stefan Mangard; Thomas Prescher; Michael Schwarz; Yuval Yarom. 2018年1月. URL: https://spectreattack.com/spectre.pdf
[Temporal]
Temporal. ECMA TC39. Stage 3提案. URL: https://tc39.es/proposal-temporal/
[WEBIDL]
Web IDL標準. Edgar Chen; Timothy Gu. WHATWG. 現行標準. URL: https://webidl.spec.whatwg.org/

D.2 参考情報

[CACHE-ATTACKS]
The Spy in the Sandbox - Practical Cache Attacks in Javascript. Yossef Oren; Vasileios P. Kemerlis; Simha Sethumadhavan; Angelos D. Keromytis. 2015年3月1日. URL: https://arxiv.org/abs/1502.07373
[reporting]
Reporting API. Douglas Creager; Ian Clelland; Mike West. W3C. 2024年8月13日. W3C作業草案. URL: https://www.w3.org/TR/reporting-1/
[service-workers]
Service Workers. Jake Archibald; Marijn Kruisselbrink. W3C. 2022年7月12日. W3C勧告候補. URL: https://www.w3.org/TR/service-workers/