컴퓨팅 압력 레벨 1

W3C 후보 권고안 초안

이 문서에 대한 자세한 정보
이 버전:
https://www.w3.org/TR/2026/CRD-compute-pressure-20260514/
최신 게시 버전:
https://www.w3.org/TR/compute-pressure/
최신 편집자 초안:
https://w3c.github.io/compute-pressure/
이력:
https://www.w3.org/standards/history/compute-pressure/
커밋 이력
테스트 모음:
https://github.com/web-platform-tests/wpt/labels/compute-pressure
구현 보고서:
https://wpt.fyi/results/compute-pressure
편집자:
Kenneth Rohde Christiansen (Intel Corporation)
Arnaud Mandy (Intel Corporation)
이전 편집자:
Raphael Kubo da Costa (Intel Corporation)
피드백:
GitHub w3c/compute-pressure (풀 리퀘스트, 새 이슈, 열린 이슈)

초록

컴퓨팅 압력 API는 웹사이트가 대상 기기의 CPU 압력 변화에 대응할 수 있는 방법을 제공하여, 웹사이트가 향상된 사용자 경험을 위해 리소스를 절충할 수 있도록 한다.

이 문서의 상태

이 절에서는 이 문서가 발행된 시점의 상태를 설명한다. 현재 W3C 간행물 목록과 이 기술 보고서의 최신 개정판은 다음 W3C 표준 및 초안 색인에서 확인할 수 있다.

이 명세는 Chromium 기반 브라우저에 구현되어 있다. WebKit은 이 명세에 반대하는 입장을 공개했다. Mozilla의 입장은 보류 중이다.

이 명세가 CR 단계를 벗어나려면, 이 명세에 정의된 모든 기능에 대해 독립적인 구현이 최소 2개 이상 구현 보고서에 문서화되어야 한다.

이 문서는 기기 및 센서 워킹 그룹이 후보 권고안 초안으로 발행했으며, 권고안 트랙을 사용했다.

후보 권고안으로 발행되었다고 해서 W3C와 그 회원사가 이를 지지한다는 의미는 아니다. 후보 권고안 초안은 워킹 그룹이 후속 후보 권고안 스냅숏에 포함하려는 이전 후보 권고안 이후의 변경 사항을 통합한다.

이 문서는 초안이며 언제든지 다른 문서에 의해 업데이트되거나 대체되거나 폐기될 수 있다. 진행 중인 작업 이외의 것으로 이 문서를 인용하는 것은 적절하지 않다.

이 문서는 한 그룹이 작성했으며, 이 그룹은 다음 정책에 따라 운영된다: W3C 특허 정책. W3C모든 특허 공개의 공개 목록을 그룹의 결과물과 관련하여 관리하며, 해당 페이지에는 특허 공개 지침도 포함되어 있다. 특허에 대해 실제로 알고 있는 개인이 그 특허에 필수 청구항이 포함되어 있다고 판단한다면 다음에 따라 정보를 공개해야 한다. W3C 특허 정책 제6절.

이 문서에는 2025년 8월 18일 W3C 절차 문서가 적용된다.

1. 서론

이 절은 비규범적이다.

현대 애플리케이션은 현대적이고 만족스러운 사용자 경험을 제공하기 위해 시스템의 컴퓨팅 리소스를 완전히 활용할 때의 절충점과 이점 사이에서 균형을 유지해야 하는 경우가 많다.

예를 들어 많은 애플리케이션은 다양한 수준의 정교함으로 비디오 효과를 렌더링할 수 있다. 이러한 애플리케이션은 최상의 사용자 경험을 제공하는 동시에 사용자의 기기가 높은 압력 상태에 도달하지 않도록 하는 것을 목표로 한다.

처리 장치의 사용률이 100%에 근접하거나 자주 도달하면 서로 다른 태스크가 처리 시간을 확보하려고 경쟁하므로 좋지 않은 사용자 경험으로 이어질 수 있다. 이로 인해 속도가 느려질 수 있으며, 특히 입력 지연이 발생할 때 두드러진다. 또한 사용률이 장시간 100%에 근접하면 지속적인 부스트로 인해 처리 장치가 뜨거워질 수 있으며, 이는 스로틀링으로 이어져 사용자 경험을 더욱 악화할 수 있다.

열 제한으로 인해 많은 스마트폰, 태블릿 및 노트북은 만지기 불편할 정도로 뜨거워질 수 있다. 노트북과 데스크톱의 팬 소음은 대화를 방해하거나 사용자의 집중력을 저해할 정도로 커질 수 있다.

높은 압력 상태의 기기는 운영 체제가 사용자가 기다리는 태스크를 진행하는 스레드를 스케줄링하지 못할 수 있으므로 응답하지 않는 것처럼 보이는 경우가 많다. 다음도 참조한다. 사용 사례.

2. 기능 감지에 관한 참고 사항

이 절은 비규범적이다.

기능 감지는 확립된 웹 개발 모범 사례이다. 이 주제에 관한 자료는 온라인과 오프라인 모두에 풍부하며, 이 절의 목적은 이를 더 논의하는 것이 아니라 하드웨어 종속 기능을 감지하는 맥락에서 살펴보는 것이다.

다음 기능 감지 예제를 살펴보자:

참고

3. 개념

이 명세는 다음 개념을 정의한다:

3.1 처리 장치

컴퓨팅 기기는 중앙 처리 장치(CPU), 그래픽 처리 장치(GPU) 및 수많은 특수 처리 장치와 같은 매우 다양한 장치로 구성된다. 머신 러닝이나 컴퓨터 비전과 같은 특정 작업을 가속하도록 설계된 후자의 처리 장치는 점점 보편화되고 있다.

3.2 압력 소스

이 명세는 현재 유효한 소스 유형을 CPU라고도 하는 중앙 처리 장치로 정의한다. 이 명세의 향후 레벨에서는 선택적으로 추가 소스 유형을 도입할 수 있다.

PressureSource 열거형은 유효한 소스 유형을 나타낸다:

참고

3.3 샘플링 및 보고 빈도

요청된 샘플링 간격은 하드웨어에서 얻을 샘플 사이의 원하는 간격을 나타내며, 밀리초 단위로 표현된다.

간격과 빈도는 서로 역수 관계이므로 요청된 샘플링 간격은 1000을 요청된 샘플링 간격 값으로 나누어 헤르츠(초당 주기 수) 단위의 요청된 샘플링 빈도로도 표현할 수 있다.

사용자 에이전트가 기반 플랫폼에서 텔레메트리 판독값을 얻는 빈도를 플랫폼 수집기샘플링 빈도로 정의하며, 이는 압력 관찰자의 요청된 샘플링 빈도와 다를 수 있다. 이 빈도는 헤르츠(초당 주기 수)로 측정된다.

압력 관찰자의 보고 빈도데이터 수집 단계를 실행하는 빈도이며, 샘플링 빈도를 절대 초과하지 않는다.

요청된 샘플링 빈도가 기반 플랫폼과 사용자 에이전트가 지원하거나 허용하는 샘플링 빈도의 상한 또는 하한을 벗어나면 샘플링 빈도요청된 샘플링 빈도와 달라진다.

이 명세는 다음에 설명된 대로 빈도를 추가로 난독화한다. 11.2.2 빈도 난독화.

사용자가 샘플링 빈도를 요청하지 않은 경우 샘플링 빈도구현 정의이다.

참고

4. 플랫폼 기본 요소

압력 소스는 하드웨어 카운터 또는 기반 프레임워크에 대한 추상적인 구현 정의 인터페이스로, PressureSource에서 정의한 소스 유형에 대한 텔레메트리 데이터를 제공한다. 압력 소스는 추가 소스의 데이터가 더 정확한 결과를 제공한다면 해당 데이터와 데이터 융합을 사용할 수 있다.

압력 소스에서 제공한 텔레메트리 데이터는 이 명세에서 다음 구조체로 표현되는 압력 소스 샘플이다. 이 구조체는 다음 항목으로 구성된다:

압력 소스에는 연관된 최신 샘플이 있으며, 이는 압력 소스 샘플 또는 null이다. 초기값은 null이다.

