デバイスメモリ API

W3C作業草案,

この文書の詳細情報
このバージョン:
https://www.w3.org/TR/2026/WD-device-memory-1-20260330/
最新版:
https://www.w3.org/TR/device-memory/
編集者草案:
https://www.w3.org/TR/device-memory/
以前のバージョン:
履歴:
https://www.w3.org/standards/history/device-memory-1/
フィードバック:
GitHub
編集者:
(Google)
(Microsoft)
前編集者:
Shubhie Panicker (Google)

概要

本書では、HTTPクライアントヒントヘッダーとJavaScript APIを定義し、デバイスメモリ(デバイスRAM)の能力をウェブアプリが取得できるようにし、デバイスのメモリ制約に応じてコンテンツをカスタマイズすることを可能にします。

この文書のステータス

このセクションは、公開時点でのこの文書のステータスを説明します。 現在のW3C刊行物一覧とこの技術レポートの最新改訂は W3C標準・草案インデックスにて参照できます。

本文書はWeb Performance Working Group によって 作業草案として 勧告トラックを用いて発行されました。 作業草案として公開されたことは、 W3Cおよびその会員による承認を意味しません。

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

GitHub Issuesでこの仕様議論を推奨します。

本ドキュメントは 2025年8月18日付W3Cプロセス文書 に従います。

本書は W3C特許ポリシーの下で活動するグループにより作成されました。 W3Cは 本グループ成果に関連する特許開示公開リスト を維持しています。 特許開示方法も同ページに記載されています。 本人が実際に必須クレームを含む特許を知る場合、 W3C特許ポリシー第6節に従い情報開示が必要です。

1. はじめに

デバイスクラスのシグナルは、いくつかの理由で使用されます:

広告されたUser-Agentやクライアントの他の特性に基づくデバイスの識別および分類は、最適化されたコンテンツを選択・提供するためによく使用されています。こうしたソリューションはしばしば商用デバイスデータベースに依存しており、これらは高価で、統合が難しく、保守も困難です。

この仕様では、(クライアントヒント)ヘッダーフィールドおよびJavaScript APIを定義し、デバイスデータベースを使うことなく、おおよそのデバイスメモリ(RAM)を公開できるようにします。

2. デバイスメモリ値の計算

ユーザーエージェントdeviceMemoryは、以下の手順で計算されます:
  1. physicalDeviceMemory をバイト単位の物理メモリ容量とします。

  2. minimumLowerBound実装依存な最小下限とします。

  3. maximumUpperBound実装依存な最大上限とします。

  4. deviceMemoryphysicalDeviceMemory / 1024.0 とします。

  5. power を0とします。

  6. While deviceMemory が1より大きい場合:

    1. deviceMemory をビット右シフト1回行う。

    2. power を1増やす。

  7. lowerBound を 2のpower乗とします。

  8. upperBound を 2の|power + 1|乗とします。

  9. もし physicalDeviceMemorylowerBoundupperBoundphysicalDeviceMemory であれば、deviceMemory の値は lowerBound とします。

  10. それ以外の場合、deviceMemory の値は upperBound とします。

  11. もし deviceMemory < minimumLowerBound であれば、deviceMemoryminimumLowerBound とします。

  12. もし deviceMemory > maximumUpperBound であれば、deviceMemorymaximumUpperBound とします。

  13. deviceMemory を返します。

このアルゴリズムには、実装依存な上限および下限を設けることができます。上限と下限の範囲には、ほとんどのデバイスメモリ値を含めますが、指紋取得を緩和するためにまれなデバイスメモリ値は除外されるべきです。実装によってはこれらの範囲を時間とともに調整する場合があります。デバイスの種類によってこれらの範囲は異なる場合があります。

3. Sec-CH-Device-Memory(クライアントヒント)ヘッダーフィールド

Sec-CH-Device-Memory ヘッダーフィールドはHTTPクライアントヒントヘッダーです。 これは構造化ヘッダー値であり、クライアントのおおよそのデバイスメモリ(RAM)の量(GiB単位)を示す10進数アイテムです。

`Sec-CH-Device-Memory` ヘッダーフィールドが1つのメッセージに複数回現れた場合、最後の値がそれ以前のすべてを上書きします。

`Sec-CH-Device-Memory` ヘッダーフィールドのABNF(拡張バッカスナウア記法)構文は次の通りです:

Sec-CH-Device-Memory = sf-decimal

`Sec-CH-Device-Memory` の値は、ユーザーエージェントdeviceMemoryに設定するべきです。

3.1. クライアントヒントの例

サーバーは `Sec-CH-Device-Memory` HTTPクライアントヒントAccept-CH ヘッダーやhttp-equiv属性を持つHTMLメタ要素などで受信するようオプトインできます:
Accept-CH: Sec-CH-Device-Memory

その後、サーバーから上記の好みを受信すると、対応するユーザーエージェントは `Sec-CH-Device-Memory` リクエストヘッダーフィールドを通じてメモリ能力を通知します:

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;

NavigatorDeviceMemorydeviceMemory ゲッターの手順は、ユーザーエージェントdeviceMemoryを返すことである。

4.1. JavaScriptの例

