고해상도 시간

W3C 워킹 드래프트

이 문서에 대한 추가 정보
이 버전:
https://www.w3.org/TR/2024/WD-hr-time-3-20241107/
최신 공개 버전:
https://www.w3.org/TR/hr-time-3/
최신 편집자 초안:
https://w3c.github.io/hr-time/
역사:
https://www.w3.org/standards/history/hr-time-3/
커밋 기록
테스트 스위트:
https://wpt.live/hr-time/
구현 보고서:
https://wpt.fyi/hr-time/
편집자:
Yoav Weiss (Google LLC)
이전 편집자:
(Google LLC) - 2021년 3월 1일까지
(Google LLC) - 2015년 1월 1일까지
(Microsoft Corp.) - 2014년 2월 1일까지
피드백:
GitHub w3c/hr-time (풀 리퀘스트, 새 이슈, 오픈 이슈)
브라우저 지원:
caniuse.com

요약

이 명세는 시간의 기준(origin)과 현재 시간을 밀리초 이하의 해상도로 제공하는 API를 정의합니다. 이 시간은 시스템 시계의 변화나 조정에 영향을 받지 않습니다.

이 문서의 상태

이 섹션은 문서가 발행된 시점의 상태를 설명합니다. 현재 W3C 발행물 목록과 최신 기술 보고서 개정판은 W3C 기술 보고서 색인에서 확인할 수 있습니다: https://www.w3.org/TR/.

이 문서는 웹 성능 워킹 그룹에서 권고 트랙을 사용하여 워킹 드래프트로 발행되었습니다.

워킹 드래프트로 발행되었다고 해서 W3C 및 그 회원의 지지를 의미하지는 않습니다.

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

이 문서는 W3C 특허 정책에 따라 운영되는 그룹에서 작성되었습니다. W3C그룹 산출물 관련 공개 특허 목록을 유지하고 있으며, 해당 페이지에는 특허 공개 방법도 안내되어 있습니다. 본인이 필수적 청구(Essential Claim(s))를 포함한다고 생각되는 특허를 알고 있다면, W3C 특허 정책 6절에 따라 정보를 공개해야 합니다.

이 문서는 2023년 11월 3일 W3C 프로세스 문서가 적용됩니다.

1. 소개

이 섹션은 규범적이지 않습니다.

ECMAScript 언어 명세 [ECMA-262]는 Date 객체를 1970년 1월 1일 UTC 이후의 밀리초 단위 시간 값으로 정의합니다. 대부분의 경우, 이러한 시간 정의는 충분하며 해당 값은 1970년 1월 1일 UTC 이후 약 285,616년까지의 임의의 순간을 밀리초 정밀도로 나타낼 수 있습니다.

실제로 이러한 시간 정의는 시계의 드리프트(오차) 및 시스템 시계의 조정에 영향을 받을 수 있습니다. 시간 값이 항상 단조 증가하지 않을 수 있으며, 이후 값이 감소하거나 동일하게 유지될 수 있습니다.

예를 들어, 아래 스크립트에서 계산된 duration은 양수, 음수 또는 0이 될 수 있습니다:

var mark_start = Date.now();
doTask(); // 어떤 작업
var duration = Date.now() - mark_start;

특정 작업에서는 이러한 시간 정의가 충분하지 않을 수 있습니다. 그 이유는:

이 명세는 Date.now() [ECMA-262]의 동작을 변경하는 것을 제안하지 않습니다. 이는 현재 캘린더 시간의 값을 결정하는 데 실제로 유용하며 오랜 기간 활용되어 왔기 때문입니다. DOMHighResTimeStamp 타입, Performance.now() 메서드, 그리고 Performance.timeOrigin 속성들은 Performance 인터페이스에서 위 문제를 해결하며, 밀리초 이하의 해상도를 가진 단조 증가하는 시간 값을 제공합니다.

참고

밀리초 이하의 해상도를 제공하는 것은 이 명세에서 반드시 요구되는 사항이 아닙니다. 구현체에서는 개인정보 보호 및 보안상의 이유로 노출되는 타이머 해상도를 제한하거나, 밀리초 이하의 타이머를 제공하지 않을 수 있습니다. 밀리초 이하의 해상도에 의존하는 사용 사례는 이러한 상황에서 만족되지 않을 수 있습니다.