플랫폼 수집기압력 소스에서 텔레메트리 샘플을 얻고, 이를 압력 상태로 변환하여 사용자 에이전트에 제공하는 추상 인터페이스이다.

플랫폼 수집기에는 다음과 같은 연관 데이터가 있다:

압력 소스에서 제공하고 최신 샘플데이터에 저장한 텔레메트리 데이터의 형식은 구현 정의이며, 플랫폼 수집기가 이를 압력 상태로 변환하는 과정도 구현 정의이다.

이 명세의 목적상 플랫폼 수집기의 범위는 플랫폼 수집기 매핑을 통해 전역 객체로 지정된다.

자동화를 위해 플랫폼 수집기에는 가상 압력 소스에 연결하여 시뮬레이션된 데이터조정된 압력 상태로 변환해야 하는 원시 플랫폼 데이터 대신 압력 상태로 사용하는 기능이 있어야 한다.

텔레메트리 데이터 수집에는 하드웨어 카운터 폴링이 수반되는 경우가 많으므로 비용이 들며, 데이터를 관찰하는 주체가 없다면 수행해서는 안 된다. 자세한 내용은 10.5 수명 주기 및 가비지 컬렉션을 참조한다.

플랫폼 수집기는 특정 빈도로 데이터를 샘플링한다. 사용자 에이전트는 개인정보 보호를 위해 가능한 경우 이 빈도를 수정하거나 특정 판독값을 무시하고 융합할 수 있다.

5. 사용자 알림

다음 사항을 권고한다: 사용자 에이전트는 압력 관찰자가 활성 상태일 때 이를 사용자에게 알리는 사용자 표시 알림을 제공하고, 진행 중인 작업을 차단하거나 알림을 간단히 닫을 수 있는 수단도 제공한다.

6. 정책 제어

컴퓨팅 압력 API는 "compute-pressure" 토큰으로 식별되는 정책 제어 기능을 정의한다. 해당 기능의 기본 허용 목록'self'이다.

워커(전용 및 공유)는 자신을 소유한 문서에 설정된 권한 정책을 따른다.

공유 워커는 동일 출처의 다른 문서에서도 가져올 수 있으므로 여러 소유 문서를 갖는 경우가 많다. 이 경우 모든 소유 문서는 이 명세에서 정의한 정책 제어 기능사용하도록 허용되어야 한다.

전용 워커는 다른 워커에서 생성할 수 있으며, 이 경우 소유자 체인의 상위에 있는 첫 번째 소유 문서 또는 공유 워커의 경우 첫 번째 소유 문서들의 권한 정책을 사용한다.

참고
참고

7. 내부 슬롯 정의

전역 객체에는 다음이 있다:

등록된 관찰자관찰자(PressureObserver 객체)로 구성된다.

사용자 에이전트에는 다음이 있다:

생성된 PressureObserver 객체에는 다음 내부 슬롯이 있다:

빈도 난독화 완화를 위해 생성된 PressureObserver 객체에는 다음 내부 슬롯이 추가로 있다:

8. 압력 상태

압력 상태는 웹사이트가 품질이나 서비스 또는 사용자 경험의 저하를 최소화하면서 컴퓨팅 및 시스템 압력의 변화에 대응할 수 있도록 하는 유용한 상태의 최소 집합을 나타낸다.

WebIDLenum PressureState { "nominal", "fair", "serious", "critical" };

PressureState 열거형은 다음 상태로 구성된 압력 상태를 나타낸다:

참고

9. 기여 요인

기여 요인은 현재 압력 상태에 기여하는 기반 하드웨어 및 운영 체제 메트릭을 나타내며 구현 정의일 수 있다.

조정된 압력 상태압력 상태이며, 구현 정의 알고리즘이 소스 유형과 기타 구현 정의기여 요인 데이터를 입력으로 사용하여 결정한다. 이 알고리즘은 반드시 결정론적이지 않아야 하며 보정 방해 완화의 효과를 보장해야 한다.

기여 요인의 변화가 상당함 단계는 다음과 같다:

  1. 현재 압력 상태에 기여하는 구현 정의 저수준 하드웨어 메트릭이 각 메트릭별로 현재 구현 정의 임곗값보다 낮아지거나 이를 초과하면 압력 상태에 대해 true를 반환한다.
  2. false를 반환한다.
참고

10. 압력 관찰자

컴퓨팅 압력 API를 사용하면 개발자가 CPU와 같은 시스템 리소스의 압력을 파악할 수 있다.
WebIDLcallback PressureUpdateCallback = undefined (
  sequence<PressureRecord> changes,
  PressureObserver observer
);
이 콜백은 압력 상태가 변경되면 호출된다.

10.2 PressureObserver 객체

PressureObserver를 사용하여 압력 상태의 변화를 관찰할 수 있다.

WebIDL[Exposed=(DedicatedWorker,SharedWorker,Window), SecureContext]
interface PressureObserver {
  constructor(PressureUpdateCallback callback);

  Promise<undefined> observe(PressureSource source, optional PressureObserverOptions options = {});
  undefined unobserve(PressureSource source);
  undefined disconnect();
  sequence<PressureRecord> takeRecords();

  [SameObject] static readonly attribute FrozenArray<PressureSource> knownSources;
};

PressureObserver 인터페이스는 PressureObserver를 나타낸다.

10.2.1 constructor() 메서드

new PressureObserver(callback) 생성자 단계는 다음과 같다:

  1. this.[[Callback]]callback으로 설정한다.

10.2.2 observe() 메서드

observe(source, options) 메서드 단계는 다음과 같다:

  1. relevantGlobalthis관련 전역 객체로 둔다.
  2. relevantGlobal소유 문서 집합에 있는 각 document에 대해 다음을 반복한다:
    1. document사용하도록 허용되지 않은 정책 제어 기능 토큰 "compute-pressure"를 사용한다면 다음으로 거부된 프로미스NotAllowedError를 반환한다.
    참고
  3. this.[[SampleIntervalMap]][source]를 optionssampleInterval로 설정한다.
  4. promise새 프로미스로 둔다.
  5. pendingPromiseTuple을 (source, promise)로 둔다.
  6. pendingPromiseTuplethis.[[PendingObservePromises]]추가한다.
  7. promise반응한다:
  8. 다음 단계를 병렬로 실행한다:
    1. platformCollector를 null로 둔다.
    2. relevantGlobal플랫폼 수집기 매핑source포함한다면:
      1. platformCollectorrelevantGlobal플랫폼 수집기 매핑[source]으로 설정한다.
    3. 그렇지 않으면:
      1. newCollector연관된 압력 소스가 null인 새 플랫폼 수집기로 둔다.
      2. virtualPressureSourcesourcerelevantGlobal을 사용하여 가상 압력 소스 가져오기를 호출한 결과로 둔다.
      3. virtualPressureSource가 null이 아니라면:
        1. virtualPressureSource샘플 제공 가능이 true라면:
          1. newCollector연관된 압력 소스virtualPressureSource로 설정한다.
          2. newCollectorvirtualPressureSource연결된 플랫폼 수집기추가한다.
      4. 그렇지 않으면:
        1. realPressureSource구현 정의 압력 소스로 둔다. 이 소스는 source에 관한 텔레메트리 데이터를 제공하며 존재하지 않으면 null이다.
        2. newCollector연관된 압력 소스realPressureSource로 설정한다.
      5. newCollector연관된 압력 소스가 null이 아니라면:
        1. platformCollectornewCollector로 설정한다.
        2. relevantGlobal플랫폼 수집기 매핑[source]을 platformCollector로 설정한다.
    4. platformCollector가 null이면 주어진 relevantGlobal에 대해 PressureObserver 태스크 소스전역 태스크를 대기열에 추가하여 promiseNotSupportedError로 거부하고 이 단계를 중단한다.
    5. sourcerelevantGlobal을 사용하여 데이터 수집 활성화를 호출한다.
    6. 주어진 relevantGlobal에 대해 PressureObserver 태스크 소스전역 태스크를 대기열에 추가하여 다음 단계를 실행한다:
      1. promise가 거부되었다면 다음 하위 단계를 실행한다:
        1. source에 대한 relevantGlobal등록된 관찰자 목록비어 있다면, sourcerelevantGlobal을 사용하여 데이터 수집 비활성화를 호출한다.
        2. 반환한다.
      2. 관찰자this인 새 등록된 관찰자source에 대한 relevantGlobal등록된 관찰자 목록추가한다.
      3. promise를 이행한다.
  9. promise를 반환한다.

