내비게이션 타이밍 레벨 2

W3C 워킹 드래프트,

이 문서에 대한 자세한 정보
이 버전:
https://www.w3.org/TR/2026/WD-navigation-timing-2-20260901/
최신 공개 버전:
https://www.w3.org/TR/navigation-timing-2/
편집자 초안:
https://w3c.github.io/navigation-timing/
이전 버전:
히스토리:
https://www.w3.org/standards/history/navigation-timing-2/
피드백:
public-web-perf@w3.org 제목 줄에 “[navigation-timing-2] … 메시지 주제 …” 포함 (아카이브)
GitHub
테스트 스위트:
https://wpt.fyi/navigation-timing/
편집자:
Yoav Weiss (Shopify)
(Google)
이전 편집자:
Ilya Grigorik (Google)
(Microsoft Corp.)
(Microsoft Corp.)
(Google Inc.)

요약

이 명세서는 웹 애플리케이션이 문서의 내비게이션 전체 타이밍 정보를 접근할 수 있는 인터페이스를 정의합니다.

이 문서의 상태

이 섹션은 이 문서가 발행된 시점의 상태를 설명합니다. 현재 W3C 발행 목록과 이 기술 보고서의 최신 개정판은 W3C 표준 및 초안 인덱스에서 확인할 수 있습니다.

이 문서는 웹 성능 워킹 그룹에서 워킹 드래프트로 권고 단계를 사용하여 발행되었습니다. 워킹 드래프트로 발행된다고 해서 W3C와 회원들이 이를 승인했다는 의미는 아닙니다.

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

GitHub 이슈는 이 명세서 논의에 가장 적합합니다.

이 문서는 2025년 8월 18일 W3C 프로세스 문서에 따라 관리됩니다.

이 문서는 W3C 특허 정책 하에 운영되는 그룹에서 작성되었습니다. W3C는 그룹의 산출물과 관련하여 공개된 모든 특허 공개 목록을 유지합니다. 그 페이지에는 특허 공개 방법에 대한 안내도 포함되어 있습니다. 실제로 특허에 대해 알고 있으며 그 특허가 필수 청구항이 포함되어 있다고 생각하는 경우, W3C 특허 정책 6번 섹션에 따라 정보를 공개해야 합니다.

Navigation Timing 2는 [NAVIGATION-TIMING]의 첫 번째 버전을 대체하며, 다음과 같은 변경 사항이 포함됩니다:

1. 소개

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

웹 애플리케이션의 성능 특성을 정확하게 측정하는 것은 웹 애플리케이션을 더 빠르게 만드는 중요한 요소입니다. [JSMEASURE]에 설명된 JavaScript 기반 방법은 사용자 레이턴시 측정을 위해 애플리케이션 내에서 포괄적인 계측을 제공할 수 있지만, 많은 경우에 전체 또는 상세한 엔드 투 엔드 레이턴시 정보를 제공하지 못합니다. 예를 들어, 다음 JavaScript는 페이지를 완전히 로드하는 데 걸리는 시간을 측정하려는 순진한 시도를 보여줍니다:

<html>
<head>
<script type="text/javascript">
var start = new Date().getTime();
function onLoad() {
  var now = new Date().getTime();
  var latency = now - start;
  alert("page loading time: " + latency);
}
</script>
</head>
<body onload="onLoad()">
<!- Main page body goes from here. -->
</body>
</html>

위 스크립트는 head에서 첫 번째 JavaScript가 실행된 이후 페이지 로드 시간을 계산하지만, 서버에서 페이지를 가져오는 시간이나 페이지 초기화 라이프사이클에 대한 정보는 제공하지 않습니다.

이 명세서는 PerformanceNavigationTiming 인터페이스를 정의하며, [PERFORMANCE-TIMELINE-2]에 참여하여 문서 내비게이션과 관련된 고해상도 성능 메트릭 데이터를 저장하고 검색할 수 있도록 합니다. PerformanceNavigationTiming 인터페이스는 [HR-TIME]를 사용하므로, 모든 시간 값은 엔트리의 타임 오리진을 기준으로 측정됩니다. 관련 설정 객체의 타임 오리진을 기준으로 측정됩니다.

예를 들어, 응답 끝이 내비게이션 시작 후 100ms에 발생한다면, PerformanceNavigationTiming 데이터는 다음과 같을 수 있습니다:

startTime:           0.000  // 내비게이션 요청의 시작 시간
responseEnd:       100.000  // 마지막 바이트가 수신된 고해상도 시간

다음 스크립트는 개발자가 PerformanceNavigationTiming 인터페이스를 사용하여 문서 내비게이션과 관련된 정확한 타이밍 데이터를 얻는 방법을 보여줍니다:

<script>
function showNavigationDetails() {
  // 첫 번째 엔트리 가져오기
  const [entry] = performance.getEntriesByType("navigation");
  // 개발자 콘솔에서 표로 보기
  console.table(entry.toJSON());
}
</script>
<body onload="showNavigationDetails()">

2. 용어

구문 "a Foo object"는 실제로 Foo가 인터페이스인 경우, 더 정확한 "인터페이스 Foo를 구현하는 객체" 대신에 사용되기도 합니다.

current document 용어는 Window 객체의 최신 Document 객체와 연관된 문서를 의미합니다.

본 명세 전체에서, 모든 시간 값은 문서 내비게이션 시작 이후의 밀리초 단위로 측정됩니다. 예를 들어 문서 내비게이션 시작은 시간 0에 발생합니다. 현재 시간 용어는 문서 내비게이션 시작부터 현재 시점까지의 밀리초 수를 의미합니다. 이러한 시간 정의는 [HR-TIME] 명세에 기반합니다.

3. 내비게이션 타이밍

3.1. PerformanceEntry 인터페이스와의 관계