ウェブアプリケーションは、デバイスメモリに応じて機能を有効化または無効化できます。

注記: ウェブアプリケーションは、このAPIに対応していないブラウザの扱いについても考慮してください。たとえば、デフォルトで有効化または無効化しておくことなど。

const mem = navigator.deviceMemory;

// 低メモリデバイスと判明している場合に機能を無効化する
if (mem && mem < 2) {
    // より良い体験を提供するために機能を無効化
}

// または、デバイスメモリが提供されていないか、または必要最低量より多い場合にのみ機能を有効化する
if (!mem || mem > 4) {
    // より良い体験を提供するために機能を有効化
}
RUMソリューションは navigator.deviceMemory API を使って端末メモリを取得し、パフォーマンスビーコンに追加情報として含めることで、データの説明やセグメント分けに役立てることができます。
const mem = navigator.deviceMemory;
const analyticsData = {
    memory: mem;
    ... other metrics
}
navigator.sendBeacon("/endpoint", analyticsData);

5. セキュリティとプライバシーの考慮事項

`Sec-CH-Device-Memory` クライアントヒントヘッダーおよびJavaScript APIは、HTTPSセキュアコンテキストのみで利用可能です。

フィンガープリントのリスクを減らすために、報告される値は正確な値ではなく、1ビットの精度で丸められます。また、実装依存の上限・下限値が設けられています。これらの範囲は、一般的なデバイスメモリの特性が変化するにつれて定期的に見直すべきです。デバイスの種類によって異なる特性を持つため、これらの範囲を定義する際には端末タイプも考慮してください(モバイルとデスクトップ/ノートPCなど)。

6. IANAに関する事項

本書は `Sec-CH-Device-Memory` HTTPリクエストヘッダーフィールドを定義し、それらをパーマネントメッセージヘッダーフィールドレジストリ([RFC3864])に登録します。

6.1. Sec-CH-Device-Memory ヘッダーフィールド

ヘッダーフィールド名

Sec-CH-Device-Memory

該当プロトコル

http

ステータス

standard

著者/変更管理者

IETF

仕様書

本仕様書(§ 3 Sec-CH-Device-Memory(クライアントヒント)ヘッダーフィールド

7. 謝辞

前任編集者Shubhie Panicker氏およびすべてのコントリビューターの技術的な助言と提案に感謝します。これにより本仕様が改善されました。

適合性

文書慣例

適合性要件は記述的な規定とRFC 2119用語の組合せで示されます。 本仕様の規範部分における "MUST"、"MUST NOT"、"REQUIRED"、"SHALL"、"SHALL NOT"、"SHOULD"、"SHOULD NOT"、"RECOMMENDED"、"MAY"、"OPTIONAL" などの単語は RFC 2119 の定義通りに解釈されます。 ただし可読性のため、これらの単語は本仕様ではすべて大文字表記ではありません。

明示的に非規範的、例、または注記と記載された部分を除き、本仕様のテキストはすべて規範的です。 [RFC2119]

本仕様の例は "for example" という語や、規範テキストから区分する class="example" で示されています(下記参照):

これは参考例の一例です。

参考注記は "Note" で始まり、 class="note" で規範テキストから区分されます(下記参照):

参考:これは説明用の参考注記です。

適合アルゴリズム

アルゴリズムとして命令形で記載された適合要件( "strip any leading space characters" や "return false and abort these steps" など)は 該当するキーワード("must"、"should"、"may"など)に基づき解釈してください。

アルゴリズムや手順として記述された適合要件は、同等の結果が得られるなら実装方法は任意です。 本仕様に記載されたアルゴリズムは理解しやすさを優先しており、必ずしもパフォーマンスを意図したものではありません。 実装者には最適化を推奨します。

索引

本仕様で定義された用語

参照により定義された用語

参考文献

規範的参考文献

[HTML]
Anne van Kesteren ほか。HTML Standard。 Living Standard。URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren、Domenic Denicola。Infra Standard。Living Standard。URL: https://infra.spec.whatwg.org/
[RFC2119]
S. Bradner。RFCで要求レベルを示すためのキーワード。1997年3月。Best Current Practice。URL: https://datatracker.ietf.org/doc/html/rfc2119
[RFC8941]
M. Nottingham、P-H. Kamp。HTTPのための構造化フィールド値。2021年2月。Proposed Standard。URL: https://httpwg.org/specs/rfc8941.html
[RFC8942]
I. Grigorik、Y. Weiss。HTTPクライアントヒント。 2021年2月。Experimental。URL: https://www.rfc-editor.org/rfc/rfc8942
[WEBIDL]
Edgar Chen、Timothy Gu。Web IDL Standard。Living Standard。URL: https://webidl.spec.whatwg.org/

参考資料

[RFC3864]
G. Klyne; M. Nottingham; J. Mogul. Registration Procedures for Message Header Fields. 2004年9月. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc3864

IDL索引

[
    SecureContext,
    Exposed=(Window,Worker)
] interface mixin NavigatorDeviceMemory {
    readonly attribute double deviceMemory;
};

Navigator includes NavigatorDeviceMemory;
WorkerNavigator includes NavigatorDeviceMemory;