10.2.3 unobserve() 메서드

unobserve(source) 메서드 단계는 다음과 같다:

  1. source지원되는 소스 유형이 아니라면 "NotSupportedError"를 예외로 던진다.
  2. this.[[QueuedRecords]]에서 source와 연결된 모든 records제거한다.
  3. this.[[SampleIntervalMap]][source]를 제거한다.
  4. this.[[LastRecordMap]][source]를 제거한다.
  5. this.[[AfterPenaltyRecordMap]][source]를 제거한다.
  6. this.[[PendingObservePromises]]의 각 (promiseSource, pendingPromise)에 대해 반복하여, sourcepromiseSource와 같다면 pendingPromiseAbortError거부한다.
  7. relevantGlobalthis관련 전역 객체로 둔다.
  8. registeredObserverListrelevantGlobal등록된 관찰자 목록으로 두며, source에 대한 목록이다.
  9. registeredObserverList에서 관찰자this인 모든 등록된 관찰자제거한다.
  10. registeredObserverList비어 있다면:
    1. sourcerelevantGlobal을 사용하여 데이터 수집 비활성화를 호출한다.
    2. relevantGlobal플랫폼 수집기 매핑[source]를 제거한다.

10.2.4 disconnect() 메서드

disconnect() 메서드 단계는 다음과 같다:

  1. observer.[[QueuedRecords]]비운다.
  2. this.[[SampleIntervalMap]]지운다.
  3. this.[[LastRecordMap]]지운다.
  4. this.[[AfterPenaltyRecordMap]]지운다.
  5. this.[[PendingObservePromises]]의 각 (promiseSource, pendingPromise)에 대해 반복하여 pendingPromiseAbortError거부한다.
  6. relevantGlobalthis관련 전역 객체로 둔다.
  7. relevantGlobal등록된 관찰자 목록 순서 있는 맵의 각 sourceregisteredObserverList에 대해 다음을 반복한다:
    1. 다음 항목을 제거한다: 등록된 관찰자registeredObserverList에 있으며 그 관찰자this인 모든 항목.
    2. registeredObserverList비어 있다면:
      1. sourcerelevantGlobal을 사용하여 데이터 수집 비활성화를 호출한다.
      2. relevantGlobal플랫폼 수집기 매핑[source]을 제거한다.

10.2.5 takeRecords() 메서드

참고

takeRecords() 메서드 단계는 다음과 같다:

  1. recordsobserver.[[QueuedRecords]]복제본으로 둔다.
  2. observer.[[QueuedRecords]]비운다.
  3. records를 반환한다.

10.2.6 knownSources 속성

knownSources getter 단계는 다음과 같다:

  1. 사용자 에이전트지원되는 소스 유형을 알파벳순으로 반환한다.

참고

10.3 PressureRecord 인터페이스

WebIDL[Exposed=(DedicatedWorker,SharedWorker,Window), SecureContext]
interface PressureRecord {
  readonly attribute PressureSource source;
  readonly attribute PressureState state;
  readonly attribute DOMHighResTimeStamp time;
  [Default] object toJSON();
};

생성된 PressureRecord 객체에는 다음 내부 슬롯이 있다:

10.3.1 source 속성

source getter 단계는 해당 객체의 [[Source]] 내부 슬롯을 반환한다.

10.3.2 state 속성

state getter 단계는 해당 객체의 [[State]] 내부 슬롯을 반환한다.

10.3.3 time 속성

time getter 단계는 해당 객체의 [[Time]] 내부 슬롯을 반환한다.

10.3.4 toJSON 멤버

PressureRecord.toJSON이 호출되면 Web IDL 표준기본 toJSON 단계를 실행한다.

10.4 PressureObserverOptions 사전

WebIDLdictionary PressureObserverOptions {
  [EnforceRange] unsigned long sampleInterval = 0;
};

10.4.1 sampleInterval 멤버

sampleInterval 멤버는 밀리초 단위로 표현된 요청된 샘플링 간격을 나타낸다. 값이 0으로 설정된 경우 시스템은 PressureUpdateCallbackPressureState가 변경된 경우에만 호출한다.

참고

10.5 수명 주기 및 가비지 컬렉션

전역 객체는 해당 등록된 관찰자 목록등록된 관찰자에 대한 강한 참조를 갖는다(소스마다 하나씩).

참고

10.6 처리 모델

이 절에서는 사용자 에이전트가 이 명세를 구현할 때 수행해야 하는 단계를 설명한다.

10.6.1 지원 알고리즘

인수 observer가 주어졌을 때 관찰 창 재설정 단계는 다음과 같다:

관찰 창 재설정 단계를 실행하고, observer.[[ObservationWindow]] 시간이 지나면 다른 무작위 값을 사용하여 이 단계를 다시 실행하는 타이머를 시작한다.

참고

관련 전역 객체 relevantGlobal소유 문서 집합을 결정하려면:

  1. owningDocumentSet을 빈 집합으로 둔다.
  2. relevantGlobalWindow라면 relevantGlobal연결된 문서owningDocumentSet추가한다.
  3. 그렇지 않으면 다음을 반복한다. WorkerGlobalScope relevantGlobal소유자 집합에 있는 각 owner에 대해:
    1. ownerDocument라면 ownerowningDocumentSet추가한다.
    2. ownerWorkerGlobalScope라면, owningDocumentSetowningDocumentSetowner소유 문서 집합합집합으로 설정한다.
  4. owningDocumentSet을 반환한다.

인수 document가 주어졌을 때 문서에 암시적 포커스가 있음 단계는 다음과 같다:

  1. document완전히 활성인 상태가 아니라면 false를 반환한다.
  2. relevantGlobaldocument관련 전역 객체로 둔다.
  3. 활성 Picture-in-Picture 세션의 개시자에 있는 각 origin에 대해 다음을 반복한다:
    1. relevantGlobal관련 설정 객체출처origin동일 출처라면 true를 반환한다.
  4. relevantGlobal탐색 컨텍스트캡처 중이라면 true를 반환한다.
  5. topLevelBCrelevantGlobal탐색 컨텍스트최상위 탐색 컨텍스트로 둔다.
  6. topLevelBC시스템 포커스가 없다면 false를 반환한다.
  7. focusedDocumenttopLevelBC 현재 포커스된 영역노드 문서로 둔다.
  8. relevantGlobal관련 설정 객체출처focusedDocument출처동일 출처라면 true를 반환한다.
  9. 그렇지 않으면 false를 반환한다.

인수 observer가 주어졌을 때 데이터를 수신할 수 있음 단계는 다음과 같다:

  1. relevantGlobalobserver관련 전역 객체로 둔다.
  2. relevantGlobalWindow 객체라면:
    1. 문서에 암시적 포커스가 있음relevantGlobal연결된 Document와 함께 실행한 결과를 반환한다.
  3. relevantGlobalWorkerGlobalScope 객체라면:
    1. owningDocumentsrelevantGlobal소유 문서 집합으로 둔다.
    2. owningDocuments에 있는 각 document에 대해 다음을 반복한다:
      1. 문서에 암시적 포커스가 있음document와 함께 실행한 결과가 true라면 true를 반환한다.
      2. 그렇지 않으면 계속한다.
  4. false를 반환한다.
참고

인수 observer, sourcetimestamp가 주어졌을 때 빈도 테스트 통과 단계는 다음과 같다:
  1. observer.[[LastRecordMap]][source]가 존재하지 않으면 true를 반환한다.
  2. recordobserver.[[LastRecordMap]][source]로 둔다.
  3. sampleIntervalobserver.[[SampleIntervalMap]][source]로 둔다.
  4. timeDeltaMilliseconds = timestamp - record.[[Time]]으로 둔다.
  5. timeDeltaMillisecondssampleInterval이면 true를 반환하고, 그렇지 않으면 false를 반환한다.
인수 observer, source, state가 주어졌을 때 디스패치해야 함 단계는 다음과 같다:
  1. observer.[[SampleIntervalMap]][source] > 0이면 true를 반환한다.
  2. observer.[[LastRecordMap]][source]가 존재하지 않으면 true를 반환한다.
  3. recordobserver.[[LastRecordMap]][source]로 둔다.
  4. record.[[State]]state와 같지 않으면 true를 반환한다.
  5. false를 반환한다.
인수 observer, source가 주어졌을 때 빈도 난독화 테스트 통과 단계는 다음과 같다:
  1. observer.[[ChangesCountMap]][source]를 1 증가시킨다.
  2. observer.[[ChangesCountMap]][source] ≤ observer.[[MaxChangesThreshold]]인지 반환한다.

소스 유형 sourcerelevantGlobal이 주어졌을 때 가상 압력 소스 가져오기를 수행하려면 다음 단계를 수행한다. 이 단계는 가상 압력 소스 또는 null을 반환한다.

  1. topLevelTraversable을 null로 둔다.
  2. relevantGlobalWindow 객체라면:
    1. topLevelTraversablerelevantGlobal탐색 가능 항목최상위 순회 가능 항목으로 설정한다.
  3. relevantGlobalDedicatedWorkerGlobalScope 객체라면:
    1. owningDocumentsrelevantGlobal소유 문서 집합으로 둔다.
    2. owningDocuments비어 있다면 null을 반환한다.
    3. 단언: owningDocuments크기는 1이다.
    4. topLevelTraversableowningDocuments[0]의 노드 탐색 가능 항목최상위 순회 가능 항목으로 설정한다.
  4. topLevelTraversable이 null이면 null을 반환한다.
  5. topLevelVirtualPressureSourceMappingtopLevelTraversable가상 압력 소스 매핑으로 둔다.
  6. virtualPressureSource를 null로 둔다.
  7. topLevelVirtualPressureSourceMappingsource포함한다면:
    1. virtualPressureSourcetopLevelVirtualPressureSourceMapping[source]으로 설정한다.
  8. virtualPressureSource를 반환한다.

10.6.2 데이터 수집 및 전달

소스 유형 sourcerelevantGlobal이 주어졌을 때 데이터 수집 활성화를 수행하려면 다음 단계를 수행한다:

  1. relevantGlobal플랫폼 수집기 매핑source포함하지 않으면 이 단계를 중단한다.
  2. platformCollectorrelevantGlobal플랫폼 수집기 매핑[source]으로 둔다.
  3. platformCollector활성화됨이 true라면 이 단계를 중단한다.
  4. platformCollector활성화됨을 true로 설정한다.
  5. 구현 정의 방식으로 relevantGlobal, sourceplatformCollector을 사용하여 데이터 수집 단계를 실행하기 시작한다.
    참고

소스 유형 sourcerelevantGlobal이 주어졌을 때 데이터 수집 비활성화를 수행하려면 다음 단계를 수행한다:

  1. relevantGlobal플랫폼 수집기 매핑source포함하지 않으면 이 단계를 중단한다.
  2. platformCollectorrelevantGlobal플랫폼 수집기 매핑[source]으로 둔다.
  3. platformCollector활성화됨이 false라면 이 단계를 중단한다.
  4. 구현 정의 방식으로 relevantGlobal, sourceplatformCollector을 사용한 데이터 수집 단계의 실행을 중지한다.
  5. platformCollector활성화됨을 false로 설정한다.
  6. platformCollector연관된 압력 소스가상 압력 소스라면:
    1. platformCollector를 해당 연관된 압력 소스연결된 플랫폼 수집기에서 제거한다.
  7. 그렇지 않으면 platformCollector연관된 압력 소스에 텔레메트리 데이터 검색을 중지하도록 알리는 구현 정의 단계를 수행한다.

relevantGlobal, sourceplatformCollector이 주어졌을 때 데이터 수집 단계는 다음과 같다:

  1. pressureSourceplatformCollector연관된 압력 소스로 둔다.
  2. pressureSource가 null이면 이 단계를 중단한다.
  3. samplepressureSource최신 샘플로 둔다.
  4. sample이 null이면 이 단계를 중단한다.
  5. state를 null로 둔다.
  6. pressureSource가상 압력 소스라면:
    1. statesample데이터에 저장된 PressureState로 설정한다.
  7. 그렇지 않으면:
    1. 기여 요인의 변화가 상당함이 false라면 이 단계를 중단한다.
    2. statesourcesample데이터에서 계산한 조정된 압력 상태로 설정한다.
      참고
  8. 단언: state는 null이 아니다.
  9. rawTimestampsample타임스탬프로 둔다.
  10. timeValue상대 고해상도 시간으로 둔다. 이 값은 rawTimestamprelevantGlobal을 기반으로 한다.
  11. relevantGlobalsource에 대한 등록된 관찰자 목록에 있는 각 observer에 대해 다음을 반복한다:
    1. 데이터를 수신할 수 있음observer와 함께 실행한 결과가 false라면 계속한다.
    2. 빈도 테스트 통과observer, sourcetimeValue와 함께 실행한 결과가 false라면 계속한다.
    3. 디스패치해야 함observer, source, state와 함께 실행한 결과가 false라면 계속한다.
    4. record를 새 PressureRecord 객체로 둔다. 객체의 [[Source]]source로, [[State]]state로, [[Time]]timeValue로 설정한다.
    5. observer.[[AfterPenaltyRecordMap]][source]가 존재한다면:
      1. observer.[[AfterPenaltyRecordMap]][source]를 record로 설정한다.
      2. 계속한다.
    6. 빈도 난독화 테스트 통과observersource와 함께 실행한 결과가 false라면:
      1. observer.[[AfterPenaltyRecordMap]][source]를 record로 설정한다.
      2. observer.[[ChangesCountMap]][source]를 0으로 설정한다.
      3. 다음 콜백을 사용하는 observer.[[PenaltyDuration]] 지속 시간의 타이머를 생성한다:
        1. observer.[[AfterPenaltyRecordMap]][source]가 존재한다면:
          1. recordobserver.[[AfterPenaltyRecordMap]][source]로 둔다.
          2. observer.[[AfterPenaltyRecordMap]][source]를 제거한다.
          3. 레코드를 대기열에 추가observer, source, record와 함께 실행한다.
      4. 계속한다.
    7. 레코드를 대기열에 추가observer, source, record와 함께 실행한다.

10.6.3 PressureRecord를 대기열에 추가

인수 observer, source, record가 주어졌을 때 레코드를 대기열에 추가하려면 다음 단계를 실행한다:

  1. observer.[[QueuedRecords]]크기최대 대기 레코드 수보다 크면 첫 번째 항목제거한다.
  2. recordobserver.[[QueuedRecords]]추가한다.
  3. observer.[[LastRecordMap]][source]를 record로 설정한다.
  4. observer관련 전역 객체를 사용하여 압력 관찰자 태스크를 대기열에 추가한다.

10.6.4 압력 관찰자 태스크를 대기열에 추가

PressureObserver 태스크 소스태스크 소스이며, 10.6.5 압력 관찰자에게 알림을 위한 태스크를 스케줄링하는 데 사용된다.

relevantGlobal이 입력으로 주어졌을 때 압력 관찰자 태스크를 대기열에 추가하려면 다음 단계를 실행한다:

  1. relevantGlobal압력 관찰자 태스크가 대기열에 추가됨이 true이면 반환한다.
  2. relevantGlobal압력 관찰자 태스크가 대기열에 추가됨을 true로 설정한다.
  3. relevantGlobal을 사용하여 PressureObserver 태스크 소스전역 태스크를 대기열에 추가하고 압력 관찰자에게 알림을 수행한다.

10.6.5 압력 관찰자에게 알림

relevantGlobal이 입력으로 주어졌을 때 압력 관찰자에게 알림을 수행하려면 다음 단계를 실행한다:

  1. relevantGlobal압력 관찰자 태스크가 대기열에 추가됨을 false로 설정한다.
  2. notifySet집합으로 둔다. 이 집합에는 relevantGlobal등록된 관찰자 목록에 있는 모든 관찰자가 포함된다.
  3. notifySet의 각 observer에 대해 다음을 반복한다:
    1. recordsobserver.[[QueuedRecords]]복제본으로 둔다.
    2. observer.[[QueuedRecords]]비운다.
    3. records비어 있지 않다면 observer.[[Callback]]호출한다. 이때 « records, observer » 및 "report"를 사용한다.