PerformanceNavigationTiming 인터페이스는 다음 PerformanceEntry 인터페이스의 속성을 확장합니다:

PerformanceNavigationTiming을 구현하는 사용자 에이전트는 Window 컨텍스트의 supportedEntryTypes에 "navigation"을 포함해야 합니다. 이를 통해 개발자는 Navigation Timing 지원 여부를 감지할 수 있습니다.

3.2. PerformanceResourceTiming 인터페이스와의 관계

PerformanceNavigationTiming 인터페이스는 다음 PerformanceResourceTiming 인터페이스의 속성을 확장합니다:

현재 문서 리소스만 성능 타임라인에 포함되며, 성능 타임라인에는 단 하나의 PerformanceNavigationTiming 객체만 있습니다.

3.3. PerformanceNavigationTiming 인터페이스

HTTP 캐시 [RFC9111]에서 콘텐츠를 확인하고 가져오는 작업은 fetching 프로세스의 일부입니다. 이는 requestStart, responseStart 및 responseEnd 속성에 포함됩니다.
[Exposed=Window]
interface PerformanceNavigationTiming : PerformanceResourceTiming {
    readonly        attribute DOMHighResTimeStamp  unloadEventStart;
    readonly        attribute DOMHighResTimeStamp  unloadEventEnd;
    readonly        attribute DOMHighResTimeStamp  domInteractive;
    readonly        attribute DOMHighResTimeStamp  domContentLoadedEventStart;
    readonly        attribute DOMHighResTimeStamp  domContentLoadedEventEnd;
    readonly        attribute DOMHighResTimeStamp  domComplete;
    readonly        attribute DOMHighResTimeStamp  loadEventStart;
    readonly        attribute DOMHighResTimeStamp  loadEventEnd;
    readonly        attribute NavigationTimingType type;
    readonly        attribute unsigned short       redirectCount;
    readonly        attribute DOMHighResTimeStamp  criticalCHRestart;
    readonly        attribute NotRestoredReasons?  notRestoredReasons;
    readonly        attribute PerformanceTimingConfidence confidence;
    [Default] object toJSON();
};

PerformanceNavigationTiming에는 연관된 문서 로드 타이밍 정보 문서 로드 타이밍이 있습니다.

PerformanceNavigationTiming에는 연관된 문서 언로드 타이밍 정보 이전 문서 언로드 타이밍이 있습니다.

PerformanceNavigationTiming에는 연관된 숫자 리디렉션 횟수가 있습니다.

PerformanceNavigationTiming에는 연관된 NavigationTimingType 탐색 유형이 있습니다.

PerformanceNavigationTiming에는 연관된 DOMHighResTimeStamp `Critical-CH` 재시작 시간이 있습니다.

PerformanceNavigationTiming에는 연관된 NotRestoredReasons 복원되지 않은 이유가 있습니다.

PerformanceNavigationTiming에는 연관된 PerformanceTimingConfidence 신뢰도 값이 있습니다.

PerformanceNavigationTiming에는 연관된 실수 무작위화된 트리거 비율이 있으며, 이는 구현에서 정의됩니다.

PerformanceNavigationTiming에는 연관된 PerformanceTimingConfidenceValue 기저 신뢰도 값이 있으며, 이는 구현에서 정의됩니다.

PerformanceNavigationTiming에는 연관된 null 또는 서비스 워커 타이밍 정보 서비스 워커 타이밍이 있습니다.

unloadEventStart getter 단계에서는 this의 이전 문서 언로드 타이밍의 언로드 이벤트 시작 시간을 반환합니다.

이전 문서와 현재 문서의 출처가 같으면, 이 타임스탬프는 사용자 에이전트가 이전 문서의 unload 이벤트를 시작하기 직전에 측정됩니다. 이전 문서가 없거나 이전 문서의 출처가 현재 문서와 다르면, 이 속성은 0을 반환합니다.

unloadEventEnd getter 단계에서는 this의 이전 문서 언로드 타이밍의 언로드 이벤트 종료 시간을 반환합니다.

이전 문서와 현재 문서의 출처가 같으면, 이 타임스탬프는 사용자 에이전트가 이전 문서의 unload 이벤트를 처리한 직후에 측정됩니다. 이전 문서가 없거나 이전 문서의 출처가 현재 문서와 다르면, 이 속성은 0을 반환합니다.

domInteractive getter 단계에서는 this의 문서 로드 타이밍의 DOM 대화형 시간을 반환합니다.

이 타임스탬프는 사용자 에이전트가 현재 문서 준비 상태를 "interactive"로 설정하기 전에 측정됩니다.

domContentLoadedEventStart getter 단계에서는 this의 문서 로드 타이밍의 DOM 콘텐츠 로드 이벤트 시작 시간을 반환합니다.

이 타임스탬프는 사용자 에이전트가 DOMContentLoaded 이벤트를 디스패치하기 전에 측정됩니다.

domContentLoadedEventEnd getter 단계에서는 this의 문서 로드 타이밍의 DOM 콘텐츠 로드 이벤트 종료 시간을 반환합니다.

이 타임스탬프는 사용자 에이전트가 DOMContentLoaded 이벤트 처리를 완료한 후 측정됩니다.

domComplete getter 단계에서는 this의 문서 로드 타이밍의 DOM 완료 시간을 반환합니다.

이 타임스탬프는 사용자 에이전트가 현재 문서 준비 상태를 "complete"로 설정하기 전에 측정됩니다. 정확한 정의는 문서 준비 상태를 참조하십시오.

loadEventStart getter 단계에서는 this의 문서 로드 타이밍의 load 이벤트 시작 시간을 반환합니다.

이 타임스탬프는 사용자 에이전트가 문서에 대해 load 이벤트를 디스패치하기 전에 측정됩니다.