1.1 사용 사례

이 섹션은 규범적이지 않습니다.

이 명세는 몇 가지 주요 기능을 정의합니다: 안정적인 단조 시계를 기반으로 하는 타임스탬프를 제공하며, 서로 다른 컨텍스트 간에 비교 가능하고, 잠재적으로 밀리초 이하의 해상도를 가집니다.

성능 측정과 관련하여 안정적인 단조 시계가 필요한 이유는, 무관한 시계 드리프트가 측정값을 왜곡시켜 측정이 무의미해질 수 있기 때문입니다. 예를 들어, 문서 탐색, 리소스 가져오기, 스크립트 실행의 경과 시간을 정확하게 측정하려면, 밀리초 이하의 해상도를 가진 단조 증가 시계가 필요합니다.

컨텍스트 간 타임스탬프 비교는 예를 들어 Worker와 메인 스레드 간에 작업을 동기화하거나, 이벤트 타임라인의 통합 뷰를 만들기 위해 계측할 때 필수적입니다.

마지막으로, 밀리초 이하의 타이머가 필요한 대표적인 사용 사례는 다음과 같습니다:

1.2 예시

이 섹션은 규범적이지 않습니다.

개발자는 Worker 또는 SharedWorker와 같이 서로 다른 시간 기준(origin)을 가진 이벤트를 포함하여, 전체 애플리케이션의 타임라인을 구성하고자 할 수 있습니다. 이러한 이벤트를 동일한 타임라인에 표시하기 위해, 애플리케이션은 DOMHighResTimeStampPerformance.timeOrigin 속성을 활용해 변환할 수 있습니다.

// ---- worker.js -----------------------------
// Shared worker 스크립트
onconnect = function(e) {
  var port = e.ports[0];
  port.onmessage = function(e) {
    // 워커에서 작업 실행 시간 측정
    var task_start = performance.now();
    result = runSomeWorkerTask();
    var task_end = performance.now();
  }

  // 결과 및 epoch 기준 타임스탬프를 다른 컨텍스트로 전송
  port.postMessage({
    'task': 'Some worker task',
    'start_time': task_start + performance.timeOrigin,
    'end_time': task_end + performance.timeOrigin,
    'result': result
  });
}

// ---- application.js ------------------------
// 문서에서 작업 타이밍 측정
var task_start = performance.now();
runSomeApplicationTask();
var task_end = performance.now();

// 개발자가 제공한 런타임 성능 데이터 업로드 메서드
reportEventToAnalytics({
  'task': 'Some document task',
  'start_time': task_start,
  'duration': task_end - task_start
});

// 워커 타임스탬프를 문서의 시간 기준(origin)으로 변환
var worker = new SharedWorker('worker.js');
worker.port.onmessage = function (event) {
  var msg = event.data;

  // epoch 기준 타임스탬프를 문서의 시간 기준으로 변환
  msg.start_time = msg.start_time - performance.timeOrigin;
  msg.end_time = msg.end_time - performance.timeOrigin;

  reportEventToAnalytics(msg);
}

2. 시간 개념

2.1 시계

시계는 시간의 흐름을 추적하며 알고리즘 단계가 실행되고 있는 안전하지 않은 현재 시간을 보고할 수 있습니다. 웹 플랫폼에는 다양한 종류의 시계가 있습니다. 모든 웹 플랫폼의 시계는 실제 세계의 1밀리초 시간에 대해 1밀리초의 시계 시간을 세려고 하지만, 정확하게 맞지 않는 경우를 처리하는 방식에는 차이가 있습니다.

2.2 순간과 기간

시계안전하지 않은 현재 시간안전하지 않은 순간을 반환합니다. 시간을 거칠게(coarsen) 변환하면 이 안전하지 않은 순간거칠게 변환된 순간(moment)으로 바뀝니다. 안전하지 않은 순간순간은 서로 다른 시계 간에는 비교할 수 없습니다.