10.6.6 완전히 활성인 상태의 변경 처리

이 명세는 Document document가 주어졌을 때 다음 문서 언로드 정리 단계를 정의한다:

  1. relevantGlobaldocument관련 전역 객체로 둔다.
  2. relevantGlobal등록된 관찰자 목록 순서 있는 맵의 각 source 에 대해 다음을 반복한다:
    1. sourcerelevantGlobal을 사용하여 데이터 수집 비활성화를 호출한다.
    2. relevantGlobal플랫폼 수집기 매핑[source]을 제거한다.
이슈 275: bfcache 통합 전략을 올바르게 결정

이 명세에는 이전에 Document가 다시 완전히 활성인 상태가 되는 경우, 즉 Document재활성화 단계와의 통합을 다루는 단계가 포함되어 있었다. 의도한 동작을 논의하는 동안 해당 단계는 제거되었다.

10.6.7 작업자 상태 변경 처리

참고

WorkerGlobalScope relevantGlobal종료 중 플래그가 true로 설정될 때마다 다음 단계를 수행한다:

  1. 각각에 대해 source , relevantGlobal등록된 관찰자 목록 순서 있는 맵:
    1. sourcerelevantGlobal과 함께 데이터 수집 비활성화를 호출한다.
    2. relevantGlobal플랫폼 수집기 매핑[source]을 제거한다.

11. 보안 및 개인 정보 보호 고려 사항

11.1 개인 정보 보호 및 보안 위협의 유형

참고
작업 그룹은 알려진 모든 이론적 및 실제 공격 벡터를 이 절에 나열할 예정이다.

11.1.1 타이밍 공격

출처를 공유하지 않는 사이트가 고유하거나 매우 정밀한 값에 동시에 접근할 수 있다면, 동일 출처가 아닌 사이트 전반에서 사용자를 식별할 수 있다. 이 공격은 11.2.1 데이터 최소화, 11.2.2 빈도 난독화, 그리고 11.2.7 동일 출처 제한으로 완화된다.

11.1.2 교차 사이트 은닉 채널

컴퓨터 보안에서 은닉 채널은 통신이 허용되어서는 안 되는 프로세스 사이에서 정보를 전송할 수 있는 기능을 만든다. 현대적인 다중 프로세스 웹 엔진에서는 일반적으로 각 창이나 탭이 자체 프로세스에 존재한다(동일 출처인 문서나 동일 사이트인 사이트는 일반적으로 같은 프로세스를 공유한다). 이 API를 사용하면 교차 사이트 은닉 채널 C를 만들 수 있다. 한 탭의 사이트 A가 CPU 상태를 조작한 후 먼저 채널 C로 브로드캐스트한다. 그런 다음 다른 탭의 사이트 B(사이트 A와 동일 사이트가 아님)가 이 API를 사용하여 CPU 상태가 변경된 시점을 파악함으로써 채널 C에서 브로드캐스트된 데이터를 읽는다. 이 프로세스는 사이트 A와 B 모두에서 스크립트가 실행되는 동안 반복된다.

이 공격은 11.2.2 빈도 난독화11.2.5 보정 방해로 완화된다. 구현자는 장시간 실행되는 스크립트에 이러한 완화책을 모두 고려하는 것이 좋다.

참고
스크립트가 오래 실행될수록 제안된 교차 사이트 은닉 채널을 사용하여 더 많은 정보를 전송할 수 있다. 예를 들어 사용자가 화상 회의 사이트와 장시간 실행되는 다른 사이트를 함께 이용하면 일반적인 브라우징 시나리오보다 더 많은 정보를 전송할 수 있다. 반면에 화상 회의 세션과 같은 워크로드는 일반적으로 CPU에 지속적인 압력을 가하므로 압력 상태를 예측 가능한 방식으로 조작하기가 더 어려워진다.

11.1.3 표적 비익명화 공격

표적 비익명화 공격은 사용자의 익명성을 위협하는 중대한 위협 유형이다. 이러한 공격을 사용하면 악의적이거나 부분적으로 침해된 웹사이트(“악성 사이트”라고 함)가 웹사이트 방문자에게 이메일 주소나 소셜 미디어 계정명과 같은 특정 공개 식별자가 있는지를 확인할 수 있다.

일부에게 익명성은 사치일 수 있지만, 어떤 사람들에게는 그보다 훨씬 중요하며 생존의 문제이기도 하다. 예를 들어 정치 시위에 참여하거나 민감한 주제를 취재하는 언론인으로 일하는 사람 등을 생각해 보라.

공격자는 예를 들어 공개 리소스 공유 서비스(“피해자 사이트”)를 사용하여 표적과 리소스를 비공개로 공유한 다음, 부채널을 통해 리소스를 로드할 때 발생하는 부수 효과(성공적인 접근을 나타냄)를 측정할 수 있다. 로그인한 방문자가 삽입된 리소스에 성공적으로 접근할 수 있다면, 현재 방문자가 실제로 의도한 표적임을 나타낸다.

구체적으로, 전체 CPU 압력에 관한 신뢰할 수 있는 정보를 노출하면 공격 사이트가 교차 출처 탐색 대상(예: 다른 사이트의 iframe 또는 팝업 창)이 CPU 집약적인 작업을 수행했는지 파악할 수 있다.

팝언더탭언더와 같은 기법을 사용하여 로딩을 사용자에게 숨길 수 있다.

가능한 공격 중 하나는 악성 웹사이트가 사용자가 로그인한 피해자 사이트의 리소스 (예: 동영상 스트리밍 사이트 또는 온라인 문서 편집기)에 대해 팝업 등을 열고, 특정 사용자와 공유된 리소스를 가리키게 하는 것이다.

리소스를 로드할 때 CPU 압력이 증가한다고 가정하면, 이는 공격 사이트에 사용자가 해당 리소스에 접근할 수 있는 계정으로 로그인했는지를 알려주는 부채널을 형성하여 사용자의 익명성을 해제한다.

현대 CPU는 높은 압력에서 빠르게 회복하므로, 가능한 완화 전략 중 하나는 팝업 및 iframe 콘텐츠를 로드한 후 몇 초 동안 판독을 일시적으로 비활성화하는 것이다.

11.2 완화 전략

참고
이 절에서는 이 명세에 적용할 수 있는 완화 전략을 개괄적으로 설명한다. 이러한 완화책의 규범적 정의는 이 명세의 각 알고리즘에 통합되어 있다. 구현자는 이 명세에 정의된 완화책을 구현할 때 비공개 브라우징 모드에 관한 TAG 지침을 고려하는 것이 좋다.

11.2.1 데이터 최소화

이 명세는 기반 플랫폼의 저수준 세부 정보와 관련된 데이터의 노출을 가치가 높은 사용 사례를 처리하는 데 필요한 최소한으로 제한하기 위해 일반적인 데이터 최소화 원칙을 준수한다. 여기에는 기기에 관한 식별 정보의 노출 제한을 고려하는 것도 포함된다.

이 명세의 맥락에서 데이터 최소화 원칙을 구체적으로 적용하는 방법은 11.2.2 빈도 난독화11.2.7 동일 출처 제한에서 설명한다.

11.2.2 빈도 난독화

이 명세에서는 구현 정의 슬라이딩 관찰 창에서 압력 변경 횟수를 추적하고, 압력 변경 횟수가 구현 정의 임계값을 초과하면 플래그를 설정하는 빈도 난독화 완화책을 구현하도록 요구한다. 마찬가지로 여러 상태에 걸쳐 압력 상태 변경 횟수가 많은 것과 같은 비정상 활동을 구현이 관찰하고, 동일한 방식으로 이 플래그를 설정하는 것도 권장한다.

이 플래그가 설정되면 구현은 압력 관찰자에게 페널티를 부여하는 것이 좋다. 이 페널티가 지속되는 동안에는 평소처럼 압력 상태 변경을 스크립트에 알릴 수 없다. 이 페널티의 지속 시간은 구현 정의이며 무작위화하는 것이 권장된다. 페널티 이후 압력 관찰자에게 알림이 작업을 재개하면 최신 압력 상태만 보고하고, 이 페널티 동안 플랫폼 수집기에서 받은 모든 중간 상태 정보는 무시한다.