loadEventEnd getter 단계에서는 this의 문서 로드 타이밍의 load 이벤트 종료 시간을 반환합니다.

이 타임스탬프는 사용자 에이전트가 문서의 load 이벤트 처리를 완료한 후 측정됩니다.

type getter 단계에서는 this의 탐색 유형을 반환합니다.

Refresh pragma 지시문을 사용하는 것과 같은 클라이언트 측 리디렉션은 이 명세에서 HTTP 리디렉션으로 간주되지 않습니다. 이러한 경우 type 속성은 현재 페이지를 다시 로드하는 경우 reload와 같은 적절한 값을 반환해야 하며, 새 URL로 탐색하는 경우 navigate와 같은 값을 반환해야 합니다.

redirectCount getter 단계에서는 this의 리디렉션 횟수를 반환합니다.

criticalCHRestart getter 단계에서는 this의 `Critical-CH` 재시작 시간을 반환합니다.

criticalCHRestart가 0이 아니면 navigationStart, unloadEventStart, unloadEventEnd를 제외한 다른 모든 타임스탬프보다 앞섭니다. 이는 탐색의 리디렉션 부분이 다시 시작된 시점을 나타내기 때문입니다.

notRestoredReasons getter 단계에서는 this의 복원되지 않은 이유를 반환합니다.

confidence getter 단계에서는 다음 단계를 실행합니다:

  1. this의 문서 로드 타이밍의 DOM 대화형 시간이 0이면 null을 반환합니다.
  2. this의 신뢰도 값이 null이 아니면, 이를 반환합니다.
  3. confidence를 this의 관련 설정 객체의 관련 Realm에서 생성된 새로운 PerformanceTimingConfidence 객체로 설정합니다.
  4. confidence의 randomizedTriggerRate를 this의 무작위화된 트리거 비율로 설정합니다.
  5. 다음 알고리즘에서 결정한 값으로 confidence의 value를 설정합니다:
    1. p를 confidence의 randomizedTriggerRate로 설정합니다.
    2. underlying을 this의 기저 신뢰도 값, 즉 PerformanceTimingConfidenceValue로 설정합니다.
    3. r을 구간 [0, 1)에서 균등 무작위로 추출한 실수로 설정합니다.
    4. r이 p보다 크거나 같으면 underlying을 반환합니다.
    5. 그렇지 않으면:
      1. s를 집합 {0, 1}에서 균등 무작위로 추출한 정수로 설정합니다.
      2. s가 0이면 high를 반환합니다.
      3. 그렇지 않으면 low를 반환합니다.
  6. confidence를 반환합니다.

이 값들은 한 번만 정해지고, this의 수명 동안 변경되지 않아야 합니다.

이 섹션은 RUM 제공자와 개발자가 confidence를 해석하는 데 도움이 되도록 작성되었습니다. randomized trigger rate가 레코드마다 다를 수 있기 때문에 편향 없는 집계를 복원하려면 레코드별 가중치가 필요합니다. 아래 절차는 value 기반 가중치 적용 방법을 요약 통계 산출 전에 보여줍니다.

high 및 low 모두에 대해 편향 보정 평균을 계산하려면:

  1. 각 레코드마다:
    • p를 해당 레코드의 randomizedTriggerRate로 지정합니다.
    • c를 해당 레코드의 value로 지정합니다.
    • R을 c가 high일 때 1, 아니면 0으로 지정합니다.
    • c에 따라 레코드별 가중치 w를 계산합니다:
      • High 평균 추정시: w = (R - (p / 2)) / (1 - p)
      • Low 평균 추정시: w = ((1 - R) - (p / 2)) / (1 - p)
      w가 음수일 수 있습니다; 모든 레코드를 유지하십시오.
    • weighted_duration = duration * w
  2. total_weighted_duration을 모든 레코드의 weighted_duration 합으로 지정합니다.
  3. sum_weights를 모든 레코드의 w 값 합으로 지정합니다.
  4. debiased_mean = total_weighted_duration / sum_weights, 즉 sum_weights가 0에 가까워지지 않았을 때 계산합니다.

high 및 low 모두에 대해 편향 보정 분위수를 계산하려면:

  1. 편향 보정 평균 계산과 동일하게 레코드별 가중치 w를 구합니다.
  2. sum_weights를 모든 레코드의 w 합으로 지정합니다.
  3. sorted_records를 모든 레코드에서 duration 값 기준으로 오름차순 정렬한 것으로 지정합니다.
  4. 원하는 percentile(0-100)에 대해 q = percentile / 100.0
  5. sorted_records를 순회하며 각 레코드마다:
    • 레코드별 누적 가중치 cw 계산: cw = sum_{i: duration_i <= duration_j} w_i
    • 레코드별 편향 보정 누적 분포 함수: cdf = cw / sum_weights
  6. cdf ≥ q인 처음 인덱스 idx를 찾습니다.
    • idx가 0이면 duration for sorted_records[0] 반환
    • 해당 인덱스가 없으면 duration for sorted_records[n] 반환
  7. 보간 비율 계산:
    • lower_cdf를 sorted_records[idx-1]의 cdf로 지정
    • upper_cdf를 sorted_records[idx]의 cdf로 지정
    • lower_cdf = upper_cdf면 duration for sorted_records[idx] 반환
    • 아니면:
      • ifrac = (q - lower_cdf) / (upper_cdf - lower_cdf)
      • lower_duration을 duration for sorted_records[idx-1]로 지정
      • upper_duration을 duration for sorted_records[idx]로 지정
      • lower_duration + (upper_duration - lower_duration) * ifrac 반환

toJSON() 메서드는 기본 toJSON 단계를 this에 대해 실행합니다.

3.3.1. NavigationTimingType 열거형

enum NavigationTimingType {
    "navigate",
    "reload",
    "back_forward"
};