참고

순간안전하지 않은 순간은 시간의 한 지점을 나타내므로, 직접 숫자로 저장할 수 없습니다. 구현체는 일반적으로 순간을 다른 고정된 시간 지점으로부터의 기간(duration)으로 표현하지만, 명세는 순간 자체를 다루어야 합니다.

기간(duration)은 동일한 시계에서 두 순간 사이의 거리입니다. 양 끝점 모두 안전하지 않은 순간이 아니어야 하며, 이렇게 해야 기간이나 기간의 차이가 9.1 시계 해상도에서의 문제를 완화해줍니다. 기간은 밀리초, 초 등으로 측정됩니다. 모든 시계가 동일한 속도로 시간을 세려고 하므로 기간은 특정 시계와 연결되어 있지 않으며, 하나의 시계에서 두 순간으로 계산된 기간을 두 번째 순간에 더해 해당 시계의 또 다른 순간을 얻을 수 있습니다.

기간 계산a에서 b까지의 결과를 다음 알고리즘으로 정의합니다:

  1. Assert: ab는 동일한 시계에서 생성되었습니다.
  2. Assert: ab는 모두 거칠게 변환된 순간입니다.
  3. a에서 b까지의 시간을 기간으로 반환합니다. ba보다 앞서 있으면, 음수 기간을 반환합니다.

기간은 암시적으로 DOMHighResTimeStamp로 사용할 수 있습니다. 기간을 타임스탬프로 암시적 변환기간 d에 대해, d의 밀리초 수를 반환합니다.

3. 명세 작성자를 위한 도구

단일 페이지(하나의 environment settings object 컨텍스트) 내에서 시간을 측정하려면, settingsObject현재 상대 타임스탬프를 사용합니다. 이는 settingsObject시간 기준(origin)에서 settingsObject현재 단조 시간까지의 기간(duration)으로 정의됩니다. 이 값은 기간암시적 변환을 통해 DOMHighResTimeStamp로 자바스크립트에 직접 노출할 수 있습니다.

단일 UA 실행 내에서 시간을 측정할 때 environment settings object시간 기준(origin)이 적합한 기준이 아니면, 현재 단조 시간을 사용하여 순간(moment)을 생성합니다. environment settings object settingsObject현재 단조 시간은 다음 단계의 결과입니다:

  1. unsafeMonotonicTime단조 시계안전하지 않은 현재 시간으로 설정합니다.
  2. unsafeMonotonicTimesettingsObject교차 출처 격리 능력(cross-origin isolated capability)을 사용해 시간 거칠게(coarsen) 변환을 호출한 결과를 반환합니다.

단조 시계순간(moment)은 자바스크립트나 HTTP에서 직접 표현할 수 없습니다. 대신 두 순간 사이의 기간(duration)을 노출합니다.

여러 UA 실행에 걸쳐 시간을 측정하려면, 현재 거칠게 변환된 벽시계 시간(current coarsened wall time)이나 (더 높은 정밀도가 필요한 교차 출처 격리 컨텍스트에서는) environment settings object현재 벽시계 시간(current wall time)을 사용하여 순간(moment)을 생성합니다. 현재 거칠게 변환된 벽시계 시간벽시계안전하지 않은 현재 시간거칠게 변환(coarsen time)한 결과입니다.

environment settings object settingsObject현재 벽시계 시간(current wall time)은 다음 단계의 결과입니다:

  1. unsafeWallTime벽시계안전하지 않은 현재 시간으로 설정합니다.
  2. unsafeWallTimesettingsObject교차 출처 격리 능력을 사용해 시간 거칠게(coarsen) 변환을 호출한 결과를 반환합니다.

벽시계순간(moment)을 사용할 때, 사용자가 시계를 앞으로 또는 뒤로 조정하는 상황을 반드시 고려해야 합니다.

벽시계순간(moment)유닉스 에폭(Unix epoch)으로부터 해당 순간까지의 밀리초 수를 Date 생성자에 전달하거나, 유닉스 에폭으로부터 나노초 수를 순간까지 전달하여 Temporal.Instant 생성자를 사용할 수 있습니다.