11.2.3 빈도 난독화 규범적 매개변수

구현 경험에 기반하여 구현자는 다음을 사용해야 한다:

  • PressureObserver의 [[MaxChangesThreshold]] 내부 슬롯에는 50회에서 100회 사이의 변경 범위.
  • PressureObserver의 [[PenaltyDuration]] 내부 슬롯에는 5000밀리초에서 10000밀리초 사이의 범위.
참고

11.2.4 빈도 난독화 비규범적 매개변수

이 절은 비규범적이다.

구현 경험에 기반하여 구현자는 다음을 사용하는 것이 좋다:

  • PressureObserver의 [[ObservationWindow]] 내부 슬롯에는 300000밀리초(5분)에서 600000밀리초(10분) 사이의 범위.
참고

11.2.5 보정 방해

보정 과정에서 공격자는 조작된 워크로드가 가하는 압력에 대한 응답으로 이 API가 특정 압력 상태로의 전환을 가장 높은 확률로 보고하도록 CPU를 조작하려 한다. 이 보정 방해 완화책은 이러한 압력 상태 전환에 기여하는 구현 정의 저수준 하드웨어 측정치를 런타임에 조금씩 변경하여, 이 보정 과정이 성공하지 못하게 하거나 속도를 늦출 수 있다. 초기 보정이 성공하더라도 이 완화책이 계속 실행되면서 런타임에 그 결과가 무효화된다. 다시 보정하려는 모든 시도도 마찬가지로 완화된다.

참고

11.2.6 보정 방해 매개변수

이 절은 비규범적이다.

구현 경험에 기반하여 구현자는 120000밀리초(2분)에서 240000밀리초(4분) 사이 범위의 무작위 시간 값에 완화책을 적용하는 것이 좋다.

참고

11.2.7 동일 출처 제한

기본적으로 데이터 전달은 활성 PIP 세션의 개시자와 동일한 출처에서 제공된 문서, 캡처 중인 문서, 또는 존재하는 경우 시스템 포커스가 있는 문서로 제한된다.

위 규칙에 따라 데이터 전달 요건을 충족하는 문서는 자식 탐색 가능 객체의 문서에 이를 위임할 수 있다.

이 기능은 선언된 정책을 통해서만 iframe과 같은 서드 파티 컨텍스트로 확장할 수 있다.

공유 작업자는 최상위 문서와 연결된 iframe 등 여러 문서에서 공유될 수 있다. 소유자 집합의 문서 중 하나가 위의 데이터 전달 요건을 충족하면 공유 작업자도 데이터 전달 요건을 충족한다. 즉, 삽입된 iframe이 데이터를 삽입 문서에 전달할 수 있다.

12. 접근성 고려 사항

컴퓨팅 압력 API는 사용자 경험을 개선하는 데 중점을 둔다. 이 API를 기반으로 구축된 애플리케이션이 접근성에 긍정적인 영향을 줄 수 있는 방법은 두 가지이다.

  1. API를 사용하여 수집한 정보를 바탕으로 결정을 내릴 때 사용자의 접근 요구 사항을 고려한다.
  2. API에서 얻은 정보를 바탕으로 사용자 인터페이스를 설계하고 만들 때 접근성을 고려한다.

API 사용자는 이 두 가지 기회를 모두 고려하는 것이 중요하다. 다음은 몇 가지 예이다:

13. 자동화

컴퓨팅 압력 API는 인터페이스를 완전히 시험하려면 예측 가능한 방식으로 응답하는 물리적 하드웨어 기기가 필요하므로 테스트 작성자에게 어려움을 준다.

이 문제를 해결하기 위해 이 문서는 실제 압력 소스처럼 동작하면서 특정 속성을 가질 수 있고 판독값을 사용자가 전적으로 정의할 수 있는 가상 압력 소스를 정의하고 제어할 수 있도록 하는 [WEBDRIVER2] 확장 명령을 정의한다.

13.1 가상 압력 소스

가상 압력 소스는 실제 압력 소스의 동작을 제어된 방식으로 모의하는 압력 소스이다. 가상 압력 소스는 연결된 0개 이상의 플랫폼 수집기에 압력 변경을 보고한다.

그러나 실제 압력 소스와 달리, 플랫폼 수집기압력 상태로 처리해야 하는 구현 정의 값을 보고하는 대신, 압력 상태 값을 직접 보고한다. 다시 말해, 가상 압력 소스압력 소스 샘플데이터PressureState이다.

모든 압력 소스와 관련된 데이터(예: 압력 소스 샘플) 외에도, 각 가상 압력 소스에는 다음 항목이 있다:

최상위 탐색 가능 객체에는 가상 압력 소스 매핑이 있다. 이는 소스 유형가상 압력 소스에 대응시키는 순서 있는 맵이다.

참고
참고

13.1.1 확장 명령

13.1.1.1 가상 압력 소스 생성
HTTP 메서드 URI 템플릿
POST /session/{session id}/pressuresource

확장 명령은 지정된 소스 유형의 새 가상 압력 소스를 생성한다. 같은 소스 유형PressureObserver 인스턴스에서 observe()를 호출하면, 가상 압력 소스13.1.1.2 가상 압력 소스 삭제가 실행될 때까지 해당 인스턴스의 기반 압력 소스로 사용된다.

이 알고리즘에서 사용하는 parameters 인수의 속성
매개변수 이름 값 유형 필수
type String
supported Boolean 아니요

session, URL variablesparameters가 주어졌을 때 원격 단 단계는 다음과 같다:

  1. virtualPressureSourceTypeparameters에서 "type"에 대해 속성 가져오기를 호출한 결과라고 하자.
  2. 사용자 에이전트지원되는 소스 유형virtualPressureSourceType포함되지 않으면, WebDriver 오류 코드잘못된 인수오류를 반환한다.
  3. topLevelTraversable현재 브라우징 컨텍스트최상위 탐색 가능 객체라고 하자.
  4. topLevelVirtualPressureSourceMappingtopLevelTraversable가상 압력 소스 매핑이라고 하자.
  5. topLevelVirtualPressureSourceMappingvirtualPressureSourceType이 포함되어 있으면, WebDriver 오류 코드잘못된 인수오류를 반환한다.
  6. supportedparameters에서 "supported" 및 true를 사용해 기본값을 사용해 속성 가져오기를 호출한 결과라고 하자.
  7. virtualPressureSource를 새 가상 압력 소스라고 하자.
  8. virtualPressureSource샘플 제공 가능supported로 설정한다.
  9. topLevelVirtualPressureSourceMapping[virtualPressureSourceType]을 virtualPressureSource로 설정한다.
  10. 데이터가 null인 성공을 반환한다.
13.1.1.2 가상 압력 소스 삭제
HTTP 메서드 URI 템플릿
DELETE /session/{session id}/pressuresource/{type}

확장 명령은 지정된 가상 압력 소스를 삭제한다. 즉, 주어진 소스 유형의 데이터를 사용할 수 있다면 가상 방식이 아닌 일반적인 방식으로 전달한다.

session, URL variablesparameters가 주어졌을 때 원격 단 단계는 다음과 같다:

  1. virtualPressureSourceTypeURL variables["type"]의 값이라고 하자.
  2. 사용자 에이전트지원되는 소스 유형virtualPressureSourceType포함되지 않으면, WebDriver 오류 코드잘못된 인수오류를 반환한다.
  3. topLevelTraversable현재 브라우징 컨텍스트최상위 탐색 가능 객체라고 하자.
  4. topLevelVirtualPressureSourceMappingtopLevelTraversable가상 압력 소스 매핑이라고 하자.
  5. pressureSourcetopLevelVirtualPressureSourceMapping[virtualPressureSourceType]이라고 하자.
  6. pressureSource연결된 플랫폼 수집기에 있는 각 platformCollector대해:
    1. platformCollector연관된 압력 소스를 null로 설정한다.
  7. topLevelVirtualPressureSourceMapping[virtualPressureSourceType]을 제거한다.
  8. 데이터가 null인 성공을 반환한다.
