내비게이션 타이밍 레벨 2

W3C 워킹 드래프트,

이 문서에 대한 자세한 정보
이 버전:
https://www.w3.org/TR/2026/WD-navigation-timing-2-20260225/
최신 공개 버전:
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 을 구현하는 사용자 에이전트는 "navigation"supportedEntryTypes 에 포함해야 합니다 Window 컨텍스트에서. 이는 개발자가 내비게이션 타이밍 지원을 감지할 수 있도록 합니다.

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

PerformanceNavigationTiming 인터페이스는 아래와 같은 PerformanceResourceTiming 인터페이스 속성을 확장합니다:

current document 리소스만 성능 타임라인에 포함됩니다; 성능 타임라인에는 PerformanceNavigationTiming 객체가 하나만 존재합니다.

3.3. PerformanceNavigationTiming 인터페이스

HTTP 캐시 [RFC7234]에서의 내용 확인 및 가져오기는 가져오기 과정의 일부입니다. 이는 requestStart, responseStartresponseEnd 속성에서 다룹니다.
[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 는 연관된 숫자 redirect count를 가집니다.

PerformanceNavigationTiming 는 연관된 NavigationTimingType navigation type 을 가집니다.

PerformanceNavigationTiming 는 연관된 DOMHighResTimeStamp `Critical-CH` 재시작 시간 을 가집니다.

PerformanceNavigationTiming 는 연관된 NotRestoredReasons not restored reasons 을 가집니다.

PerformanceNavigationTiming 는 연관된 PerformanceTimingConfidence confidence value 를 가집니다.

PerformanceNavigationTiming 는 연관된 실수 randomized trigger rate 를 가지며 이는 구현 정의됨입니다.

PerformanceNavigationTiming 는 연관된 PerformanceTimingConfidenceValue underlying confidence value 를 가지며 구현 정의됨입니다.

PerformanceNavigationTiming 는 연관된 null 또는 service worker timing info service worker timing 을 가집니다.

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

이전 문서와 현재 문서가 같은 origin일 경우 이 타임스탬프는 사용자 에이전트가 이전 문서 언로드 이벤트를 시작하기 직전에 측정됩니다. 이전 문서가 없거나 이전 문서의 origin이 현재 문서와 다르면 이 속성은 0을 반환합니다.

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

이전 문서와 현재 문서가 같은 origin일 경우 이 타임스탬프는 사용자 에이전트가 이전 문서 언로드 이벤트 처리를 완료한 직후에 측정됩니다. 이전 문서가 없거나 이전 문서의 origin이 현재 문서와 다르면 이 속성은 0을 반환합니다.

domInteractive getter 단계는 this문서 로드 타이밍DOM 인터랙티브 시간을 반환합니다.

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

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

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

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

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

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

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

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

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

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

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

type getter 단계는 thisnavigation type을 실행합니다.

Refresh 프라그마 지시자와 같은 클라이언트 측 리다이렉트는 이 명세에서 HTTP 리다이렉트로 간주되지 않습니다. 이런 경우 type 속성은 현재 페이지를 새로 고침하는 경우 reload, 새로운 URL로 이동하는 경우 navigate 등 적절한 값을 반환해야 합니다.

redirectCount getter 단계는 thisredirect count를 반환합니다.

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

criticalCHRestart가 0이 아닌 경우, navigationStart, unloadEventStart, unloadEventEnd를 제외한 모든 다른 타임스탬프보다 앞에 위치합니다. 이는 내비게이션의 리다이렉트 부분이 재시작된 순간을 표시하기 때문입니다.

notRestoredReasons getter 단계는 thisnot restored reasons를 반환합니다.

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

  1. this문서 로드 타이밍DOM 인터랙티브 시간이 0이면, null을 반환합니다.
  2. thisconfidence value가 null이 아니면, 이를 반환합니다.
  3. confidence를, PerformanceTimingConfidence 객체로 생성하고 this관련 설정 객체관련 realm에서 생성합니다.
  4. confidencerandomizedTriggerRatethisrandomized trigger rate로 설정합니다.
  5. confidencevalue를 아래 알고리즘으로 결정합니다:
    1. pconfidencerandomizedTriggerRate 값으로 합니다.
    2. underlyingthisunderlying confidence value, 즉 PerformanceTimingConfidenceValue 값으로 합니다.
    3. r을 [0, 1) 구간에서 균등 무작위로 추출한 실수로 합니다.
    4. rp이면 underlying을 반환합니다.
    5. 아니면:
      1. s를 {0, 1} 집합에서 균등 무작위로 추출한 정수로 합니다.
      2. s가 0이면 high를 반환합니다.
      3. 아니면 low를 반환합니다.
  6. confidence를 반환합니다.

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

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

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

  1. 각 레코드마다:
    • p를 해당 레코드의 randomizedTriggerRate로 지정합니다.
    • c를 해당 레코드의 value로 지정합니다.
    • Rchigh일 때 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에 가까워지지 않았을 때 계산합니다.

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

  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. cdfq인 처음 인덱스 idx를 찾습니다.
    • idx가 0이면 duration for sorted_records[0] 반환
    • 해당 인덱스가 없으면 duration for sorted_records[n] 반환
  7. 보간 비율 계산:
    • lower_cdfsorted_records[idx-1]의 cdf로 지정
    • upper_cdfsorted_records[idx]의 cdf로 지정
    • lower_cdf = upper_cdfduration for sorted_records[idx] 반환
    • 아니면:
      • ifrac = (q - lower_cdf) / (upper_cdf - lower_cdf)
      • lower_durationduration for sorted_records[idx-1]로 지정
      • upper_durationduration 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

이 속성은 [0, 1) 구간의 실수를 반환해야 하며, confidence value 를 노이즈 처리하여 노출하는 빈도를 나타냅니다.

value

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

toJSON()

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

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 documentfetch timing info fetchTiming, 숫자 redirectCount, NavigationTimingType navigationType, null 또는 service worker timing info serviceWorkerTiming, DOMString cacheMode, DOMHighResTimeStamp criticalCHRestart, response body info bodyInfo를 받아 다음을 수행합니다:

  1. globaldocumentrelevant global object로 지정
  2. navigationTimingEntryglobalrealm에서 새 PerformanceNavigationTiming 객체로 생성
  3. 리소스 타이밍 항목을 설정navigationTimingEntry에 대해 "navigation", documentURL, fetchTiming, cacheMode, bodyInfo로 실행
  4. navigationTimingEntry문서 로드 타이밍document로드 타이밍 정보로 지정
  5. navigationTimingEntry이전 문서 언로드 타이밍document이전 문서 언로드 타이밍으로 지정
  6. navigationTimingEntryredirect countredirectCount로 지정
  7. navigationTimingEntrynavigation typenavigationType으로 지정
  8. navigationTimingEntryservice worker timingserviceWorkerTiming으로 지정
  9. documentnavigation timing entrynavigationTimingEntry로 지정
  10. navigationTimingEntry`Critical-CH` 재시작 시간criticalCHRestart로 지정
  11. navigationTimingEntrynot restored reasonsNotRestoredReasons 객체 생성 결과 값(인자로 documentnot restored reasons 사용)으로 지정
  12. navigationTimingEntryglobalperformance entry buffer에 추가

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

6. 프라이버시 고려사항

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

6.1. 정보 공개

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

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

6.2. 디렉터리 교차 접근

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

7. 보안 고려사항

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

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

7.1. 프록시 서버 감지

사용자 에이전트와 웹 서버 사이에 프록시가 배치된 경우, connectStartconnectEnd 속성 사이의 시간은 실제로 사용자 에이전트와 프록시 간 지연을 나타냅니다. 이로 인해 웹 서버는 프록시의 존재를 추론할 수 있습니다. 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

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

unloadEventEnd

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

내비게이션 중 HTTP 리다이렉트가 있고, 모든 리다이렉트가 동일 출처가 아닐 경우에는 unloadEventStartunloadEventEnd 모두 0을 반환해야 합니다.

redirectStart

내비게이션 중 HTTP 리다이렉트가 있고, 모든 리다이렉트가 동일 출처라면 이 속성은 리다이렉트를 시작하는 페치 시작 시간 을 반환해야 합니다. 그렇지 않으면 0을 반환해야 합니다.

redirectEnd

내비게이션 중 HTTP 리다이렉트가 있고, 모든 리다이렉트가 동일 출처일 경우 마지막 리다이렉트 응답의 마지막 바이트를 수신한 직후의 시간을 반환해야 합니다. 그렇지 않으면 0을 반환해야 합니다.

fetchStart

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

domainLookupStart

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

domainLookupEnd

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

HTTP 캐시 [RFC2616]에서의 내용 확인 및 가져오기는 페치 과정의 일부입니다. 이는 requestStart, responseStartresponseEnd 속성에서 다뤄집니다.

사용자 에이전트가 이미 캐시에 도메인 정보를 갖고 있는 경우, domainLookupStart와 domainLookupEnd는 캐시에서 도메인 데이터를 가져오기 시작/끝 시간을 의미합니다.

connectStart

이 속성은 사용자 에이전트가 서버와 연결을 시작하기 직전의 시간을 반환해야 합니다. 지속 연결 [RFC2616]이 사용된 경우 또는 현재 문서가 HTTP 캐시 [RFC7234]나 로컬 리소스에서 가져온 경우, domainLookupEnd 값을 반환해야 합니다.

connectEnd

이 속성은 사용자 에이전트가 서버와의 연결을 완료한 직후의 시간을 반환해야 합니다. 지속 연결 [RFC2616]이 사용된 경우 또는 현재 문서가 HTTP 캐시 [RFC7234]나 로컬 리소스에서 가져온 경우, domainLookupEnd 값을 반환해야 합니다.

트랜스포트 연결이 실패하여 사용자 에이전트가 연결을 다시 열 경우, connectStartconnectEnd 는 새로운 연결에 대한 해당 값을 반환해야 합니다.

connectEnd 값에는 트랜스포트 연결 수립 시간뿐 아니라, SSL 핸드셰이크나 SOCKS 인증 같은 시간도 포함됩니다.

secureConnectionStart

이 속성은 선택적입니다. 이 속성이 없는 사용자 에이전트는 undefined로 설정해야 합니다. 만약 이 속성이 있고, 현재 페이지 스킴(scheme) [URL]이 "https"라면, 사용자 에이전트가 보안 연결 핸드셰이크를 시작하기 직전의 시간을 반환해야 합니다. 이 속성이 있으나 HTTPS가 아닌 경우 0을 반환해야 합니다.

requestStart

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

요청 송신 후 트랜스포트 연결이 실패해 사용자 에이전트가 새로 연결하고 요청을 재전송한 경우, requestStart 는 새로운 요청의 해당 값을 반환해야 합니다.

본 인터페이스에는 요청 송신 완료(requestEnd 등)를 나타내는 속성이 없습니다.

  • 사용자 에이전트의 요청 송신 완료는 네트워크 트랜스포트 계층의 실제 요청 송신 완료와 항상 일치하지 않아, 해당 속성이 큰 의미를 갖지 않습니다.
  • 일부 사용자 에이전트는 HTTP 계층 캡슐화 때문에 실제 요청 송신 완료 시점을 판별하는 데 비용이 높습니다.
responseStart

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

responseEnd

이 속성은 사용자 에이전트가 현재 문서의 마지막 바이트를 수신하거나 트랜스포트 연결이 종료되기 직전 중 더 먼저 도달한 시점의 시간을 반환해야 합니다. 문서는 서버, HTTP 캐시 [RFC7234], 또는 로컬 리소스에서 수신될 수 있습니다.

domLoading

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

Document 객체가 생성되는 시점 차이 등으로 인해, domLoading이 반환하는 값은 구현에 따라 다르며, 의미 있는 메트릭에 사용하지 않는 것이 좋습니다.

domInteractive

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

domContentLoadedEventStart

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

domContentLoadedEventEnd

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

domComplete

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

현재 문서 준비 상태가 같은 값으로 여러 번 변경될 경우, domLoading, domInteractive, domContentLoadedEventStart, domContentLoadedEventEnddomComplete 는 해당 문서 준비 상태 변경의 첫 발생 시점을 반환해야 합니다.

loadEventStart

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

loadEventEnd

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

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

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

이 속성은 마지막 비-리다이렉트 내비게이션의 타입을 반환해야 합니다. 아래 값 중 하나를 가져야 합니다: navigation type.

Refresh 프라그마 지시어와 같은 클라이언트 측 리다이렉트는 이 명세에서 HTTP 리다이렉트로 간주되지 않습니다. 이 경우 type 속성은 현재 페이지를 새로고침했다면 TYPE_RELOAD, 새 URL로 이동했다면 TYPE_NAVIGATE 값 등 적절한 값을 반환해야 합니다.

redirectCount

이 속성은 마지막 비-리다이렉트 내비게이션 이후 발생한 리다이렉트 횟수를 반환해야 합니다. 리다이렉트가 없거나, 리다이렉트 중 목적지 문서와 동일 출처가 아닌 것이 있으면 0을 반환해야 합니다.

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

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 Standard. Living Standard. URL: https://dom.spec.whatwg.org/
[FETCH]
Anne van Kesteren. Fetch Standard. Living Standard. URL: https://fetch.spec.whatwg.org/
[HR-TIME]
Yoav Weiss. High Resolution Time. 7 November 2024. WD. URL: https://www.w3.org/TR/hr-time-3/
[HTML]
Anne van Kesteren; et al. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living Standard. URL: https://infra.spec.whatwg.org/
[PERFORMANCE-TIMELINE-2]
Nicolas Pena Moreno. Performance Timeline. 21 May 2025. CRD. URL: https://www.w3.org/TR/performance-timeline/
[RESOURCE-TIMING-2]
Yoav Weiss; Noam Rosenthal. Resource Timing. 17 February 2026. CRD. URL: https://www.w3.org/TR/resource-timing/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. March 1997. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[SERVICE-WORKERS]
Monica CHINTALA; Yoshisato Yanagisawa. Service Workers Nightly. 23 February 2026. CRD. URL: https://www.w3.org/TR/service-workers/
[URL]
Anne van Kesteren. URL Standard. Living Standard. URL: https://url.spec.whatwg.org/
[WebIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/

설명적 참조(Informative References)

[HR-TIME-2]
Ilya Grigorik. High Resolution Time Level 2. 21 November 2019. REC. URL: https://www.w3.org/TR/hr-time-2/
[JSMEASURE]
Ramakrishnan Rajamony; Mootaz Elnozahy. Measuring Client-Perceived Response Times on the WWW. March 2001. The Proceedings of the 3rd USENIX Symposium on Internet Technologies and Systems (USITS). URL: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.69.7329&rep=rep1&type=pdf
[NAVIGATION-TIMING]
Zhiheng Wang. Navigation Timing. 17 December 2012. REC. URL: https://www.w3.org/TR/navigation-timing/
[RFC2616]
R. Fielding; et al. Hypertext Transfer Protocol -- HTTP/1.1. June 1999. Draft Standard. URL: https://www.rfc-editor.org/rfc/rfc2616
[RFC7234]
R. Fielding, Ed.; M. Nottingham, Ed.; J. Reschke, Ed.. Hypertext Transfer Protocol (HTTP/1.1): Caching. June 2014. Proposed Standard. URL: https://httpwg.org/specs/rfc7234.html

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;
};