컴퓨터 간에 유사한 표현(representation)을 전송하는 것은 피하세요. 이렇게 하면 사용자의 시계 드리프트가 노출되어 추적 벡터(tracking vector)가 될 수 있습니다. 대신 단조 시계(monotonic clock) 순간(moment) 방식처럼 두 순간(moment) 사이의 기간(duration)을 전송하는 방식을 사용하세요.

3.1 예시

DOM 이벤트가 발생한 시간을 다음과 같이 보고할 수 있습니다:

  1. eventtimeStamp 속성을 this관련 settings object(relevant settings object)현재 상대 타임스탬프(current relative timestamp)로 초기화합니다.

오류 보고서의 경과 시간(age)은 다음과 같이 계산할 수 있습니다:

  1. report생성 시간(generation time)settings현재 단조 시간(current monotonic time)으로 초기화합니다.

이후:

  1. data를 다음 키/값 쌍을 갖는 맵으로 설정합니다:
    age
    report생성 시간(generation time)context관련 settings object현재 단조 시간(current monotonic time) 사이의 밀리초 수(가장 가까운 정수로 반올림).
    ...

며칠에 걸친 속성 보고서 만료는 다음과 같이 처리할 수 있습니다:

  1. source를 다음 항목을 갖는 새로운 속성 소스 구조체로 설정합니다:
    ...
    source time
    context현재 벽시계 시간(current wall time)
    expiry
    기간 문자열 파싱(parse a duration string) 결과를 value["expiry"]로부터

며칠 후:

  1. context현재 벽시계 시간(current wall time)source의 source time + source의 expiry보다 작으면, 보고서를 전송합니다.

4. 시간 기준(origin)

유닉스 에폭(Unix epoch)벽시계에서 1970년 1월 1일 00:00:00 UTC에 해당하는 순간(moment)입니다.

어떤 방식으로든 통신할 수 있는 environment settings object 그룹마다 유닉스 에폭의 추정 단조 시간(estimated monotonic time of the Unix epoch)이 있습니다. 이는 단조 시계(monotonic clock)순간(moment)으로, 다음 단계에 따라 초기화됩니다:

  1. wall time벽시계안전하지 않은 현재 시간으로 설정합니다.
  2. monotonic time단조 시계안전하지 않은 현재 시간으로 설정합니다.
  3. epoch timemonotonic time - (wall time - 유닉스 에폭)으로 설정합니다.
  4. 유닉스 에폭의 추정 단조 시간epoch time을 사용해 시간 거칠게(coarsen) 변환을 호출한 결과로 초기화합니다.
Issue 1
위의 settings-object 집합에 대한 정의가 더 명확하게 지정될 필요가 있습니다. 이는 familiar with와 유사하지만, Worker도 포함됩니다.

성능 측정값은 관련 environment settings object의 초기화 시점에 초기 순간(moment)으로부터의 기간(duration)을 보고합니다. 해당 순간(moment)은 해당 settings object의 시간 기준(time origin)에 저장됩니다.

시간 기준 타임스탬프 가져오기(get time origin timestamp)global object global이 주어졌을 때, 다음 단계를 실행해 기간(duration)을 반환합니다:

  1. timeOriginglobal관련 settings object(relevant settings object)시간 기준(time origin)으로 설정합니다.

    참고

    Window 컨텍스트에서는 이 값이 내비게이션이 시작된 시점을 나타냅니다. WorkerServiceWorker 컨텍스트에서는 워커가 실행된 시점을 나타냅니다. [service-workers]

  2. 유닉스 에폭의 추정 단조 시간에서 timeOrigin까지의 기간(duration)을 반환합니다.
참고

시간 기준 타임스탬프 가져오기(get time origin timestamp)가 반환하는 값은 global시간 기준(time origin)유닉스 에폭 이후에 발생한 시간에 근접한 값입니다. 이 값은 Date.now()를 해당 시점에 실행한 값과 다를 수 있는데, 전자는 시스템 및 사용자 시계 조정, 시계 드리프트 등에 영향을 받지 않는 단조 시계(monotonic clock) 기준으로 기록되기 때문입니다.