13.1.1.3 가상 압력 소스 업데이트
HTTP 메서드 URI 템플릿
POST /session/{session id}/pressuresource/{type}

확장 명령을 사용하면 새 압력 소스 샘플을 푸시하여 가상 압력 소스의 상태를 업데이트할 수 있다.

참고
이 알고리즘에서 사용하는 parameters 인수의 속성
매개변수 이름 값 유형 필수
sample PressureState

session, URL variablesparameters가 주어졌을 때 원격 종단 단계는 다음과 같다:

  1. virtualPressureSourceTypeURL variables["type"]의 값이라고 하자.
  2. 사용자 에이전트지원되는 소스 유형virtualPressureSourceType포함되지 않으면, WebDriver 오류 코드잘못된 인수오류를 반환한다.
  3. topLevelTraversable현재 브라우징 컨텍스트최상위 탐색 가능 객체라고 하자.
  4. topLevelVirtualPressureSourceMappingtopLevelTraversable가상 압력 소스 매핑이라고 하자.
  5. topLevelVirtualPressureSourceMappingvirtualPressureSource포함되지 않으면, WebDriver 오류 코드지원되지 않는 작업오류를 반환한다.
  6. virtualPressureSourcetopLevelVirtualPressureSourceMapping[virtualPressureSourceType]이라고 하자.
  7. sampleparameters에서 "sample"에 대해 속성 가져오기를 호출한 결과라고 하자.
  8. sample의 유형이 PressureState가 아니면, WebDriver 오류 코드잘못된 인수오류를 반환한다.
  9. virtualPressureSource최신 샘플을 새 압력 소스 샘플로 설정한다. 이 샘플의 데이터 이고 타임스탬프안전하지 않은 공유 현재 시각이다.
  10. 구현 정의 방식으로 virtualPressureSource최신 샘플virtualPressureSource연결된 플랫폼 수집기에서 사용할 수 있게 한다.
  11. 데이터가 null인 성공을 반환한다.

14. 예시

이 절은 비규범적이다.

예시 2: 콜백에서 관찰자에 접근하는 방법
const samples = [];

function pressureChange(records, observer) {
  for (const record of records) {
    samples.push(record.state);

    // 20개의 샘플만 필요하다.
    if (samples.length == 20) {
      observer.disconnect();
      return;
    }
  }
}

const observer = new PressureObserver(pressureChange);
observer.observe("cpu");

다음 예시에서는 압력이 critical 상태가 될 때 동시 동영상 스트림 수를 줄이려고 한다. 단순화를 위해 이 상태만 고려한다.

스트림 수를 줄이더라도 critical 상태에서 벗어나지 못하거나 적어도 즉시 벗어나지는 못할 수 있으므로, 여전히 critical 상태에 있는 동안 30초마다 한 번에 스트림 하나씩 줄이는 전략을 사용한다.

이를 위해 콜백이 최소한 30초마다 한 번 또는 상태가 실제로 변경될 때 호출되도록 한다. 상태가 변경되면 간격 타이머를 재설정한다.

예시 3: CPU 압력에 따라 동영상 피드 수를 조정하는 방법
let timerId = -1;
function pressureChange(records) {
  // 실제 상태 변경 또는 setTimeout 호출(아래 참조)로 이 함수가 호출될 때마다
  // 타이머를 지운다.
  if (timerId > 0) {
    clearTimeout(timerId);
  }

  // critical 상태가 되면 30초마다 여전히 critical 상태인지 다시 확인하고,
  // 그렇다면 동시 스트림 수를 더 줄이려고 한다.
  // 이를 위해 변경 사항이 없을 때 마지막 결과와 함께 이 함수를 다시 호출하는
  // 30초 타이머를 생성한다.
  const lastRecordArray = [records.at(records.length - 1)];
  timerId = setTimeout(pressureChange.bind(this, lastRecordArray), 30_000);

  for (const record of records) {
    if (record.state == "critical") {
      let streamsCount = getStreamsCount();
      setStreamsCount(streamsCount--);
    }
  }
}

const observer = new PressureObserver(pressureChange);
observer.observe("cpu");

다음 예시에서는 콜백이 마지막으로 호출된 이후 누적된 나머지 records를 가져와 takeRecords()를 사용하는 방법을 보여준다.

disconnect() 전에 이 작업을 수행하는 것이 좋다. 그렇지 않으면 disconnect()가 레코드를 지우며 레코드는 영원히 손실된다.

예를 들어 벤치마킹 워크로드 중의 압력을 측정하여 워크로드가 지속되는 정확한 시간 동안의 압력 원격 측정값을 얻고자 할 수 있다. 이는 작업이 완료되면 모든 관찰자의 연결을 즉시 해제하고, 이벤트 루프 주기의 일부로 아직 전달되지 않았을 수 있는 현재 시점까지의 보류 중인 압력 원격 측정값을 수동으로 요청하는 것을 의미한다.

예시 4: 연결 해제 직전까지의 모든 상태 변경을 처리하는 방법
function logWorkloadStatistics(records) {
  // records로 무언가를 수행한다.
}

const observer = new PressureObserver(logWorkloadStatistics);
observer.observe("cpu");

// 보류 중인 상태 변경 레코드를 읽는다. 그렇지 않으면 연결을 해제할 때
// 레코드가 지워진다.
const records = observer.takeRecords();
logWorkloadStatistics(records);

observer.disconnect();

다음 예시에서는 source를 사용해 unobserve()를 호출하여 관찰자가 특정 source의 감시를 중지하도록 하는 방법을 보여준다.

참고
예시 5: 관찰자가 특정 소스의 상태 변경 감시를 중지하도록 하는 방법
const observer = new PressureObserver(records => { /* records로 무언가를 수행한다. */ });

observer.observe("cpu");
observer.observe("gpu");

// 이제 'cpu' 또는 'gpu'의 압력 상태가 변경될 때마다 콜백이 호출된다.

observer.unobserve("gpu");

// 이제 'cpu'의 압력 상태가 변경될 때만 콜백이 호출된다.

다음 예시에서는 disconnect()를 호출하여 관찰자가 모든 상태 변경 감시를 중지하도록 하는 방법을 보여준다. disconnect()를 호출하면 이전 observe() 호출에서 관찰한 모든 소스의 관찰을 중지한다.

또한 마지막으로 콜백이 호출된 이후 수집된 보류 중인 모든 레코드를 지운다.