값 정의는 다음과 같습니다:

navigate
히스토리 처리 동작이 "default" 또는 "replace"로 설정된 내비게이션.
reload
navigable이 재로드(reload)된 내비게이션.
back_forward
히스토리에서 적용된 내비게이션.

위 열거형 값의 형식은 WebIDL의 열거형 값 포맷 권고와 일치하지 않습니다. 이미 출시된 구현과의 하위 호환성 문제로 변경할 수 없습니다. [WebIDL]

3.3.2. PerformanceTimingConfidence 인터페이스

[Exposed=Window]
interface PerformanceTimingConfidence {
    readonly attribute double randomizedTriggerRate;
    readonly attribute PerformanceTimingConfidenceValue value;
    object toJSON();
};
randomizedTriggerRate, 형식은 double이며, 읽기 전용입니다

이 속성은 [0, 1) 구간의 실수를 반환해야 하며, 신뢰도 value를 노출할 때 노이즈가 얼마나 자주 적용되는지를 나타냅니다.

value, 형식은 PerformanceTimingConfidenceValue이며, 읽기 전용입니다

이 속성은 PerformanceTimingConfidenceValue를 반환해야 합니다.

toJSON()

이 메서드는 this에 대해 기본 toJSON 단계를 실행합니다.

3.3.3. PerformanceTimingConfidenceValue 열거형

enum PerformanceTimingConfidenceValue {
  "high",
  "low"
};

값 정의는 다음과 같습니다:

high
사용자 에이전트가 내비게이션 메트릭이 현재 사용자의 장치를 대표한다고 간주함.
low
내비게이션 메트릭이 반드시 현재 사용자의 장치를 대표하지 않을 수 있습니다. 사용자 에이전트는 장치 상태나 사용자 설정을 고려할 수 있습니다.

underlying confidence value를 결정할 때, 사용자 에이전트는 반드시 일시적 런타임 조건 (예: 사용자 에이전트 시작, 일시적 CPU 사용량 급등, 메모리 압박 등)만을 고려해야 합니다.

사용자 에이전트는 underlying confidence value 기준을 영구적인 장치 또는 프로필 특성(예: 물리적 RAM 용량, CPU 코어 수, 설치된 확장 개수, 기타 정적 환경 설정 등)에 두어서는 안 됩니다.

confidence 값은 시스템 성능보다는 런타임 변동성을 반영하기 위한 것입니다.

4. 프로세스

4.1. 처리 모델

이 그림은 PerformanceNavigationTiming 인터페이스에서 정의된 타이밍 속성을 보여줍니다. 괄호로 표시된 속성은 다른 origin의 문서가 관여하는 내비게이션에서는 제공되지 않을 수 있습니다.
Navigation Timing attributes

5. 내비게이션 타이밍 항목 생성

각 document에는 navigation timing entry가 연관되어 있으며, 기본값은 설정되지 않음.

Document document에 대한 탐색 타이밍 엔트리를 생성하려면, fetch 타이밍 정보 fetchTiming, 숫자 redirectCount, NavigationTimingType navigationType, null 또는 서비스 워커 타이밍 정보 serviceWorkerTiming, DOMString cacheMode, DOMHighResTimeStamp criticalCHRestart, 그리고 응답 본문 정보 bodyInfo가 주어지면 다음을 수행합니다:

  1. global을 document의 relevant global object로 지정
  2. navigationTimingEntry를 global의 realm에서 새 PerformanceNavigationTiming 객체로 생성
  3. 리소스 타이밍 항목을 설정을 navigationTimingEntry에 대해 "navigation", document의 URL, fetchTiming, cacheMode, bodyInfo로 실행
  4. navigationTimingEntry의 문서 로드 타이밍을 document의 로드 타이밍 정보로 지정
  5. navigationTimingEntry의 이전 문서 언로드 타이밍을 document의 이전 문서 언로드 타이밍으로 지정
  6. navigationTimingEntry의 redirect count를 redirectCount로 지정
  7. navigationTimingEntry의 navigation type을 navigationType으로 지정
  8. navigationTimingEntry의 service worker timing 을 serviceWorkerTiming으로 지정
  9. document의 navigation timing entry를 navigationTimingEntry로 지정
  10. navigationTimingEntry의 `Critical-CH` 재시작 시간을 criticalCHRestart로 지정
  11. navigationTimingEntry의 not restored reasons 를 NotRestoredReasons 객체 생성 결과 값(인자로 document의 not restored reasons 사용)으로 지정
  12. navigationTimingEntry를 global의 performance entry buffer에 추가

navigation timing entry를 큐에 추가하려면 Document document에 대해, 큐에 document의 navigation timing entry를 넣으십시오.

6. 프라이버시 고려사항

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

6.1. 정보 공개

정교하게 설계된 타이밍 공격을 통해 최종 사용자의 브라우징 및 활동 이력이 노출될 가능성이 있습니다. 예를 들어, 언로드 시간(unloading time)은 이전 페이지의 unload handler 실행에 걸린 시간을 드러내므로, 사용자의 로그인 상태를 추론하는 데 이용될 수 있습니다. 이러한 공격은 문서 언로드 시 동일 출처 확인 알고리즘을 강제 적용하여, HTML 명세에 설명된 대로 완화되었습니다.

완화된 동일 출처 정책은 문서 간 무단 접근을 충분히 막지 못합니다. 공유 호스팅 환경에서 신뢰할 수 없는 제3자가 동일 IP에서 다른 포트로 HTTP 서버를 운영할 수 있습니다.

6.2. 디렉터리 교차 접근