시간 거칠게(coarsen) 변환 알고리즘은, 안전하지 않은 순간(timestamp) timestamp과 선택적 boolean crossOriginIsolatedCapability(기본값 false)가 주어졌을 때 다음 단계를 실행합니다:
  1. time resolution을 100마이크로초, 또는 더 높은 구현 정의(implementation-defined) 값으로 설정합니다.
  2. crossOriginIsolatedCapability가 true이면, time resolution을 5마이크로초 또는 더 높은 구현 정의 값으로 설정합니다.
  3. 구현 정의 방식으로 timestamp를 거칠게(coarsen) 변환하고, 필요하다면 지터(jitter)를 적용하여 해상도가 time resolution을 초과하지 않도록 합니다.
  4. timestamp순간(moment)으로 반환합니다.
상대적 고해상도 시간(relative high resolution time)단조 시계(monotonic clock)안전하지 않은 순간(time)과, global object global이 주어졌을 때, 다음 단계를 실행해 기간(duration)을 반환합니다:
  1. coarse time시간 거칠게(coarsen) 변환으로 timeglobal관련 settings object(relevant settings object)교차 출처 격리 능력(cross-origin isolated capability)을 사용해 호출한 결과로 설정합니다.
  2. coarse timeglobal을 사용해 상대적 고해상도 거칠게 변환 시간(relative high resolution coarse time)을 반환합니다.
상대적 고해상도 거칠게 변환 시간(relative high resolution coarse time)단조 시계순간(coarseTime)과, global object global이 주어졌을 때, global관련 settings object(relevant settings object)시간 기준(time origin)에서 coarseTime까지의 기간(duration)을 반환합니다.

현재 고해상도 시간(current high resolution time)global object current global이 주어졌을 때, 상대적 고해상도 시간(relative high resolution time)안전하지 않은 공유 현재 시간(unsafe shared current time)current global을 인자로 호출한 결과를 반환해야 합니다.

거칠게 변환된 공유 현재 시간(coarsened shared current time)은 선택적 boolean crossOriginIsolatedCapability(기본값 false)를 받아, 안전하지 않은 공유 현재 시간crossOriginIsolatedCapability를 사용해 시간 거칠게(coarsen) 변환을 호출한 결과를 반환해야 합니다.

안전하지 않은 공유 현재 시간(unsafe shared current time)단조 시계(monotonic clock)안전하지 않은 현재 시간을 반환해야 합니다.

5. DOMHighResTimeStamp 타입 정의

DOMHighResTimeStamp 타입은 밀리초 단위의 기간(duration)을 저장하는 데 사용됩니다. 문맥에 따라, 이는 순간(moment)을 나타내기도 하며, 해당 기간(duration)기준 순간(base moment) 이후의 시점(예: 시간 기준(origin) 또는 유닉스 에폭)을 나타낼 수 있습니다.

WebIDLtypedef double DOMHighResTimeStamp;

DOMHighResTimeStamp는 측정을 허용할 만큼 충분히 정확한 밀리초 단위의 시간을 나타내야 하지만, 타이밍 공격을 방지할 수 있도록 해야 합니다. 자세한 고려 사항은 9.1 시계 해상도를 참고하세요.

참고

DOMHighResTimeStampdouble이므로, 유닉스 에폭(Unix epoch)부터 특정 순간(moment)까지의 밀리초 수를 유한한 해상도로만 표현할 수 있습니다. 2023년의 순간(moment)에 대해, 그 해상도는 약 0.2마이크로초입니다.

6. EpochTimeStamp 타입 정의

WebIDLtypedef unsigned long long EpochTimeStamp;
참고: 레거시 플랫폼 기능

EpochTimeStamp유닉스 에폭에서 특정 순간(moment)까지의 정수 밀리초 수를 벽시계 기준으로 나타냅니다. 윤초(leap seconds)는 포함하지 않습니다. 이 타입을 사용하는 명세에서는 밀리초 값의 해석 방법을 정의합니다.

7. Performance 인터페이스