예시 6: 관찰자가 모든 상태 변경 감시를 중지하도록 하는 방법
const observer = new PressureObserver(records => { // records로 무언가를 수행한다. });
observer.observe("cpu");
observer.observe("gpu");

// 어느 정도 시간이 지난 후...

observer.disconnect();

// 앞서 disconnect()를 호출했으므로 records는 빈 배열이다.
const records = observer.takeRecords();

15. 적합성

비규범적으로 표시된 절뿐 아니라 이 명세의 모든 작성 지침, 다이어그램, 예시 및 참고는 비규범적이다. 이 명세의 그 밖의 모든 내용은 규범적이다.

이 문서에서 핵심 단어 MAY, MUSTRECOMMENDED는 여기에 표시된 것처럼 모두 대문자로 나타나는 경우에만 BCP 14 [RFC2119] [RFC8174]에 설명된 대로 해석해야 한다.

이 명세는 하나의 제품, 즉 명세에 포함된 인터페이스를 구현하는 사용자 에이전트의 적합성 기준을 정의한다.

A. 감사의 말

이 절은 비규범적이다.

다음 분들이 보내 주신 귀중한 피드백과 조언에 깊이 감사드린다. Anssi Kostiainen, Asaf Yaffe, Benjamin VanderSloot, Chen Xing, Evan Shrubsole, Florian Scholz, François Beaufort, Jan Gora, Jesse Barnes, Joshua Bell, Kamila Hasanbega, Matt Menke, Moh Haghighat, Nicolás Peña Moreno, Opal Voravootivat, Paul Jensen, Peter Djeu, Reilly Grant, Ulan Degenbaev, Victor Miura, Wei Wang, 및 Zhenyao Mo

개인 정보 보호 검토와 피드백, 그리고 제안된 교차 사이트 은닉 채널 공격 및 그 완화책에 대해 W3C Privacy Interest Group(PING), 특히 Peter Snyder에게 감사드린다. 마찬가지로 비공개 브라우징의 개인 정보 보호에 관한 연구와 이 명세에 대한 관련 기여에 대해 Ehsan Toreini에게 감사드린다.

실제 시나리오에서 이 API를 개선하는 데 도움이 된 피드백과 실무 실험을 제공한 Zoom 엔지니어링 팀의 Amanda Zhao, Fidel Tian, Zhiliang Wang 및 그 밖의 분들께 특별히 감사드린다.

B. 실질적 변경 사항 요약

이 절은 비규범적이다.

B.1 첫 번째 공개 작업 초안(2022/12/20) 이후의 변경 사항

B.2 색인

B.2.1 이 명세에서 정의하는 용어

B.2.2 참조로 정의되는 용어

  • [DOM]은 다음을 정의한다:
    • Document 인터페이스
    • 문서
    • 노드
    • 노드 문서(Node의 경우)
  • [ECMASCRIPT]는 다음을 정의한다:
    • 에이전트 (ECMAScript의 경우)
    • globalThis 속성 (globalThis의 경우)
  • [HR-TIME]은 다음을 정의한다:
    • DOMHighResTimeStamp
    • 상대적 고해상도 시각
    • 안전하지 않은 현재 시각(단조 시계의 경우)
    • 안전하지 않은 공유 현재 시각
  • [HTML]은 다음을 정의한다:
    • 사용이 허용됨
    • 연관된 문서
    • 브라우징 컨텍스트
    • 자식 탐색 가능 객체
    • 종료 중(WorkerGlobalScope의 경우)
    • DedicatedWorkerGlobalScope 인터페이스
    • 완전히 활성임(Document의 경우)
    • 전역 객체
    • iframes 요소
    • 병렬로
    • 탐색 가능 객체(Window의 경우)
    • 노드 탐색 가능 객체
    • 출처
    • 소유자 집합(WorkerGlobalScope의 경우)
    • 정책 컨테이너(WorkerGlobalScope의 경우)
    • 전역 태스크를 대기열에 추가
    • 재활성화(Document의 경우)
    • 관련 전역 객체
    • 관련 설정 객체
    • 동일 출처
    • 동일 사이트
    • 시스템 포커스(최상위 탐색 가능 객체의 경우)
    • 태스크 소스
    • 시간 원점(환경 설정 객체의 경우)
    • 최상위 브라우징 컨텍스트
    • 최상위 탐색 가능 객체
    • 최상위 탐색 가능 객체(브라우징 컨텍스트의 경우)
    • 문서 언로드 정리 단계
    • Window 인터페이스
    • WorkerGlobalScope 인터페이스
  • [INFRA]는 다음을 정의한다:
    • 추가 (list의 경우)
    • 추가 (set의 경우)
    • 단언
    • 지우기 (map의 경우)
    • 복제 (list의 경우)
    • 포함 (list의 경우)
    • 포함 (map의 경우)
    • 계속 (iteration의 경우)
    • 비어 있음 (list의 경우)
    • 각각에 대해 (list의 경우)
    • 각각에 대해 (map의 경우)
    • 구현 정의
    • 항목 (list의 경우)
    • 항목 (struct의 경우)
    • 키 (map의 경우)
    • 목록
    • 순서 있는 맵
    • 대기열
    • 제거 (list의 경우)
    • 제거 (map의 경우)
    • 집합
    • 크기 (list의 경우)
    • 구조체
    • 튜플
    • 합집합 (set의 경우)
    • 값 (map의 경우)
  • [MEDIACAPTURE-STREAMS]는 다음을 정의한다:
    • 컨텍스트가 캡처 중임
  • [PERMISSIONS-POLICY]는 다음을 정의한다:
    • 기본 허용 목록(정책 제어 기능의 경우)
    • 정책 제어 기능
  • [WEBDRIVER2]는 다음을 정의한다:
    • 현재 브라우징 컨텍스트
    • 오류
    • 오류 코드
    • 확장 명령 URI 템플릿
    • 확장 명령
    • 속성 가져오기
    • 기본값을 사용해 속성 가져오기
    • 잘못된 인수
    • 원격 종단 단계
    • 성공
    • 지원되지 않는 작업
  • [WEBIDL]은 다음을 정의한다:
    • 새 프로미스
    • 다음으로 거부된 프로미스
    • AbortError 예외
    • [Default] 확장 속성
    • 기본 toJSON 단계
    • [EnforceRange] 확장 속성
    • [Exposed] 확장 속성
    • FrozenArray 인터페이스
    • getter 단계
    • 호출
    • NotAllowedError 예외
    • NotSupportedError 예외
    • object 유형
    • Promise 인터페이스
    • 반응 (promise의 경우)
    • 거부됨
    • 이행됨
    • [SameObject] 확장 속성
    • [SecureContext] 확장 속성
    • 시퀀스
    • this
    • TypeError 예외
    • undefined 유형
    • unsigned long 유형

B.3 IDL 색인

WebIDLenum PressureSource { "cpu" };

enum PressureState { "nominal", "fair", "serious", "critical" };

callback PressureUpdateCallback = undefined (
  sequence<PressureRecord> changes,
  PressureObserver observer
);

[Exposed=(DedicatedWorker,SharedWorker,Window), SecureContext]
interface PressureObserver {
  constructor(PressureUpdateCallback callback);

  Promise<undefined> observe(PressureSource source, optional PressureObserverOptions options = {});
  undefined unobserve(PressureSource source);
  undefined disconnect();
  sequence<PressureRecord> takeRecords();

  [SameObject] static readonly attribute FrozenArray<PressureSource> knownSources;
};

[Exposed=(DedicatedWorker,SharedWorker,Window), SecureContext]
interface PressureRecord {
  readonly attribute PressureSource source;
  readonly attribute PressureState state;
  readonly attribute DOMHighResTimeStamp time;
  [Default] object toJSON();
};

dictionary PressureObserverOptions {
  [EnforceRange] unsigned long sampleInterval = 0;
};

C. 참고 문헌

C.1 규범적 참고 문헌

[dom]
DOM 표준. Anne van Kesteren. WHATWG. 현행 표준. URL: https://dom.spec.whatwg.org/
[hr-time]
고해상도 시간. Yoav Weiss. W3C. 2026년 3월 24일. W3C 작업 초안. URL: https://www.w3.org/TR/hr-time-3/
[html]
HTML 표준. Anne van Kesteren; Domenic Denicola; Dominic Farolino; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. 현행 표준. URL: https://html.spec.whatwg.org/multipage/
[infra]
Infra 표준. Anne van Kesteren; Domenic Denicola. WHATWG. 현행 표준. URL: https://infra.spec.whatwg.org/
[mediacapture-streams]
미디어 캡처 및 스트림. Cullen Jennings; Jan-Ivar Bruaroey; Henrik Boström; youenn fablet. W3C. 2025년 10월 9일. CRD. URL: https://www.w3.org/TR/mediacapture-streams/
[PERMISSIONS-POLICY]
권한 정책. Ian Clelland. W3C. 2025년 10월 6일. W3C 작업 초안. URL: https://www.w3.org/TR/permissions-policy-1/
[RFC2119]
요구 수준을 나타내기 위해 RFC에서 사용하는 핵심 단어. S. Bradner. IETF. 1997년 3월. 최선의 현행 관행. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC8174]
RFC 2119 핵심 단어에서 대문자와 소문자의 모호성. B. Leiba. IETF. 2017년 5월. 최선의 현행 관행. URL: https://www.rfc-editor.org/rfc/rfc8174
[WEBDRIVER2]
WebDriver. Simon Stewart; David Burns. W3C. 2026년 5월 11일. W3C 작업 초안. URL: https://www.w3.org/TR/webdriver2/
[WEBIDL]
Web IDL 표준. Edgar Chen; Timothy Gu. WHATWG. 현행 표준. URL: https://webidl.spec.whatwg.org/

C.2 비규범적 참고 문헌

[ECMAScript]
ECMAScript 언어 명세. Ecma International. URL: https://tc39.es/ecma262/multipage/