같은 호스트명을 공유하는 서로 다른 페이지 ― 예: 사용자 생성 콘텐츠가 있는 사이트에서 서로 다른 저자가 만든 컨텐츠 ― 는 경로로 접근을 제한하는 기능이 없으므로 같은 origin으로 간주됩니다. 이러한 페이지 간 이동 시, 이후 페이지가 이전 페이지의 타이밍 정보(리다이렉션, 언로드 이벤트 등)를 접근할 수 있습니다.

7. 보안 고려사항

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

PerformanceNavigationTiming 인터페이스는 이전 문서의 타이밍 정보를 현재 document에 노출합니다. 이전 문서 정보를 포함하는 PerformanceNavigationTiming 속성 접근을 제한하기 위해, 이전 문서 언로딩 알고리즘은 동일 출처 정책을 적용하며, 이전 문서 관련 속성들은 0으로 설정됩니다.

7.1. 프록시 서버 감지

사용자 에이전트와 웹 서버 사이에 프록시가 배치된 경우, connectStart 와 connectEnd 속성 사이의 시간은 실제로 사용자 에이전트와 프록시 간 지연을 나타냅니다. 이로 인해 웹 서버는 프록시의 존재를 추론할 수 있습니다. SOCKS 프록시의 경우 이 구간은 프록시 인증 시간, 프록시가 웹 서버에 연결하는 시간도 포함하므로 프록시 탐지가 모호해집니다. HTTP 프록시의 경우 사용자 에이전트가 프록시 서버 존재 자체를 알지 못할 수 있으므로, 이 공격을 항상 완화할 방법이 있는 것은 아닙니다.

8. 폐기됨

이 섹션은 [NAVIGATION-TIMING] 1레벨에서 도입되었던 속성과 인터페이스를 하위 호환성 유지를 위해 정의합니다. 저자는 아래 인터페이스 사용을 피해야 하며, 새로운 PerformanceNavigationTiming 인터페이스 사용을 권장합니다 ― 변경점 및 개선 요약 참조.

8.1. PerformanceTiming 인터페이스

[Exposed=Window]
interface PerformanceTiming {
  readonly attribute unsigned long long navigationStart;
  readonly attribute unsigned long long unloadEventStart;
  readonly attribute unsigned long long unloadEventEnd;
  readonly attribute unsigned long long redirectStart;
  readonly attribute unsigned long long redirectEnd;
  readonly attribute unsigned long long fetchStart;
  readonly attribute unsigned long long domainLookupStart;
  readonly attribute unsigned long long domainLookupEnd;
  readonly attribute unsigned long long connectStart;
  readonly attribute unsigned long long connectEnd;
  readonly attribute unsigned long long secureConnectionStart;
  readonly attribute unsigned long long requestStart;
  readonly attribute unsigned long long responseStart;
  readonly attribute unsigned long long responseEnd;
  readonly attribute unsigned long long domLoading;
  readonly attribute unsigned long long domInteractive;
  readonly attribute unsigned long long domContentLoadedEventStart;
  readonly attribute unsigned long long domContentLoadedEventEnd;
  readonly attribute unsigned long long domComplete;
  readonly attribute unsigned long long loadEventStart;
  readonly attribute unsigned long long loadEventEnd;
  [Default] object toJSON();
};

본 섹션에서 정의된 모든 시간 값은 이후 경과한 밀리초 단위로 측정됩니다.

navigationStart

이 속성은 사용자 에이전트가 이전 문서를 언로드할지 묻는 작업을 완료한 직후의 시간을 반환해야 합니다. 이전 문서가 없으면 이 속성은 현재 문서가 생성된 시간을 반환해야 합니다.

이 속성은 PerformanceNavigationTiming에 대해 정의되지 않습니다. 대신 작성자는 timeOrigin을 사용하여 이에 상응하는 타임스탬프를 얻을 수 있습니다.

unloadEventStart

이전 문서와 현재 문서의 출처가 같으면, 이 속성은 사용자 에이전트가 이전 문서의 unload 이벤트를 시작하기 직전의 시간을 반환해야 합니다. 이전 문서가 없거나 이전 문서의 출처가 현재 문서와 다르면, 이 속성은 0을 반환해야 합니다.

unloadEventEnd

이전 문서와 현재 문서가 동일 출처이면, 이 속성은 사용자 에이전트가 이전 문서의 unload 이벤트를 완료한 직후의 시간을 반환해야 합니다. 이전 문서가 없거나 이전 문서의 출처가 현재 문서와 다르거나 unload가 아직 완료되지 않았다면, 이 속성은 0을 반환해야 합니다.

탐색할 때 HTTP 리디렉션이 있고 모든 리디렉션이 동일한 출처에서 발생한 것이 아니라면, unloadEventStart와 unloadEventEnd는 모두 0을 반환해야 합니다.

redirectStart

탐색할 때 HTTP 리디렉션이 있고 모든 리디렉션이 동일한 출처에서 발생한 경우, 이 속성은 리디렉션을 시작하는 fetch 시작 시간을 반환해야 합니다. 그렇지 않으면 이 속성은 0을 반환해야 합니다.

redirectEnd

탐색할 때 HTTP 리디렉션이 있고 모든 리디렉션이 동일한 출처에서 발생한 경우, 이 속성은 마지막 리디렉션 응답의 마지막 바이트를 수신한 직후의 시간을 반환해야 합니다. 그렇지 않으면 이 속성은 0을 반환해야 합니다.

fetchStart

새 리소스를 "GET" 요청 메서드를 사용하여 fetch해야 하는 경우, fetchStart는 사용자 에이전트가 HTTP 캐시 [RFC9111]를 확인하기 시작하기 직전의 시간을 반환해야 합니다. 그렇지 않으면 사용자 에이전트가 리소스를 fetch하기 시작한 시간을 반환해야 합니다.

domainLookupStart