WebIDL[Exposed=(Window,Worker)]
interface Performance : EventTarget {
    DOMHighResTimeStamp now();
    readonly attribute DOMHighResTimeStamp timeOrigin;
    [Default] object toJSON();
};

7.1 now() 메서드

now() 메서드는 반드시(MUST) 현재 고해상도 시간(current high resolution time)에서 this관련 글로벌 객체(relevant global object)에 대해 밀리초 단위의 기간(duration) 값을 반환해야 합니다.

동일한 시간 기준(time origin)을 가진 Performance 객체에서 now() 메서드를 호출할 때 반환되는 시간 값들은 반드시(MUST) 동일한 단조 시계(monotonic clock)를 사용해야 합니다. 동일한 시간 기준(time origin)을 가진 now() 메서드에서 시간 값을 연속적으로 기록했을 때, 두 값의 차이는 절대 음수가 되어서는 안 됩니다(MUST never be negative).

7.2 timeOrigin 속성

timeOrigin 속성은 반드시(MUST) 기간(duration)시간 기준 타임스탬프(get time origin timestamp)에서 관련 글로벌 객체(relevant global object)에 대해 반환해야 합니다.

Performance.timeOrigin을 가져올 때 반환되는 시간 값들은 반드시(MUST) 단조 시계(monotonic clock)를 사용해야 하며, 이 시계는 시간 기준(time origin)이 공유하는 기준점이고, [ECMA-262] time 정의를 기준으로 합니다. 자세한 내용은 9. 보안 고려사항(Security Considerations)을 참고하세요.

7.3 toJSON() 메서드

toJSON()를 호출하면, [WEBIDL]의 기본 toJSON 단계(default toJSON steps)를 실행합니다.

8. WindowOrWorkerGlobalScope 믹스인 확장

8.1 performance 속성

인터페이스 믹스인 performance 속성은 WindowOrWorkerGlobalScope에서 성능 관련 속성과 메서드에 글로벌 객체(global object)를 통해 접근할 수 있게 해줍니다.

WebIDLpartial interface mixin WindowOrWorkerGlobalScope {
  [Replaceable] readonly attribute Performance performance;
};

9. 보안 고려사항

9.1 시계 해상도

정확한 타이밍 정보에 접근하는 것은 측정이나 스케줄링 목적 모두에서 많은 애플리케이션에 일반적으로 필요한 요구입니다. 예를 들어, 애니메이션, 사운드 및 기타 활동을 페이지에서 조정하려면 좋은 사용자 경험을 위해 고해상도 시간에 접근해야 합니다. 마찬가지로, 측정은 개발자가 중요한 코드 컴포넌트의 성능을 추적하고, 리그레션을 감지하는 데 도움이 됩니다.

하지만 동일한 정확한 타이밍 정보에 접근하는 것은 때때로 공격자가 볼 수 없거나 접근할 수 없는 데이터를 추측하거나 유추하는 악의적 목적으로도 사용될 수 있습니다. 예를 들어, 캐시 공격, 통계적 지문 채취, 마이크로 아키텍처 공격은 프라이버시 및 보안 문제이며 악의적인 웹사이트가 다양한 브라우저 또는 애플리케이션 시작 작업의 고해상도 타이밍 데이터를 사용해 사용자 집합을 구분하거나 특정 사용자를 식별하거나 관련 없는 동일 프로세스의 사용자 데이터를 드러낼 수 있습니다. 더 자세한 내용은 [CACHE-ATTACKS] 와 [SPECTRE]을 참고하세요.

이 명세는 이전에 EpochTimeStamp로 노출되던 밀리초 해상도보다 더 정확한 밀리초 이하 해상도를 제공하는 API를 정의합니다. 하지만, 이 새로운 API가 없어도 공격자는 반복 실행과 통계 분석을 통해 고해상도 추정치를 얻을 수 있습니다.

이 새로운 API가 이러한 공격의 정확도 또는 속도를 크게 향상시키지 않도록, DOMHighResTimeStamp 타입의 최소 해상도는 공격을 방지할 만큼 충분히 부정확해야 합니다.

