1. 소개
디바이스 클래스 신호는 여러 가지 이유로 사용됩니다. 예를 들어:
-
사이트 또는 특정 컴포넌트의 라이트 버전 제공: 저사양 디바이스를 위해 사이트를 맞춤화할 때 유용합니다. 예시는 다음과 같습니다:
-
“서치 라이트(Search Lite)” 제공 - 저사양 디바이스에서 사용하는 10KB 크기의 검색 결과 페이지.
-
소셜 미디어 웹 애플리케이션에서 동영상 플레이어의 라이트 버전 제공.
-
지도 웹 애플리케이션에서 경량 타일 이미지를 제공.
-
-
메트릭 정규화: 분석에서는 디바이스 클래스에 따라 메트릭을 정규화할 수 있어야 합니다. 예를 들어, 하이엔드 디바이스에서 100ms의 긴 작업은 저사양 디바이스보다 더 심각한 문제가 될 수 있습니다.
광고된 User 및 클라이언트의 다른 특성을 기반으로 장치 식별 및 분류가 일반적으로
최적화된 콘텐츠를 선택하고 제공하는 데 사용됩니다.
이런 솔루션들은 주로 상용 디바이스 데이터베이스에 의존하는데, 이는 비용이 많이 들고 통합과 유지 관리가 어렵습니다.
이 명세서는 (클라이언트 힌트) 헤더 필드와 JavaScript API를 정의하여, 이러한 요구를 디바이스 데이터베이스 없이 디바이스의 대략적인 메모리(RAM)를 노출해 충족할 수 있도록 합니다.
2. 디바이스 메모리 값 계산
-
physicalDeviceMemory를 바이트 단위의 실제 물리 메모리 양으로 설정합니다.
-
minimumLowerBound를 구현 정의 최소 경계로 설정합니다.
-
maximumUpperBound를 구현 정의 최대 경계로 설정합니다.
-
deviceMemory를 physicalDeviceMemory / 1024.0 으로 설정합니다.
-
power를 0으로 설정합니다.
-
반복 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 클라이언트 힌트 헤더입니다.
구조화된 헤더 값으로,
item을 포함하며,
값은 소수로, 클라이언트의 대략적인 장치 메모리(RAM, 단위: GiB)를 나타냅니다.
`Sec`
헤더 필드가 메시지에 여러 번 나타날 경우, 마지막 값이 이전 값을 모두 덮어씁니다.
`Sec`
헤더 필드의 ABNF(확장된 백우스-나우르 형)는 다음과 같습니다:
Sec-CH-Device-Memory = sf-decimal
`Sec`의
값은 user
agent의 deviceMemory로 설정해야
합니다.
3.1. 클라이언트 힌트 예시
Sec- CH- Device- Memory`
HTTP 클라이언트 힌트를 수신하도록 선택하는 방법은 Accept- CH 헤더 필드나, http-equiv 속성이 지정된 동등한 HTML meta 요소를 사용하는 것입니다:
Accept-CH: Sec-CH-Device-Memory
위와 같은 서버의 선호 설정을 수신하면, 호환되는 user agent는 `Sec`
요청 헤더 필드를 통해 메모리 장치 기능을 광고하게 됩니다:
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 ;
NavigatorDeviceMemory의
deviceMemory
getter 단계는 user agent의 deviceMemory를 반환하도록 한다.
4.1. 자바스크립트 예시
웹 애플리케이션은 디바이스 메모리를 기반으로 기능을 활성화하거나 비활성화할 수 있습니다.
참고: 웹 애플리케이션은 이 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`
클라이언트 힌트 헤더와 자바스크립트 API는 HTTPS 보안 컨텍스트에서만 사용할 수 있습니다.
지문 인식 위험을 낮추기 위해, 보고되는 값은 실제 값이 아니라 1비트로 반올림됩니다. 추가적으로, 구현별 상한/하한이 보고 값에 적용됩니다. 이 경계는 시간이 지나면서 많이 쓰이는 장치 메모리 특성에 맞게 재검토되어야 합니다. 모바일 장치는 일반적으로 데스크탑이나 노트북보다 특성이 다르므로, 경계를 정할 때 장치 종류도 고려해야 합니다.
6. IANA 고려사항
이 문서는 `Sec`
HTTP 요청 헤더 필드를 정의하며, 이를 영구 메시지 헤더 필드 레지스트리([RFC3864])에 등록합니다.
6.1. Sec- CH- Device- Memory
헤더 필드
- 헤더 필드 이름
-
Sec-CH-Device-Memory
- 적용 프로토콜
-
http
- 상태
-
표준
- 작성자/변경 컨트롤러
-
IETF
- 명세 문서
7. 감사의 글
이전 편집자 Shubhie Panicker와 모든 기여자에게 기술적인 조언과 제안을 통해 명세 개선에 기여해주신 점 진심으로 감사드립니다.