디바이스 메모리 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 클라이언트 힌트 헤더와 자바스크립트 API를 정의하여 웹 앱이 디바이스 메모리(RAM) 제한에 따라 콘텐츠를 맞춤화할 수 있도록 디바이스의 메모리(램) 기능을 노출합니다.

이 문서의 상태

이 섹션은 문서가 발행되는 시점에서의 상태를 설명합니다. 현재 W3C 발행물 목록과 이 기술 보고서의 최신 개정본은 W3C 표준 및 드래프트 색인에서 확인할 수 있습니다.

이 문서는 Web Performance Working Group에서 워킹 드래프트Recommendation track 방식을 사용해 발행되었습니다. 워킹 드래프트로의 발행은 W3C와 그 회원들의 지지를 의미하지 않습니다.

이 문서는 초안이며 언제든지 업데이트, 교체, 또는 폐기될 수 있습니다. 이 문서를 진행 중인 작업 외의 용도로 인용하는 것은 부적절합니다.

GitHub Issues에서 명세에 대한 논의가 권장됩니다.

이 문서는 2025년 8월 18일 W3C 프로세스 문서의 규정을 따릅니다.

이 문서는 W3C 특허 정책에 따라 운영되는 그룹에서 작성되었습니다. W3C는 그룹의 산출물과 관련된 공개 특허 공개 목록을 유지하며, 해당 페이지에는 특허 공개 방법에 대한 안내도 포함되어 있습니다. 어떤 개인이 필수 특허 청구가 있다고 믿는 특허에 대해 실제 지식을 가질 경우, W3C 특허 정책 6절에 따라 그 정보를 공개해야 합니다.

1. 소개

디바이스 클래스 신호는 여러 가지 이유로 사용됩니다. 예를 들어:

광고된 User-Agent 및 클라이언트의 다른 특성을 기반으로 장치 식별 및 분류가 일반적으로 최적화된 콘텐츠를 선택하고 제공하는 데 사용됩니다. 이런 솔루션들은 주로 상용 디바이스 데이터베이스에 의존하는데, 이는 비용이 많이 들고 통합과 유지 관리가 어렵습니다.

이 명세서는 (클라이언트 힌트) 헤더 필드JavaScript API를 정의하여, 이러한 요구를 디바이스 데이터베이스 없이 디바이스의 대략적인 메모리(RAM)를 노출해 충족할 수 있도록 합니다.

2. 디바이스 메모리 값 계산

user agentdeviceMemory는 다음 단계로 계산됩니다:
  1. physicalDeviceMemory를 바이트 단위의 실제 물리 메모리 양으로 설정합니다.

  2. minimumLowerBound구현 정의 최소 경계로 설정합니다.

  3. maximumUpperBound구현 정의 최대 경계로 설정합니다.

  4. deviceMemoryphysicalDeviceMemory / 1024.0 으로 설정합니다.

  5. power를 0으로 설정합니다.

  6. 반복 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 클라이언트 힌트 헤더입니다. 구조화된 헤더 값으로, item을 포함하며, 값은 소수로, 클라이언트의 대략적인 장치 메모리(RAM, 단위: GiB)를 나타냅니다.

`Sec-CH-Device-Memory` 헤더 필드가 메시지에 여러 번 나타날 경우, 마지막 값이 이전 값을 모두 덮어씁니다.

`Sec-CH-Device-Memory` 헤더 필드의 ABNF(확장된 백우스-나우르 형)는 다음과 같습니다:

Sec-CH-Device-Memory = sf-decimal

`Sec-CH-Device-Memory`의 값은 user agentdeviceMemory로 설정해야 합니다.

3.1. 클라이언트 힌트 예시

서버가 `Sec-CH-Device-Memory` HTTP 클라이언트 힌트를 수신하도록 선택하는 방법은 Accept-CH 헤더 필드나, http-equiv 속성이 지정된 동등한 HTML meta 요소를 사용하는 것입니다:
Accept-CH: Sec-CH-Device-Memory

위와 같은 서버의 선호 설정을 수신하면, 호환되는 user agent는 `Sec-CH-Device-Memory` 요청 헤더 필드를 통해 메모리 장치 기능을 광고하게 됩니다:

GET /example HTTP/1.1
Sec-CH-Device-Memory: 8
...

4. 디바이스 메모리 자바스크립트 API

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

Navigator includes NavigatorDeviceMemory;
WorkerNavigator includes NavigatorDeviceMemory;

NavigatorDeviceMemorydeviceMemory getter 단계는 user agentdeviceMemory를 반환하도록 한다.

4.1. 자바스크립트 예시

웹 애플리케이션은 디바이스 메모리를 기반으로 기능을 활성화하거나 비활성화할 수 있습니다.

참고: 웹 애플리케이션은 이 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` 클라이언트 힌트 헤더와 자바스크립트 API는 HTTPS 보안 컨텍스트에서만 사용할 수 있습니다.

지문 인식 위험을 낮추기 위해, 보고되는 값은 실제 값이 아니라 1비트로 반올림됩니다. 추가적으로, 구현별 상한/하한이 보고 값에 적용됩니다. 이 경계는 시간이 지나면서 많이 쓰이는 장치 메모리 특성에 맞게 재검토되어야 합니다. 모바일 장치는 일반적으로 데스크탑이나 노트북보다 특성이 다르므로, 경계를 정할 때 장치 종류도 고려해야 합니다.

6. IANA 고려사항

이 문서는 `Sec-CH-Device-Memory` HTTP 요청 헤더 필드를 정의하며, 이를 영구 메시지 헤더 필드 레지스트리([RFC3864])에 등록합니다.

6.1. Sec-CH-Device-Memory 헤더 필드

헤더 필드 이름

Sec-CH-Device-Memory

적용 프로토콜

http

상태

표준

작성자/변경 컨트롤러

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"로 규범 텍스트와 분리되어 안내합니다:

이것은 참고용 예시입니다.

참고용 노트는 “참고”로 시작하여, class="note"로 규범 텍스트와 구분합니다:

참고, 이것은 참고용 노트입니다.

호환 알고리즘

알고리즘에서 명령형 서술("선행 공백 문자 모두 제거"나 "false를 반환하고 이 단계 중단" 등)은, 해당 알고리즘의 도입부에서 사용된 키워드("must", "should", "may" 등) 의미대로 해석해야 합니다.

알고리즘 또는 구체 단계로 표기된 적합성 요구사항은 어떠한 방식으로 구현해도 결과가 동일하기만 하면 됩니다. 이 명세서의 알고리즘은 이해하기 쉽게 작성된 것이며 성능을 목적으로 하진 않았습니다. 구현자는 다양한 수준에서 최적화를 권장합니다.

색인

이 명세서에 정의된 용어

참조로 정의된 용어

참고문헌

표준 참고문헌

[HTML]
Anne van Kesteren; 외. HTML 표준. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra 표준. 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 표준. Living Standard. URL: https://webidl.spec.whatwg.org/

참고용 참고문헌

[RFC3864]
G. Klyne; M. Nottingham; J. Mogul. Registration Procedures for Message Header Fields. September 2004. 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;