이 속성은 사용자 에이전트가 현재 문서에 대한 도메인 이름 조회를 시작하기 직전의 시간을 반환해야 합니다. 지속 연결 [RFC9112]을 사용하거나 현재 문서를 HTTP 캐시 [RFC9111] 또는 로컬 리소스에서 가져온 경우, 이 속성은 fetchStart와 동일한 값을 반환해야 합니다.

domainLookupEnd

이 속성은 사용자 에이전트가 현재 문서에 대한 도메인 이름 조회를 완료한 직후의 시간을 반환해야 합니다. 지속 연결 [RFC9112]을 사용하거나 현재 문서를 HTTP 캐시 [RFC9111] 또는 로컬 리소스에서 가져온 경우, 이 속성은 fetchStart와 동일한 값을 반환해야 합니다.

HTTP 캐시 [RFC9111]에서 콘텐츠를 확인하고 가져오는 작업은 fetching 프로세스의 일부입니다. 이는 requestStart, responseStart 및 responseEnd 속성에 포함됩니다.

사용자 에이전트가 이미 도메인 정보를 캐시에 가지고 있는 경우, domainLookupStart와 domainLookupEnd는 사용자 에이전트가 캐시에서 도메인 데이터를 가져오기 시작하고 끝내는 시간을 나타냅니다.

connectStart

이 속성은 사용자 에이전트가 문서를 가져오기 위해 서버에 대한 연결을 설정하기 시작하기 직전의 시간을 반환해야 합니다. 지속 연결 [RFC9112]을 사용하거나 현재 문서를 HTTP 캐시 [RFC9111] 또는 로컬 리소스에서 가져온 경우, 이 속성은 domainLookupEnd의 값을 반환해야 합니다.

connectEnd

이 속성은 사용자 에이전트가 현재 문서를 가져오기 위해 서버에 대한 연결 설정을 완료한 직후의 시간을 반환해야 합니다. 지속 연결 [RFC9112]을 사용하거나 현재 문서를 HTTP 캐시 [RFC9111] 또는 로컬 리소스에서 가져온 경우, 이 속성은 domainLookupEnd의 값을 반환해야 합니다.

전송 연결에 실패하여 사용자 에이전트가 연결을 다시 열면, connectStart와 connectEnd는 새 연결에 해당하는 값을 반환해야 합니다.

connectEnd에는 전송 연결을 설정하는 데 걸린 시간 간격뿐 아니라 SSL 핸드셰이크 및 SOCKS 인증과 같은 다른 시간 간격도 포함되어야 합니다.

secureConnectionStart

이 속성은 선택 사항입니다. 이 속성을 사용할 수 없는 사용자 에이전트는 이를 undefined로 설정해야 합니다. 이 속성을 사용할 수 있는 경우, 현재 페이지의 스킴 [URL]이 "https"라면, 이 속성은 사용자 에이전트가 현재 연결을 보호하기 위한 핸드셰이크 프로세스를 시작하기 직전의 시간을 반환해야 합니다. 이 속성을 사용할 수 있지만 HTTPS가 사용되지 않는 경우, 이 속성은 0을 반환해야 합니다.

requestStart

이 속성은 사용자 에이전트가 서버, HTTP 캐시 [RFC9111] 또는 로컬 리소스에 현재 문서를 요청하기 시작하기 직전의 시간을 반환해야 합니다.

요청을 보낸 후 전송 연결에 실패하여 사용자 에이전트가 연결을 다시 열고 요청을 다시 보내는 경우, requestStart는 새 요청에 해당하는 값을 반환해야 합니다.

이 인터페이스에는 요청 전송의 완료를 나타내는 속성(예: requestEnd)이 포함되지 않습니다.

  • 사용자 에이전트에서 요청 전송이 완료되었다고 해서 네트워크 전송에서 이에 대응하는 완료 시간을 항상 나타내는 것은 아니므로, 그러한 속성을 두는 것의 이점 대부분이 사라집니다.
  • 일부 사용자 에이전트는 HTTP 계층 캡슐화로 인해 실제 요청 전송 완료 시간을 확인하는 데 높은 비용이 듭니다.
responseStart

이 속성은 사용자 에이전트가 서버, HTTP 캐시 [RFC9111] 또는 로컬 리소스로부터 응답의 첫 번째 바이트를 수신한 직후의 시간을 반환해야 합니다.

responseEnd

이 속성은 사용자 에이전트가 현재 문서의 마지막 바이트를 수신한 직후 또는 전송 연결이 닫히기 직전 중 먼저 발생한 시점의 시간을 반환해야 합니다. 여기서 문서는 서버, HTTP 캐시 [RFC9111] 또는 로컬 리소스에서 수신될 수 있습니다.

domLoading

이 속성은 사용자 에이전트가 현재 문서 준비 상태를 "loading"으로 설정하기 직전의 시간을 반환해야 합니다.

기존 사용자 에이전트에서 Document 객체가 생성되는 시점의 차이로 인해, domLoading이 반환하는 값은 구현에 따라 다르므로 의미 있는 메트릭에 사용해서는 안 됩니다.

domInteractive

이 속성은 사용자 에이전트가 현재 문서 준비 상태를 "interactive"로 설정하기 직전의 시간을 반환해야 합니다.

domContentLoadedEventStart

이 속성은 사용자 에이전트가 Document에서 DOMContentLoaded 이벤트를 발생시키기 직전의 시간을 반환해야 합니다.

domContentLoadedEventEnd

이 속성은 문서의 DOMContentLoaded 이벤트가 완료된 직후의 시간을 반환해야 합니다.

domComplete

이 속성은 사용자 에이전트가 현재 문서 준비 상태를 "complete"로 설정하기 직전의 시간을 반환해야 합니다.

현재 문서 준비 상태가 동일한 상태로 여러 번 변경되는 경우, domLoading, domInteractive, domContentLoadedEventStart, domContentLoadedEventEnd 및 domComplete는 해당 문서 준비 상태 변경이 처음 발생한 시간을 반환해야 합니다.