필요하다면, 사용자 에이전트는 시간 거칠게(coarsen) 변환 처리 모델에서 time resolution 값을 더 높게 설정해 아키텍처나 소프트웨어 제약, 기타 고려사항에 따른 프라이버시 및 보안 문제를 해결해야 합니다.

이러한 공격을 완화하기 위해 사용자 에이전트는 필요하다고 판단하는 모든 기법을 적용할 수 있습니다. 이러한 기법의 배포는 브라우저 아키텍처, 사용자 기기, 콘텐츠 및 교차 출처 데이터의 악의적 읽기 능력, 기타 실제적 고려사항에 따라 달라질 수 있습니다.

이러한 기법에는 다음이 포함될 수 있습니다:

이러한 타이밍 측면 채널 공격을 완전히 방지하는 것은 실질적으로 불가능합니다: 모든 작업이 어떠한 비밀 정보 값에도 영향을 받지 않는 시간 내에 실행되어야 하거나, 애플리케이션이 모든 시간 관련 프리미티브(시계, 타이머, 카운터 등)로부터 격리되어야 합니다. 어느 쪽도 브라우저와 애플리케이션 개발자에게 복잡성을 야기하며, 애플리케이션의 성능 및 반응성에 부정적인 영향을 미치므로 현실적이지 않습니다.

참고
시계 해상도는 해결되지 않았으며 계속 연구 중인 분야로, 모든 브라우저에 적용되는 기존 업계 합의나 확정적인 권고 사항이 없습니다. 논의 상황을 추적하려면 Issue 79를 참고하세요.

9.2 시계 드리프트

이 명세는 시간 기준(origin)의 0시점에 대한 밀리초 이하 해상도를 제공하는 API도 정의하며, 애플리케이션에 단조 시계(monotonic clock)를 노출해야 하며, 브라우저의 모든 컨텍스트에서 공유되어야 합니다. 단조 시계(monotonic clock)는 물리적 시간에 반드시 연결될 필요는 없지만, [ECMA-262]의 time 정의를 기준으로 설정하는 것이 사용자의 새로운 지문 엔트로피 노출을 피하는 데 권장됩니다. 예를 들어, 이 시간은 이미 애플리케이션이 쉽게 얻을 수 있지만, 새로운 논리 시계를 노출하면 새로운 정보가 제공됩니다.

하지만 위의 메커니즘이 있더라도, 단조 시계(monotonic clock)는 추가적인 시계 드리프트(clock drift) 해상도를 제공할 수 있습니다. 오늘날 애플리케이션은 동일 컨텍스트 내에서 시각(time-of-day)과 단조 시간 값을 (Date.now()now()를 통해) 여러 시점에 타임스탬핑하고, 자동 또는 사용자 시계 조정 등으로 인한 드리프트를 관찰할 수 있습니다. timeOrigin 속성을 사용하면 공격자가 시간 기준(time origin)단조 시계(monotonic clock) 기준으로 보고, 현재 시각 추정치와 비교할 수 있습니다(즉, performance.timeOriginDate.now() - performance.now()의 차이). 이를 통해 장기간에 걸쳐 두 시계 사이의 드리프트를 관찰할 수 있습니다.

실제로 동일한 시간 드리프트는 애플리케이션이 여러 번 내비게이션을 거치면서도 관찰할 수 있습니다: 애플리케이션은 각 컨텍스트에서 논리 시간을 기록하고, 클라이언트 또는 서버의 시간 동기화 메커니즘을 사용해 사용자의 시계 변화를 추론할 수 있습니다. 마찬가지로 TCP 타임스탬프와 같은 하위 계층의 메커니즘으로도 여러 번 방문하지 않고도 서버에 동일한 고해상도 정보를 노출할 수 있습니다. 따라서 이 API가 제공하는 정보는 사용자의 중요한 또는 이전에 노출되지 않았던 엔트로피를 추가로 노출해서는 안 됩니다.

10. 개인정보 보호 고려사항

