バージョン 91 より前は、Chrome のタイマー解像度は、サイト分離が有効になっている場合はパソコンで 5 マイクロ秒に制限され、Android の場合は 100 マイクロ秒に制限されていました(有効ではない場合)。
バージョン 91 以降、仕様の変更に伴い、明示的なタイマー(performance.now()
、performance.timeOrigin
、DOMHighResTimestamps
を公開するその他のパフォーマンス API)の解像度をプラットフォーム間で 100 マイクロ秒に制限します。クロスオリジン分離を有効にすると、プラットフォームに関係なく、ウェブサイトの制限を 5 マイクロ秒に緩和できます。
クロスオリジン分離を有効にしてより強力な機能を実現するのが、SharedArrayBuffer
で提案された同様のアプローチです。クロスオリジン分離とは、オプトインしているオリジン以外のウェブページが他のオリジンから隔離されている状態です。
何か対処する必要がありますか?
おそらく、そうではありません。performance.now()
は、他のブラウザではかなり粗い解像度(1 ミリ秒 = 0.001 秒など)に制限されているため、とにかく現在の解像度に依存すべきではありません。
それと同時に、より正確なパフォーマンス測定などのためにタイマーの解像度を上げたい場合は、サイトをクロスオリジン分離にする必要があります。これにより、Chrome、他の Chromium ベースのブラウザ、Firefox で解像度が向上します。
タイマーはクロスオリジン分離とどのような関係がありますか?
ブラウザ ベンダーは、Spectre が発見されたとき、タイマーをより粗い解像度に制限すること(および暗黙的なタイマーとして使用できる SharedArrayBuffers の可用性)を決定することにしました。これは、Spectre や同様の投機的実行攻撃がタイマーを利用して、特定のオペレーションにかかる時間を測定し、プロセスのメモリの内容を推測するためです。
投機的実行攻撃は粗いタイマーを使用して実行できますが、高解像度タイマーを使用すると高速化できます。Chrome は、サイト分離アーキテクチャと他のメカニズムを使用してリスクを軽減し、これらの機能を再度有効にしましたが、これはパソコンのプラットフォームと Chromium ブラウザに限定されています。基盤となるブラウザ アーキテクチャに依存する API を使用することは、実際には理想的ではありません。
クロスオリジン分離は、ブラウザが隔離された環境でページを実行するための標準ベースラインとなります。ブラウザはクロスオリジン リソースを読み込まず、Spectre のリスクにさらされません。クロスオリジン分離により、任意のクロスオリジン データを読み取ることができるプロセスで公開することが安全でない高解像度タイマーや SharedArrayBuffer
などの API にページからアクセスできるようになりました。
この変更の背景について詳しくは、強力な機能のために「クロスオリジン分離」が必要な理由をご覧ください。
Linda Perez Johannessen 氏によるカバー写真(Unsplash)