loadEventStart

이 속성은 현재 문서의 load 이벤트가 발생하기 직전의 시간을 반환해야 합니다. load 이벤트가 아직 발생하지 않았다면 0을 반환해야 합니다.

loadEventEnd

이 속성은 현재 문서의 load 이벤트가 완료된 시간을 반환해야 합니다. load 이벤트가 발생하지 않았거나 완료되지 않았다면 0을 반환해야 합니다.

toJSON()
this에 대해 기본 toJSON 단계를 실행합니다.

8.2. PerformanceNavigation 인터페이스

[Exposed=Window]
interface PerformanceNavigation {
  const unsigned short TYPE_NAVIGATE = 0;
  const unsigned short TYPE_RELOAD = 1;
  const unsigned short TYPE_BACK_FORWARD = 2;
  const unsigned short TYPE_RESERVED = 255;
  readonly attribute unsigned short type;
  readonly attribute unsigned short redirectCount;
  [Default] object toJSON();
};
TYPE_NAVIGATE

세션 기록 처리 동작이 "default" 또는 "replace"로 설정된 탐색입니다.

TYPE_RELOAD

세션 기록 처리 동작이 "reload"로 설정된 탐색입니다.

TYPE_BACK_FORWARD

세션 기록 처리 동작이 "entry update"로 설정된 탐색입니다.

TYPE_RESERVED

위의 값으로 정의되지 않은 모든 탐색 유형입니다.

type

이 속성은 마지막 비리디렉션 탐색의 유형을 반환해야 합니다. 다음 탐색 유형 값 중 하나여야 합니다.

Refresh pragma 지시문을 사용하는 것과 같은 클라이언트 측 리디렉션은 이 명세에서 HTTP 리디렉션으로 간주되지 않습니다. 이러한 경우 type 속성은 현재 페이지를 다시 로드하는 경우 TYPE_RELOAD와 같은 적절한 값을 반환해야 하며, 새 URL로 탐색하는 경우 TYPE_NAVIGATE를 반환해야 합니다.

redirectCount

이 속성은 마지막 비리디렉션 탐색 이후의 리디렉션 수를 반환해야 합니다. 리디렉션이 없거나 대상 문서와 동일 출처가 아닌 리디렉션이 하나라도 있으면, 이 속성은 0을 반환해야 합니다.

toJSON()
this에 대해 기본 toJSON 단계를 실행합니다.

8.3. Performance 인터페이스에 대한 확장

[Exposed=Window]
partial interface Performance {
  [SameObject]
  readonly attribute PerformanceTiming timing;
  [SameObject]
  readonly attribute PerformanceNavigation navigation;
};

Performance 인터페이스는 [PERFORMANCE-TIMELINE-2]에서 정의됩니다.

timing

timing 속성은 마지막 비-리다이렉트 내비게이션 이후의 타이밍 정보를 나타냅니다.
이 속성은 PerformanceTiming 인터페이스에서 정의됩니다.

navigation

navigation 속성은 PerformanceNavigation 인터페이스에서 정의됩니다.

9. 감사의 말

이 작업에 기여해 주신 Anne Van Kesteren, Arvind Jain, Boris Zbarsky, Jason Weber, Jonas Sicking, James Simonsen, Karen Anderson, Nic Jansma, Philippe Le Hegaret, Steve Souders, Todd Reifsteck, Tony Gentilcore, William Chan 그리고 Zhiheng Wang께 감사드립니다.

적합성

문서 규칙

적합성 요구사항은 다음을 조합하여 표현됩니다. 설명적 주장과 RFC 2119 용어. 이 문서의 규범적 부분에 나오는 핵심 단어 “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, 및 “OPTIONAL” 은 RFC 2119에 설명된 대로 해석되어야 합니다. 다만 가독성을 위해, 이 단어들이 이 명세서에서 항상 대문자로 표기되지는 않습니다.

이 명세서의 모든 텍스트는 명시적으로 비규범적(non-normative)으로 표시된 섹션, 예제 및 주석을 제외하고는 규범적입니다. [RFC2119]

이 명세서의 예제들은 "for example"라는 말로 소개되거나 규범적 본문과 class="example"로 분리되어 제시됩니다, 예를 들면 다음과 같습니다:

이것은 설명적 예제의 예입니다.

설명적 주석(Informative notes)은 "Note"라는 말로 시작하며 규범적 본문과 class="note"로 분리되어 제시됩니다, 예를 들면 다음과 같습니다:

참고, 이것은 설명적 주석입니다.

적합한 알고리즘

알고리즘의 일부로 명령형 문장으로 표현된 요구사항(예: "선행 공백 문자를 제거하라" 또는 "거짓을 반환하고 이 절차를 중단하라") 은 알고리즘을 소개할 때 사용된 핵심 단어("must", "should", "may" 등)의 의미로 해석되어야 합니다.

알고리즘 또는 특정 단계로 표현된 적합성 요구사항은 최종 결과가 동등한 한 어떤 방식으로든 구현될 수 있습니다. 특히, 이 명세서에서 정의된 알고리즘은 이해하기 쉽도록 작성되었으며 성능을 목표로 하지는 않습니다. 구현자는 최적화를 권장합니다.

색인

이 명세서에서 정의한 용어

참조로 정의된 용어

참조

규범적 참조(Normative References)