시간 기준(time origin)의 현재 정의는 Document에 대해, 문서의 origin에 요청이 도달하기 전까지의 교차 출처 리디렉트의 총 시간을 노출합니다. 이로 인해 교차 출처 정보가 노출되지만, 성능 메트릭에 중대한 손상을 주지 않고 이를 완화하는 방법은 아직 결정되지 않았습니다.

논의 상황을 추적하려면 Navigation Timing Issue 160을 참고하세요.

11. 적합성(Conformance)

비규범적(non-normative)으로 표시된 섹션뿐만 아니라, 이 명세의 모든 저작 지침, 다이어그램, 예시, 참고 사항도 비규범적입니다. 그 외 이 명세의 모든 내용은 규범적입니다.

이 문서의 MUSTSHOULD라는 키워드는 BCP 14 [RFC2119] [RFC8174] 에서 설명된 대로, 오직 대문자로 나타날 때만 해당 의미로 해석되어야 합니다.

일부 적합성 요구사항은 속성, 메서드 또는 객체에 대한 요구사항으로 표현됩니다. 이러한 요구사항은 사용자 에이전트(user agent)에 대한 요구사항으로 해석되어야 합니다.

A. 색인(Index)

A.1 이 명세에서 정의된 용어

A.2 참조로 정의된 용어

B. IDL 색인(IDL Index)

WebIDLtypedef double DOMHighResTimeStamp;

typedef unsigned long long EpochTimeStamp;

[Exposed=(Window,Worker)]
interface Performance : EventTarget {
    DOMHighResTimeStamp now();
    readonly attribute DOMHighResTimeStamp timeOrigin;
    [Default] object toJSON();
};

partial interface mixin WindowOrWorkerGlobalScope {
  [Replaceable] readonly attribute Performance performance;
};

C. 감사의 글

이 작업에 기여해 주신 Arvind Jain, Angelos D. Keromytis, Boris Zbarsky, Jason Weber, Karen Anderson, Nat Duca, Philippe Le Hegaret, Ryosuke Niwa, Simha Sethumadhavan, Todd Reifsteck, Tony Gentilcore, Vasileios P. Kemerlis, Yoav Weiss, 그리고 Yossef Oren께 감사드립니다.

D. 참고 문헌

D.1 규범적 참고 문헌

[dom]
DOM 표준. Anne van Kesteren. WHATWG. 현행 표준. URL: https://dom.spec.whatwg.org/
[ECMA-262]
ECMAScript 언어 명세. Ecma International. URL: https://tc39.es/ecma262/multipage/
[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/
[RFC2119]
RFC에서 요구 수준을 나타내기 위한 키워드. S. Bradner. IETF. 1997년 3월. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC8174]
RFC 2119 키워드의 대소문자 모호성. B. Leiba. IETF. 2017년 5월. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc8174
[SPECTRE]
Spectre 공격: 추측 실행 악용. Paul Kocher; Jann Horn; Anders Fogh; Daniel Genkin; Daniel Gruss; Werner Haas; Mike Hamburg; Moritz Lipp; Stefan Mangard; Thomas Prescher; Michael Schwarz; Yuval Yarom. 2018년 1월. URL: https://spectreattack.com/spectre.pdf
[Temporal]
Temporal. ECMA TC39. Stage 3 Proposal. URL: https://tc39.es/proposal-temporal/
[WEBIDL]
Web IDL 표준. Edgar Chen; Timothy Gu. WHATWG. 현행 표준. URL: https://webidl.spec.whatwg.org/

D.2 참고용 참고 문헌

[CACHE-ATTACKS]
자바스크립트에서의 실질적인 캐시 공격 - 샌드박스의 스파이. Yossef Oren; Vasileios P. Kemerlis; Simha Sethumadhavan; Angelos D. Keromytis. 2015년 3월 1일. URL: https://arxiv.org/abs/1502.07373
[reporting]
Reporting API. Douglas Creager; Ian Clelland; Mike West. W3C. 2024년 8월 13일. W3C 워킹 드래프트. URL: https://www.w3.org/TR/reporting-1/
[service-workers]
Service Workers. Jake Archibald; Marijn Kruisselbrink. W3C. 2022년 7월 12일. W3C 후보 권고안. URL: https://www.w3.org/TR/service-workers/