1. はじめに
デバイスクラスのシグナルは、いくつかの理由で使用されます:
-
サイトや特定コンポーネントの軽量バージョン配信:これは、ローエンドデバイス向けにサイトをカスタマイズするのに役立ちます。例:
-
「search lite」― ローエンドデバイス向けの10KBの検索結果ページを配信する。
-
ソーシャルメディアウェブアプリケーションで軽量版動画プレイヤーを配信する。
-
地図ウェブアプリケーションで軽量なタイル画像を配信する。
-
-
メトリクスの正規化:分析において、デバイスクラスに対してメトリクスを正規化できる必要があります。例えば、ハイエンドデバイスでの100msの長いタスクは、ローエンドデバイスに比べてより深刻な問題です。
広告されたUserやクライアントの他の特性に基づくデバイスの識別および分類は、最適化されたコンテンツを選択・提供するためによく使用されています。こうしたソリューションはしばしば商用デバイスデータベースに依存しており、これらは高価で、統合が難しく、保守も困難です。
この仕様では、(クライアントヒント)ヘッダーフィールドおよびJavaScript APIを定義し、デバイスデータベースを使うことなく、おおよそのデバイスメモリ(RAM)を公開できるようにします。
2. デバイスメモリ値の計算
-
physicalDeviceMemory をバイト単位の物理メモリ容量とします。
-
minimumLowerBound を実装依存な最小下限とします。
-
maximumUpperBound を実装依存な最大上限とします。
-
deviceMemory を physicalDeviceMemory / 1024.0 とします。
-
power を0とします。
-
While deviceMemory が1より大きい場合:
-
deviceMemory をビット右シフト1回行う。
-
power を1増やす。
-
-
lowerBound を 2のpower乗とします。
-
upperBound を 2の|power + 1|乗とします。
-
もし physicalDeviceMemory − lowerBound ≤ upperBound − physicalDeviceMemory であれば、deviceMemory の値は lowerBound とします。
-
それ以外の場合、deviceMemory の値は upperBound とします。
-
もし deviceMemory < minimumLowerBound であれば、deviceMemory を minimumLowerBound とします。
-
もし deviceMemory > maximumUpperBound であれば、deviceMemory を maximumUpperBound とします。
-
deviceMemory を返します。
このアルゴリズムには、実装依存な上限および下限を設けることができます。上限と下限の範囲には、ほとんどのデバイスメモリ値を含めますが、指紋取得を緩和するためにまれなデバイスメモリ値は除外されるべきです。実装によってはこれらの範囲を時間とともに調整する場合があります。デバイスの種類によってこれらの範囲は異なる場合があります。
3.
Sec- CH- Device- Memory(クライアントヒント)ヘッダーフィールド
Sec ヘッダーフィールドはHTTPクライアントヒントヘッダーです。
これは構造化ヘッダー値であり、クライアントのおおよそのデバイスメモリ(RAM)の量(GiB単位)を示す10進数のアイテムです。
`Sec`
ヘッダーフィールドが1つのメッセージに複数回現れた場合、最後の値がそれ以前のすべてを上書きします。
`Sec`
ヘッダーフィールドのABNF(拡張バッカスナウア記法)構文は次の通りです:
Sec-CH-Device-Memory = sf-decimal
`Sec`
の値は、ユーザーエージェントのdeviceMemoryに設定するべきです。
3.1. クライアントヒントの例
Sec- CH- Device- Memory`
HTTPクライアントヒントを Accept- CH
ヘッダーやhttp-equiv属性を持つHTMLメタ要素などで受信するようオプトインできます:
Accept-CH: Sec-CH-Device-Memory
その後、サーバーから上記の好みを受信すると、対応するユーザーエージェントは `Sec`
リクエストヘッダーフィールドを通じてメモリ能力を通知します:
GET /example HTTP / 1.1 Sec-CH-Device-Memory : 8 ...
4. デバイスメモリ JavaScript API
[
SecureContext ,
Exposed =(Window ,Worker )
] interface mixin NavigatorDeviceMemory {
readonly attribute double deviceMemory ;
};
Navigator includes NavigatorDeviceMemory ;
WorkerNavigator includes NavigatorDeviceMemory ;
NavigatorDeviceMemory
の
deviceMemory
ゲッターの手順は、ユーザーエージェントのdeviceMemoryを返すことである。
4.1. JavaScriptの例
ウェブアプリケーションは、デバイスメモリに応じて機能を有効化または無効化できます。
注記: ウェブアプリケーションは、このAPIに対応していないブラウザの扱いについても考慮してください。たとえば、デフォルトで有効化または無効化しておくことなど。
const mem= navigator. deviceMemory; // 低メモリデバイスと判明している場合に機能を無効化する if ( mem&& mem< 2 ) { // より良い体験を提供するために機能を無効化 } // または、デバイスメモリが提供されていないか、または必要最低量より多い場合にのみ機能を有効化する if ( ! mem|| mem> 4 ) { // より良い体験を提供するために機能を有効化 }
navigator. deviceMemory API
を使って端末メモリを取得し、パフォーマンスビーコンに追加情報として含めることで、データの説明やセグメント分けに役立てることができます。
const mem= navigator. deviceMemory; const analyticsData= { memory: mem; ... other metrics} navigator. sendBeacon( "/endpoint" , analyticsData);
5. セキュリティとプライバシーの考慮事項
`Sec`
クライアントヒントヘッダーおよびJavaScript APIは、HTTPSセキュアコンテキストのみで利用可能です。
フィンガープリントのリスクを減らすために、報告される値は正確な値ではなく、1ビットの精度で丸められます。また、実装依存の上限・下限値が設けられています。これらの範囲は、一般的なデバイスメモリの特性が変化するにつれて定期的に見直すべきです。デバイスの種類によって異なる特性を持つため、これらの範囲を定義する際には端末タイプも考慮してください(モバイルとデスクトップ/ノートPCなど)。
6. IANAに関する事項
本書は `Sec`
HTTPリクエストヘッダーフィールドを定義し、それらをパーマネントメッセージヘッダーフィールドレジストリ([RFC3864])に登録します。
6.1. Sec- CH- Device- Memory
ヘッダーフィールド
- ヘッダーフィールド名
-
Sec-CH-Device-Memory
- 該当プロトコル
-
http
- ステータス
-
standard
- 著者/変更管理者
-
IETF
- 仕様書
7. 謝辞
前任編集者Shubhie Panicker氏およびすべてのコントリビューターの技術的な助言と提案に感謝します。これにより本仕様が改善されました。