[DOM]
Anne van Kesteren. DOM 표준. 현행 표준. URL: https://dom.spec.whatwg.org/
[FETCH]
Anne van Kesteren. Fetch 표준. 현행 표준. URL: https://fetch.spec.whatwg.org/
[HR-TIME]
Yoav Weiss. 고해상도 시간. 2026년 3월 24일. WD. URL: https://www.w3.org/TR/hr-time-3/
[HTML]
Anne van Kesteren; 외. HTML 표준. 현행 표준. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra 표준. 현행 표준. URL: https://infra.spec.whatwg.org/
[PERFORMANCE-TIMELINE-2]
Nicolas Pena Moreno. Performance 타임라인. 2025년 5월 21일. CRD. URL: https://www.w3.org/TR/performance-timeline/
[RESOURCE-TIMING-2]
Yoav Weiss; Noam Rosenthal. 리소스 타이밍. 2026년 4월 20일. CRD. URL: https://www.w3.org/TR/resource-timing/
[RFC2119]
S. Bradner. 요구 수준을 나타내기 위해 RFC에서 사용하는 핵심 단어. 1997년 3월. 현행 모범 사례. URL: https://datatracker.ietf.org/doc/html/rfc2119
[RFC9111]
R. Fielding, 편집자; M. Nottingham, 편집자; J. Reschke, 편집자. HTTP 캐싱. 2022년 6월. 인터넷 표준. URL: https://httpwg.org/specs/rfc9111.html
[RFC9112]
R. Fielding, 편집자; M. Nottingham, 편집자; J. Reschke, 편집자. HTTP/1.1. 2022년 6월. 인터넷 표준. URL: https://httpwg.org/specs/rfc9112.html
[SERVICE-WORKERS]
Monica CHINTALA; Yoshisato Yanagisawa. 서비스 워커 나이틀리. 2026년 8월 12일. CRD. URL: https://www.w3.org/TR/service-workers/
[URL]
Anne van Kesteren. URL 표준. 현행 표준. URL: https://url.spec.whatwg.org/
[WebIDL]
Edgar Chen; Timothy Gu. Web IDL 표준. 현행 표준. URL: https://webidl.spec.whatwg.org/

설명적 참조

[HR-TIME-2]
Ilya Grigorik. 고해상도 시간 레벨 2. 2019년 11월 21일. REC. URL: https://www.w3.org/TR/hr-time-2/
[JSMEASURE]
Ramakrishnan Rajamony; Mootaz Elnozahy. WWW에서 클라이언트가 인지하는 응답 시간 측정. 2001년 3월. 제3회 USENIX 인터넷 기술 및 시스템 심포지엄(USITS) 회보. URL: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.69.7329&rep=rep1&type=pdf
[NAVIGATION-TIMING]
Zhiheng Wang. 탐색 타이밍. 2012년 12월 17일. REC. URL: https://www.w3.org/TR/navigation-timing/

IDL 색인

[Exposed=Window]
interface PerformanceNavigationTiming : PerformanceResourceTiming {
    readonly        attribute DOMHighResTimeStamp  unloadEventStart;
    readonly        attribute DOMHighResTimeStamp  unloadEventEnd;
    readonly        attribute DOMHighResTimeStamp  domInteractive;
    readonly        attribute DOMHighResTimeStamp  domContentLoadedEventStart;
    readonly        attribute DOMHighResTimeStamp  domContentLoadedEventEnd;
    readonly        attribute DOMHighResTimeStamp  domComplete;
    readonly        attribute DOMHighResTimeStamp  loadEventStart;
    readonly        attribute DOMHighResTimeStamp  loadEventEnd;
    readonly        attribute NavigationTimingType type;
    readonly        attribute unsigned short       redirectCount;
    readonly        attribute DOMHighResTimeStamp  criticalCHRestart;
    readonly        attribute NotRestoredReasons?  notRestoredReasons;
    readonly        attribute PerformanceTimingConfidence confidence;
    [Default] object toJSON();
};

enum NavigationTimingType {
    "navigate",
    "reload",
    "back_forward"
};

[Exposed=Window]
interface PerformanceTimingConfidence {
    readonly attribute double randomizedTriggerRate;
    readonly attribute PerformanceTimingConfidenceValue value;
    object toJSON();
};

enum PerformanceTimingConfidenceValue {
  "high",
  "low"
};

[Exposed=Window]
interface PerformanceTiming {
  readonly attribute unsigned long long navigationStart;
  readonly attribute unsigned long long unloadEventStart;
  readonly attribute unsigned long long unloadEventEnd;
  readonly attribute unsigned long long redirectStart;
  readonly attribute unsigned long long redirectEnd;
  readonly attribute unsigned long long fetchStart;
  readonly attribute unsigned long long domainLookupStart;
  readonly attribute unsigned long long domainLookupEnd;
  readonly attribute unsigned long long connectStart;
  readonly attribute unsigned long long connectEnd;
  readonly attribute unsigned long long secureConnectionStart;
  readonly attribute unsigned long long requestStart;
  readonly attribute unsigned long long responseStart;
  readonly attribute unsigned long long responseEnd;
  readonly attribute unsigned long long domLoading;
  readonly attribute unsigned long long domInteractive;
  readonly attribute unsigned long long domContentLoadedEventStart;
  readonly attribute unsigned long long domContentLoadedEventEnd;
  readonly attribute unsigned long long domComplete;
  readonly attribute unsigned long long loadEventStart;
  readonly attribute unsigned long long loadEventEnd;
  [Default] object toJSON();
};

[Exposed=Window]
interface PerformanceNavigation {
  const unsigned short TYPE_NAVIGATE = 0;
  const unsigned short TYPE_RELOAD = 1;
  const unsigned short TYPE_BACK_FORWARD = 2;
  const unsigned short TYPE_RESERVED = 255;
  readonly attribute unsigned short type;
  readonly attribute unsigned short redirectCount;
  [Default] object toJSON();
};

[Exposed=Window]
partial interface Performance {
  [SameObject]
  readonly attribute PerformanceTiming timing;
  [SameObject]
  readonly attribute PerformanceNavigation navigation;
};