Copyright © 2025 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
이 명세는 웹 애플리케이션이 문서의 네비게이션에 대한 전체 타이밍 정보를 접근할 수 있는 인터페이스를 정의합니다.
이 섹션은 본 문서가 발행된 시점에서의 상태를 설명합니다. 현재 W3C 발행 목록과 이 기술 보고서의 최신 개정판은 W3C 기술 보고서 인덱스에서 https://www.w3.org/TR/ 에서 확인할 수 있습니다.
네비게이션 타이밍 2는 [NAVIGATION-TIMING]의 첫 번째 버전을 대체하며 다음과 같은 변경 사항을 포함합니다:
본 문서는 Web Performance 작업 그룹에서 권고안 트랙을 사용하여 워킹 드래프트로 발행되었습니다.
워킹 드래프트로 발행되었다고 해서 W3C 및 회원의 승인임을 의미하지 않습니다.
이 문서는 초안이며 언제든지 업데이트, 대체 또는 폐기될 수 있습니다. 진행 중인 작업이 아닌 다른 것으로 본 문서를 인용하는 것은 적절하지 않습니다.
본 문서는 W3C 특허 정책에 따라 운영되는 그룹에 의해 제작되었습니다. W3C는 공개 특허 공개 목록을 유지하고 있으며, 그룹의 산출물과 관련된 특허 공개가 있을 경우 해당 페이지에 안내와 함께 공개됩니다. 실제로 특허를 알고 있는 개인은 필수 청구가 포함되어 있다고 생각하는 경우 W3C 특허 정책 6절에 따라 정보를 공개해야 합니다.
본 문서는 2023년 11월 3일 W3C 프로세스 문서에 의해 관리됩니다.
이 섹션은 규범적이지 않습니다.
웹 애플리케이션의 성능 특성을 정확하게 측정하는 것은 웹 애플리케이션을 더 빠르게 만드는 중요한 요소입니다. [JSMEASURE]에 설명된 것과 같은 JavaScript 기반 메커니즘은 사용자 지연 측정을 위한 포괄적인 인스트루먼테이션을 제공할 수 있지만, 많은 경우 완전하거나 상세한 종단 간(latency) 지연 정보를 제공하지 못합니다. 예를 들어 아래 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가 실행된 이후 페이지가 로드되는 데 걸리는 시간을 계산하지만, 서버에서 페이지를 가져오는 데 걸리는 시간이나 페이지의 초기화 라이프사이클에 대한 정보는 제공하지 않습니다.
이 명세는 문서의 네비게이션과 관련된 고해상도 성능 메트릭 데이터를 저장하고 가져올 수 있도록
[PERFORMANCE-TIMELINE-2]에 참여하는
PerformanceNavigationTiming
인터페이스를
정의합니다.
PerformanceNavigationTiming
인터페이스는
[HR-TIME]을 사용하므로, 모든 시간 값은 해당 entry의
타임
오리진(time origin)과
관련 설정 객체(relevant
settings object)를 기준으로 측정됩니다.
예를 들어, response end가 네비게이션 시작 후 100ms에 발생한다고 알면
PerformanceNavigationTiming
데이터는 다음과 같을
수 있습니다:
startTime: 0.000 // 네비게이션 요청의 시작 시간
responseEnd: 100.000 // 마지막 바이트 수신의 고해상도 시간
다음 스크립트는 개발자가 PerformanceNavigationTiming
인터페이스를 활용해
문서의 네비게이션과 관련된 정확한 타이밍 데이터를 얻는 방법을 보여줍니다:
<script>
function showNavigationDetails() {
// 첫 번째 entry 가져오기
const [entry] = performance.getEntriesByType("navigation");
// 개발자 콘솔에 보기 좋게 테이블로 출력
console.table(entry.toJSON());
}
</script>
<body onload="showNavigationDetails()">
실제로 인터페이스인 Foo
를 지칭할 때, "an object implementing the interface Foo
" 대신에
"a Foo
object"라는 표현을 사용하는 경우가 있습니다.
현재 문서라는 용어는 Window 객체에 연결된 최신 Document 객체를 의미합니다.
전체적으로 모든 시간 값은 문서의 네비게이션 시작 시점부터 경과된 밀리초 단위로 측정됩니다. 예를 들어, 문서의 네비게이션 시작은 0 시점에 발생합니다. 현재 시간이라는 용어는 문서의 네비게이션 시작 후 현재 시점까지 경과한 밀리초를 의미합니다. 이러한 시간의 정의는 [HR-TIME] 명세를 기반으로 합니다.
PerformanceNavigationTiming
인터페이스에서 정의하는 타이밍 속성을 보여줍니다. 괄호로 표시된 속성은 서로 다른 출처의 문서 네비게이션에서는 제공되지 않을 수
있습니다.
이 섹션은 규범적이지 않습니다.
정교하게 설계된 타이밍 공격을 통해 최종 사용자의 브라우징 및 활동 이력이 노출될 가능성이 있습니다. 예를 들어, 언로드 시간으로 이전 페이지의 unload 핸들러가 실행된 시간을 알 수 있으며, 이를 통해 사용자의 로그인 상태를 추론할 수 있습니다. 이러한 공격은 문서 언로드 시 동일 출처 검사 알고리즘을 강제 적용함으로써 완화되었습니다. 자세한 내용은 HTML 명세를 참고하세요.
완화된 동일 출처 정책(relaxed same origin policy)은 문서 간 무단 방문에 대해 충분한 보호를 제공하지 않습니다. 공유 호스팅 환경에서는 신뢰하지 않는 제3자가 동일한 IP 주소의 다른 포트에 HTTP 서버를 호스팅할 수 있습니다.
동일한 호스트명을 공유하는 서로 다른 페이지(예: 사용자 생성 콘텐츠가 있는 사이트의 서로 다른 작성자 콘텐츠)는 경로(pathname)로 접근을 제한하는 기능이 없으므로 동일 출처로 간주됩니다. 이러한 페이지 간 네비게이션을 통해 이후의 페이지가 이전 페이지의 타이밍 정보(리디렉션 및 언로드 이벤트 타이밍 등)에 접근할 수 있습니다.
이 섹션은 규범적이지 않습니다.
PerformanceNavigationTiming
인터페이스는
현재 문서에 이전 문서에 대한 타이밍 정보를 노출합니다.
이전 문서에 대한 정보를 포함하는 PerformanceNavigationTiming
속성에 접근을
제한하기 위해,
이전 문서 언로드
알고리즘은
동일 출처 정책을 강제 적용하며, 이전 문서와 관련된 속성은 0으로
설정됩니다.
사용자 에이전트와 웹 서버 사이에 프록시가 배치된 경우,
connectStart
와 connectEnd
속성 사이의 시간 간격은 사용자 에이전트와 프록시 사이의 지연을 나타내며, 웹 서버가 프록시의 존재를 추론할 수 있습니다.
SOCKS 프록시의 경우 이 시간 간격은 프록시 인증 시간과 프록시가 웹 서버에 연결하는 데 걸리는 시간도 포함되어 프록시 감지를 어렵게 합니다.
HTTP 프록시의 경우 사용자 에이전트가 프록시 서버에 대해 아무런 정보를 알지 못할 수도 있으므로, 이런 공격을 항상 완화하는 것은 불가능할 수 있습니다.
이 섹션에서는 [NAVIGATION-TIMING] 1레벨에서 도입되었던 속성과 인터페이스를 정의하며, 하위 호환성을 위해
유지됩니다.
작성자는 다음 인터페이스를 사용하지 말아야 하며,
강력히 권장하는 것은 새로운
PerformanceNavigationTiming
인터페이스를 사용하는 것입니다. 자세한 변경 및 개선 사항은 변경 및 개선 요약을 참고하세요.
WebIDL[Exposed=Window]
interface PerformanceTiming
{
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
이전 문서와 현재 문서가 동일 출처인 경우, 이 속성은 이전 문서의 언로드 이벤트가 시작되기 직전의 시간을 반환해야 합니다. 이전 문서가 없거나 출처가 다르면 0을 반환해야 합니다.
unloadEventEnd
이전 문서와 현재 문서가 동일 출처인 경우, 이 속성은 이전 문서의 언로드 이벤트가 완료된 직후의 시간을 반환해야 합니다. 만약 이전 문서가 없거나 출처가 다르거나 언로드가 아직 완료되지 않은 경우, 0을 반환해야 합니다.
네비게이션 시 HTTP 리디렉션이 발생하고, 모든 리디렉션이
동일 출처가 아니라면,
PerformanceTiming
.unloadEventStart
와
PerformanceTiming
.unloadEventEnd
는 0을 반환해야
합니다.
redirectStart
네비게이션 시 HTTP 리디렉션이 발생하고 모든 리디렉션이 동일 출처라면, 이 속성은 리디렉션을 시작하는 fetch의 시작 시간을 반환해야 합니다. 그렇지 않으면 0을 반환해야 합니다.
redirectEnd
네비게이션 시 HTTP 리디렉션이 발생하고 모든 리디렉션이 동일 출처라면, 이 속성은 마지막 리디렉션 응답의 마지막 바이트를 받은 직후의 시간을 반환해야 합니다. 그렇지 않으면 0을 반환해야 합니다.
fetchStart
새 리소스를 "GET" 요청 방식으로 가져올(fetch) 경우, fetchStart는 사용자 에이전트가 HTTP 캐시를 확인하기 직전의 시간을 반환해야 합니다. 그렇지 않으면, 리소스를 가져오기 시작한 시간을 반환해야 합니다.
domainLookupStart
이 속성은 사용자 에이전트가 현재 문서에 대해 도메인 이름 조회를 시작하기 직전의 시간을 반환해야 합니다. 지속적 연결 [RFC2616]이 사용되거나,
현재 문서가 HTTP 캐시 또는 로컬 리소스에서
가져온 경우,
이 속성은 PerformanceTiming
.fetchStart
와 동일한 값을 반환해야
합니다.
domainLookupEnd
이 속성은 사용자 에이전트가 현재 문서의 도메인 이름 조회를 마친 직후의 시간을 반환해야 합니다. 지속적 연결 [RFC2616]이 사용되거나,
현재 문서가 HTTP 캐시 또는 로컬 리소스에서
가져온 경우,
이 속성은 PerformanceTiming
.fetchStart
와 동일한 값을 반환해야
합니다.
HTTP 캐시 [RFC2616]에서 내용을 확인하고
가져오는 과정은 가져오기(fetching)
과정의 일부입니다. 이는
PerformanceTiming
.requestStart
,
PerformanceTiming
.responseStart
및
PerformanceTiming
.responseEnd
속성에
해당합니다.
사용자 에이전트가 이미 캐시에 도메인 정보를 가지고 있는 경우, domainLookupStart와 domainLookupEnd는 캐시에서 도메인 데이터를 가져오는 시작과 끝 시간을 나타냅니다.
connectStart
이 속성은 사용자 에이전트가 문서를 가져오기 위해 서버에 연결을 시작하기 직전의 시간을 반환해야 합니다. 지속적 연결 [RFC2616]이 사용되거나,
현재 문서가 HTTP 캐시 또는 로컬 리소스에서
가져온 경우,
이 속성은 PerformanceTiming
.domainLookupEnd
의 값을
반환해야 합니다.
connectEnd
이 속성은 사용자 에이전트가 현재 문서를 가져오기 위해 서버와의 연결을 마친 직후의 시간을 반환해야 합니다. 지속적 연결 [RFC2616]이 사용되거나,
현재 문서가 HTTP 캐시 또는 로컬 리소스에서
가져온 경우,
이 속성은 PerformanceTiming
.domainLookupEnd
의 값을
반환해야 합니다.
트랜스포트 연결이 실패하고 사용자 에이전트가 연결을 재설정하는 경우,
PerformanceTiming
.connectStart
와
PerformanceTiming
.connectEnd
는 새로운 연결에 해당하는 값을
반환해야 합니다.
PerformanceTiming
.connectEnd
는
트랜스포트 연결을 설정하는 시간뿐만 아니라 SSL 핸드셰이크, SOCKS 인증과 같은 추가적인 시간도 포함해야 합니다.
secureConnectionStart
이 속성은 선택 사항입니다. 이 속성을 사용할 수 없는 사용자 에이전트는 undefined로 설정해야 합니다. 이 속성을 사용할 수 있고, 현재 페이지의 scheme [URL]이 "https"인 경우, 이 속성은 사용자 에이전트가 현재 연결을 보안 처리하기 위해 핸드셰이크를 시작하기 직전의 시간을 반환해야 합니다. 이 속성이 있지만 HTTPS가 사용되지 않는 경우 0을 반환해야 합니다.
requestStart
이 속성은 사용자 에이전트가 서버, HTTP 캐시 또는 로컬 리소스에서 현재 문서를 요청하기 직전의 시간을 반환해야 합니다.
요청이 전송된 후 트랜스포트 연결이 실패하고 사용자 에이전트가 연결을 재설정하여 요청을 다시 보내는 경우,
PerformanceTiming
.requestStart
는 새로운 요청에
해당하는 값을 반환해야 합니다.
이 인터페이스에는 요청 전송 완료(예: requestEnd)를 나타내는 속성이 포함되어 있지 않습니다.
responseStart
이 속성은 사용자 에이전트가 서버, HTTP 캐시 또는 로컬 리소스에서 응답의 첫 바이트를 받은 직후의 시간을 반환해야 합니다.
responseEnd
이 속성은 사용자 에이전트가 현재 문서의 마지막 바이트를 받거나, 트랜스포트 연결이 종료되기 직전(둘 중 먼저 발생)을 반환해야 합니다. 문서는 서버, HTTP 캐시 또는 로컬 리소스에서 받을 수 있습니다.
domLoading
이 속성은 사용자 에이전트가 현재 문서 준비 상태를 "loading"으로 설정하기 직전의 시간을 반환해야 합니다.
기존 사용자 에이전트마다 Document 객체가 생성되는 시점이 다르기 때문에, domLoading
이 반환하는 값은 구현에 따라 다르며, 의미
있는 메트릭에 사용해서는 안 됩니다.
domInteractive
이 속성은 사용자 에이전트가 현재 문서 준비 상태를 "interactive"로 설정하기 직전의 시간을 반환해야 합니다.
domContentLoadedEventStart
이 속성은 사용자 에이전트가 DOMContentLoaded 이벤트를
Document
에
발행하기 직전의 시간을 반환해야 합니다.
domContentLoadedEventEnd
이 속성은 문서의 DOMContentLoaded 이벤트가 완료된 직후의 시간을 반환해야 합니다.
domComplete
이 속성은 사용자 에이전트가 현재 문서 준비 상태를 "complete"로 설정하기 직전의 시간을 반환해야 합니다.
현재 문서 준비
상태가 여러 번 동일한 상태로 변경되면,
PerformanceTiming
.domLoading
,
PerformanceTiming
.domInteractive
,
PerformanceTiming
.domContentLoadedEventStart
,
PerformanceTiming
.domContentLoadedEventEnd
및
PerformanceTiming
.domComplete
는
해당 문서 준비
상태가 처음 변경된 시점의 시간을 반환해야 합니다.
loadEventStart
이 속성은 현재 문서의 load 이벤트가 발생하기 직전의 시간을 반환해야 하며, load 이벤트가 아직 발생하지 않은 경우 0을 반환해야 합니다.
loadEventEnd
이 속성은 현재 문서의 load 이벤트가 완료된 시점을 반환해야 하며, load 이벤트가 발생하지 않았거나 완료되지 않은 경우 0을 반환해야 합니다.
toJSON()
WebIDL[Exposed=Window]
partial interface Performance
{
[SameObject]
readonly attribute PerformanceTiming
timing
;
};
Performance
인터페이스는
[PERFORMANCE-TIMELINE-2]에서 정의됩니다.
timing
timing
속성은 마지막 비-리디렉션 네비게이션 이후 브라우징 컨텍스트와 관련된 타이밍 정보를 나타냅니다. 이 속성은
PerformanceTiming
인터페이스에 의해 정의됩니다.
navigation
navigation
속성은 PerformanceNavigation
인터페이스에 의해 정의됩니다.
비규범적으로 표시된 섹션뿐만 아니라, 이 명세에서 작성 지침, 다이어그램, 예시 및 참고 사항도 모두 비규범적입니다. 명세의 나머지 부분은 모두 규범적입니다.
이 문서에서 SHOULD라는 키워드는 BCP 14 [RFC2119] [RFC8174]에서 설명한 대로, 오직 대문자로 나타날 때만 해당 의미로 해석됩니다.
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에게 본 작업에 대한 기여에 감사를 표합니다.
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: