리소스 타이밍

W3C 후보 권고안 초안

이 문서에 대한 자세한 정보
이 버전:
https://www.w3.org/TR/2025/CRD-resource-timing-20250820/
최신 공개 버전:
https://www.w3.org/TR/resource-timing/
최신 편집자 초안:
https://w3c.github.io/resource-timing/
히스토리:
https://www.w3.org/standards/history/resource-timing/
커밋 히스토리
구현 보고서:
https://w3c.github.io/test-results/resource-timing/all.html
편집자:
Yoav Weiss (Google)
(Google)
이전 편집자:
Ilya Grigorik (Google) (2021년 1월까지)
(Microsoft Corp.) (2021년 1월까지)
(Google Inc.) (2014년 12월까지)
(Microsoft Corp.) (2014년 2월까지)
Zhiheng Wang (Google Inc.) (2012년 7월까지)
Anderson Quach (Microsoft Corp.) (2011년 3월까지)
피드백:
GitHub w3c/resource-timing (풀 리퀘스트, 이슈 작성, 오픈 이슈)
public-web-perf@w3.org 메일 제목 [ResourceTiming] (아카이브)
브라우저 지원:
caniuse.com

개요

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

문서 현황

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

이 문서는 웹 성능 작업 그룹권고안 트랙을 사용하여 후보 권고안 초안으로 발표한 것입니다.

후보 권고안으로 출판된다고 해서 W3C 및 그 회원의 승인됨을 의미하지 않습니다. 후보 권고안 초안은 이전 후보 권고안에서 작업 그룹이 이후 후보 권고안 스냅샷에 포함하려는 변경 사항을 통합한 것입니다.

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

이 문서는 W3C 특허 정책에 따라 운영되는 그룹이 작성하였습니다. W3C그룹 결과물과 관련된 특허 공개 공용 목록 을 관리합니다. 해당 페이지에는 특허 공개 방법도 포함되어 있습니다. 개인이 필수적 청구를 포함한다고 생각되는 특허를 실제로 알고 있는 경우, 필수적 청구 정보를 W3C 특허 정책 섹션 6에 따라 공개해야 합니다.

이 문서는 2025년 8월 18일 W3C 절차 문서에 따라 관리됩니다.

1. 소개

이 섹션은 비규범적입니다.

사용자 지연(latency)은 웹 애플리케이션의 중요한 품질 기준입니다. JavaScript 기반의 방법으로 애플리케이션 내에서 사용자 지연 측정을 위한 포괄적인 계측을 제공할 수 있지만, 많은 경우 전체적인 엔드 투 엔드 지연을 완전히 파악할 수는 없습니다. 이 문서는 JavaScript가 문서 내 리소스에 관련된 전체 타이밍 정보를 수집할 수 있도록 PerformanceResourceTiming 인터페이스를 소개합니다. Navigation Timing 2 [NAVIGATION-TIMING-2]는 내비게이션과 관련된 추가 타이밍 정보를 제공하기 위해 이 명세를 확장합니다.

예를 들어, 아래 JavaScript는 리소스를 가져오는 데 걸린 시간을 측정하는 간단한 시도를 보여줍니다:

<!doctype html>
<html>
  <head>
  </head>
  <body onload="loadResources()">
    <script>
        function loadResources()
        {
          var start = new Date().getTime();
          var image1 = new Image();
          var resourceTiming = function() {
              var now = new Date().getTime();
              var latency = now - start;
              alert("End to end resource fetch: " + latency);
          };

          image1.onload = resourceTiming;
          image1.src = 'https://www.w3.org/Icons/w3c_main.png';
        }
    </script>
    <img src="https://www.w3.org/Icons/w3c_home.png">
  </body>
</html>

이 스크립트는 리소스를 가져오는 데 걸린 시간을 측정할 수 있지만, 각 단계별로 소요된 시간을 구분하여 측정할 수 없습니다. 또한, 마크업에 기술된 리소스를 가져오는 데 걸린 시간을 쉽게 측정할 수 없습니다.

사용자 경험에 대한 완전한 정보를 얻기 위해, 이 문서는 PerformanceResourceTiming 인터페이스를 소개합니다. 이 인터페이스를 사용하면 JavaScript 기반 방법이 애플리케이션 내에서 클라이언트 측 지연에 대한 완전한 측정을 제공할 수 있습니다. 이 인터페이스를 활용하면 이전 예제를 수정하여 사용자가 인지하는 리소스의 로드 시간을 측정할 수 있습니다.

다음 스크립트는 페이지 내 모든 리소스, 마크업에 정의된 리소스까지 가져오는데 걸린 시간을 계산합니다. 이 예제는 해당 페이지가 https://www.w3.org에 호스팅되어 있다고 가정합니다. PerformanceResourceTiming 인터페이스를 사용하면 리소스를 가져오는 각 단계별로 소요된 시간을 측정할 수도 있습니다.

<!doctype html>
<html>
  <head>
  </head>
  <body onload="loadResources()">
    <script>
      function loadResources()
      {
          var image1 = new Image();
          image1.onload = resourceTiming;
          image1.src = 'https://www.w3.org/Icons/w3c_main.png';
      }

      function resourceTiming()
      {
          var resourceList = window.performance.getEntriesByType("resource");
          for (i = 0; i < resourceList.length; i++)
          {
              if (resourceList[i].initiatorType == "img")
              {
                alert("End to end resource fetch: " + (resourceList[i].responseEnd - resourceList[i].startTime));
              }
          }
      }
    </script>
    <img id="image0" src="https://www.w3.org/Icons/w3c_home.png">
  </body>
</html>

2. 적합성

비규범적으로 표시된 섹션뿐만 아니라, 이 명세의 모든 저작 가이드라인, 도표, 예제, 그리고 참고 사항은 비규범적입니다. 이 명세의 그 외 모든 내용은 규범적입니다.

이 문서에서 MAY, MUST, SHOULD와 같은 핵심 키워드는 BCP 14 [RFC2119] [RFC8174] 에서 설명된 대로, 그리고 오직 이와 같이 모두 대문자로 표시될 때만 해당 의미로 해석됩니다.

알고리즘의 일부로 명령형으로 표현된 요구사항(예: "앞의 공백 문자를 모두 제거한다" 또는 "false를 반환하고 이 단계를 중단한다")은 알고리즘 앞부분에서 사용된 키워드("MUST", "SHOULD", "MAY" 등) 의미에 따라 해석되어야 합니다.

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

알고리즘 또는 특정 단계로 표현된 적합성 요구사항은 결과가 동등하다면 어떤 방식으로든 구현할 수 있습니다. (특히, 이 명세서에서 정의된 알고리즘은 따라하기 쉽도록 설계된 것이며, 성능을 위해 설계된 것은 아닙니다.)

3. 용어 정의

실제로 Foo가 인터페이스인 경우 "a Foo object"라는 표현이 더 정확한 "인터페이스 Foo를 구현하는 객체" 대신에 사용되는 경우가 있습니다.

이 명세 전반에서, 모든 시간 값은 문서의 내비게이션 시작 시점부터의 밀리초 단위로 측정됩니다 [HR-TIME]. 예를 들어, 문서의 내비게이션 시작은 시간 0에서 발생합니다.

참고

이 시간 정의는 High Resolution Time 명세 [HR-TIME]을 기반으로 하며, Navigation Timing 명세 [NAVIGATION-TIMING-2]에서 사용되는 시간 정의와는 다릅니다. Navigation Timing에서는 시간이 1970년 1월 1일 0시(UTC) 이후의 밀리초 단위로 측정됩니다.

4. 리소스 타이밍

4.1 소개

이 섹션은 비규범적입니다.

PerformanceResourceTiming 인터페이스는 fetchhttp(s) 리소스의 타이밍 측정을 지원합니다. 예를 들어, 이 인터페이스는 XMLHttpRequest 객체 [XHR], HTML 요소들 [HTML] (예: iframe, img, script, object, embed, link (link 타입이 stylesheet인 경우), SVG 요소 [SVG11] (예: svg), 그리고 EventSource 등에서 사용할 수 있습니다.

4.2 PerformanceResourceTiming 인터페이스에 포함되는 리소스

이 섹션은 비규범적입니다.

non-null client에 의해 Requestfetch될 경우, 해당 리소스는 PerformanceResourceTiming 객체로 global objectPerformance Timeline에 포함됩니다. 단, fetch 과정에서 타임라인에 포함되지 않도록 제외된 경우는 예외입니다. HTTP 캐시에서 가져온 리소스도 PerformanceResourceTiming 객체로 Performance Timeline에 포함됩니다. fetch가 시작됐으나 이후 중단된(예: 네트워크 오류) 리소스도 시작/종료 타이밍과 함께 PerformanceResourceTiming 객체로 Performance Timeline에 포함됩니다.

예시:

4.3 PerformanceResourceTiming 인터페이스

WebIDL[Exposed=(Window,Worker)]
interface PerformanceResourceTiming : PerformanceEntry {
    readonly attribute DOMString initiatorType;
    readonly attribute DOMString deliveryType;
    readonly attribute ByteString nextHopProtocol;
    readonly attribute DOMHighResTimeStamp workerStart;
    readonly attribute DOMHighResTimeStamp redirectStart;
    readonly attribute DOMHighResTimeStamp redirectEnd;
    readonly attribute DOMHighResTimeStamp fetchStart;
    readonly attribute DOMHighResTimeStamp domainLookupStart;
    readonly attribute DOMHighResTimeStamp domainLookupEnd;
    readonly attribute DOMHighResTimeStamp connectStart;
    readonly attribute DOMHighResTimeStamp connectEnd;
    readonly attribute DOMHighResTimeStamp secureConnectionStart;
    readonly attribute DOMHighResTimeStamp requestStart;
    readonly attribute DOMHighResTimeStamp finalResponseHeadersStart;
    readonly attribute DOMHighResTimeStamp firstInterimResponseStart;
    readonly attribute DOMHighResTimeStamp responseStart;
    readonly attribute DOMHighResTimeStamp responseEnd;
    readonly attribute unsigned long long  transferSize;
    readonly attribute unsigned long long  encodedBodySize;
    readonly attribute unsigned long long  decodedBodySize;
    readonly attribute unsigned short responseStatus;
    readonly attribute RenderBlockingStatusType renderBlockingStatus;
    readonly attribute DOMString contentType;
    readonly attribute DOMString contentEncoding;
    [Default] object toJSON();
};

PerformanceResourceTiminginitiator type에 해당하는 DOMString을 가집니다.

PerformanceResourceTimingdelivery type에 해당하는 DOMString을 가집니다.

PerformanceResourceTimingrequested URL에 해당하는 DOMString을 가집니다.

PerformanceResourceTimingcache mode (빈 문자열, "local", 또는 "validated")에 해당하는 DOMString을 가집니다.

PerformanceResourceTimingfetch timing info에 해당하는 timing info를 가집니다.

PerformanceResourceTimingresponse body info에 해당하는 resource info를 가집니다.

PerformanceResourceTimingstatus에 해당하는 response status를 가집니다.

PerformanceResourceTimingRenderBlockingStatusType에 해당하는 render-blocking status를 가집니다.

toJSON가 호출되면, 기본 toJSON 단계PerformanceResourceTiming에 대해 실행합니다.

initiatorType getter 단계는 initiator typethis에 대해 반환합니다.

참고

initiatorType은 다음 값 중 하나를 반환합니다:

  • "navigation" : 요청이 navigation request인 경우
  • "body" : 요청이 이미 폐기된 body 요소의 background 속성 처리 결과인 경우
  • "css" : 요청이 CSS url() 지시(예: @import url() 또는 background: url()) 처리 결과인 경우 [CSS-VALUES]

    참고: @font-face로 지정된 폰트 리소스 요청 역시 CSS 지시 처리의 결과이므로 해당 폰트 리소스의 initiatorType"css"입니다.

  • "script" : 요청이 스크립트(script, module script, Worker) 로딩 처리 결과인 경우
  • "xmlhttprequest" : 요청이 XMLHttpRequest 처리 결과인 경우
  • "font" : 폰트 처리 결과로 발생한 요청(예: Incremental Font Transfer 사용 시)
  • "fetch" : fetch() 메서드 처리 결과인 경우
  • "beacon" : sendBeacon() 메서드 처리 결과인 경우 [BEACON]
  • "video" : video 요소의 poster 또는 src 처리 결과인 경우
  • "audio" : audio 요소의 src 처리 결과인 경우
  • "track" : track 요소의 src 처리 결과인 경우
  • "img" : img 요소의 src 또는 srcset 처리 결과인 경우
  • "image" : image 요소 처리 결과인 경우 [SVG2]
  • "input" : input 요소의 typeimage인 경우
  • "ping" : a 요소의 ping 처리 결과인 경우
  • "iframe" : iframe 요소의 src 처리 결과인 경우
  • "frame" : frame 로딩 처리 결과인 경우
  • "embed" : embed 요소의 src 처리 결과인 경우
  • "link" : link 요소 처리 결과인 경우
  • "object" : object 요소 처리 결과인 경우
  • "early-hints" : Early hints 응답 처리 결과인 경우
  • "other" : 위 조건에 해당하지 않는 경우
참고

initiatorType의 설정은 리소스 타이밍 엔트리가 보고되는 여러 위치(예: fetch 표준)에서 이루어집니다.

deliveryType getter 단계는 delivery typethis에 대해 반환합니다.

참고

deliveryType은 다음 값 중 하나를 반환합니다:

  • "cache", cache mode가 빈 문자열이 아닌 경우
  • 위 조건에 해당하지 않으면 빈 문자열 ""

이는 향후 명세 업데이트(예: 프리로드된 리소스 소비, 프리페치 내비게이션 요청 설명 등)에 따라 확장될 수 있습니다.

workerStart getter 단계는 fetch 타임스탬프 변환thistiming infofinal service worker start time관련 글로벌 객체에 대해 실행합니다. 자세한 내용은 HTTP fetch를 참조하세요.

redirectStart getter 단계는 fetch 타임스탬프 변환thistiming inforedirect start time관련 글로벌 객체에 대해 실행합니다. 자세한 내용은 HTTP-redirect fetch를 참조하세요.

redirectEnd getter 단계는 fetch 타임스탬프 변환thistiming inforedirect end time관련 글로벌 객체에 대해 실행합니다. 자세한 내용은 HTTP-redirect fetch를 참조하세요.

fetchStart getter 단계는 fetch 타임스탬프 변환thistiming infopost-redirect start time관련 글로벌 객체에 대해 실행합니다. 자세한 내용은 HTTP fetch를 참조하세요.

domainLookupStart getter 단계는 fetch 타임스탬프 변환thistiming infofinal connection timing infodomain lookup start time관련 글로벌 객체에 대해 실행합니다. 자세한 내용은 연결 타이밍 정보 기록를 참조하세요.

domainLookupEnd getter 단계는 fetch 타임스탬프 변환thistiming infofinal connection timing infodomain lookup end time관련 글로벌 객체에 대해 실행합니다. 자세한 내용은 연결 타이밍 정보 기록를 참조하세요.

connectStart getter 단계는 fetch 타임스탬프 변환thistiming infofinal connection timing infoconnection start time관련 글로벌 객체에 대해 실행합니다. 자세한 내용은 연결 타이밍 정보 기록를 참조하세요.

connectEnd getter 단계는 fetch 타임스탬프 변환thistiming infofinal connection timing infoconnection end time관련 글로벌 객체에 대해 실행합니다. 자세한 내용은 연결 타이밍 정보 기록를 참조하세요.

secureConnectionStart getter 단계는 fetch 타임스탬프 변환thistiming infofinal connection timing infosecure connection start time관련 글로벌 객체에 대해 실행합니다. 자세한 내용은 연결 타이밍 정보 기록를 참조하세요.

nextHopProtocol getter 단계는 isomorphic decodethistiming infofinal connection timing infoALPN negotiated protocol에 적용합니다. 자세한 내용은 연결 타이밍 정보 기록를 참조하세요.

참고

221번 이슈는 nextHopProtocol 지원을 제거할 것을 제안하고 있습니다. 이는 사용자 네트워크 구성에 대한 세부 정보를 노출할 수 있기 때문입니다.

requestStart getter 단계는 fetch 타임스탬프 변환thistiming infofinal network-request start time관련 글로벌 객체에 대해 실행합니다. 자세한 내용은 HTTP fetch를 참조하세요.

firstInterimResponseStart getter 단계는 fetch 타임스탬프 변환thistiming infofirst interim network-response start time관련 글로벌 객체에 대해 실행합니다. 자세한 내용은 HTTP fetch를 참조하세요.

finalResponseHeadersStart getter 단계는 fetch 타임스탬프 변환thistiming infofinal network-response start time관련 글로벌 객체에 대해 실행합니다. 자세한 내용은 HTTP fetch를 참조하세요.

responseStart getter 단계는 thisfirstInterimResponseStart 값이 0이 아니면 해당 값을 반환하고, 그렇지 않으면 thisfinalResponseHeadersStart 값을 반환합니다.

responseEnd getter 단계는 fetch 타임스탬프 변환thistiming infoend time관련 글로벌 객체에 대해 실행합니다. 자세한 내용은 fetch를 참조하세요.

encodedBodySize getter 단계는 thisresource infoencoded size 값을 반환합니다.

decodedBodySize getter 단계는 thisresource infodecoded size 값을 반환합니다.

transferSize getter 단계는 다음과 같습니다:

  1. thiscache mode가 "local"이면 0을 반환합니다.

  2. thiscache mode가 "validated"이면 300을 반환합니다.

  3. thisresponse body infoencoded size에 300을 더한 값을 반환합니다.

    참고

    transferSize에 더해지는 상수 값은 HTTP 헤더의 총 바이트 크기 노출을 대체합니다. 이는 특정 쿠키의 존재를 노출할 수 있기 때문입니다. 자세한 내용은 이 이슈를 참조하세요.

responseStatus getter 단계는 thisresponse status 값을 반환합니다.

참고

responseStatusFetch에서 결정됩니다. 교차 출처의 no-cors 요청의 경우, 응답이 opaque filtered response이므로 0이 됩니다.

contentType getter 단계는 thisresource infocontent type 값을 반환합니다.

contentEncoding getter 단계는 thisresource infocontent encoding 값을 반환합니다.

renderBlockingStatus getter 단계는 blocking을 반환합니다. 만약 thistiming inforender-blocking이 true이면, 그렇지 않으면 non-blocking을 반환합니다.

참고

PerformanceResourceTiming을 구현하는 사용자 에이전트는 supportedEntryTypes"resource"를 포함해야 합니다. 이를 통해 개발자는 리소스 타이밍 지원 여부를 감지할 수 있습니다.

4.3.1 RenderBlockingStatusType 열거형

WebIDLenum RenderBlockingStatusType {
    "blocking",
    "non-blocking"
};

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

blocking
해당 리소스가 렌더링을 차단할 수 있습니다.
non-blocking
해당 리소스는 렌더링을 차단하지 않습니다.

4.4 Performance 인터페이스 확장

사용자 에이전트는 MAY PerformanceResourceTiming 객체가 Performance Timeline [PERFORMANCE-TIMELINE-2]에 포함되는 리소스 개수를 제한할 수 있습니다. 본 섹션은 Performance 인터페이스를 확장하여 PerformanceResourceTiming 객체 저장 개수에 대한 제어 기능을 제공합니다.

PerformanceResourceTiming 객체의 권장 최소 개수는 250개이며, 이는 사용자 에이전트에 의해 변경될 수 있습니다. setResourceTimingBufferSize 를 호출하여 이 한도를 변경 요청할 수 있습니다.

ECMAScript 글로벌 환경은 다음을 가집니다:

WebIDLpartial interface Performance {
          undefined clearResourceTimings ();
          undefined setResourceTimingBufferSize (unsigned long maxSize);
          attribute EventHandler onresourcetimingbufferfull;
        };

Performance 인터페이스는 [HR-TIME]에 정의되어 있습니다.

clearResourceTimings 메서드는 다음 단계로 실행됩니다:

  1. PerformanceResourceTiming 객체를 performance entry buffer에서 모두 제거합니다.
  2. 리소스 타이밍 버퍼 현재 크기를 0으로 설정합니다.

setResourceTimingBufferSize 메서드는 다음 단계로 실행됩니다:

  1. 리소스 타이밍 버퍼 크기 제한maxSize 파라미터 값으로 설정합니다. maxSize리소스 타이밍 버퍼 현재 크기 값보다 작을 경우, PerformanceResourceTiming 객체는 performance entry buffer에서 제거하지 않습니다.

onresourcetimingbufferfull 속성은 아래에서 설명하는 resourcetimingbufferfull 이벤트의 이벤트 핸들러입니다.

리소스 타이밍 엔트리 추가 가능 여부를 확인하려면 다음 단계를 실행합니다:

  1. 리소스 타이밍 버퍼 현재 크기 리소스 타이밍 버퍼 크기 제한보다 작으면 true를 반환합니다.
  2. false를 반환합니다.

PerformanceResourceTiming 엔트리 추가 new entryperformance entry buffer에 추가하려면 다음 단계를 실행합니다:

  1. 리소스 타이밍 엔트리 추가 가능 여부가 true이고, 리소스 타이밍 버퍼 가득 참 이벤트 대기 플래그가 false이면 다음 하위 단계를 실행합니다:
    1. new entryperformance entry buffer에 추가합니다.
    2. 리소스 타이밍 버퍼 현재 크기를 1 증가시킵니다.
    3. 반환합니다.
  2. 리소스 타이밍 버퍼 가득 참 이벤트 대기 플래그가 false이면 다음 하위 단계를 실행합니다:
    1. 리소스 타이밍 버퍼 가득 참 이벤트 대기 플래그를 true로 설정합니다.
    2. 태스크 큐에 추가 performance timeline task source에 대해 실행하여 버퍼 가득 참 이벤트 발생를 실행합니다.
  3. new entry리소스 타이밍 보조 버퍼에 추가합니다.
  4. 리소스 타이밍 보조 버퍼 현재 크기를 1 증가시킵니다.

보조 버퍼 복사를 실행하려면 다음 단계로 진행합니다:

  1. 리소스 타이밍 보조 버퍼가 비어 있지 않고, 리소스 타이밍 엔트리 추가 가능 여부가 true이면 다음 하위 단계를 반복합니다:
    1. entry리소스 타이밍 보조 버퍼에서 가장 오래된 PerformanceResourceTiming로 설정합니다.
    2. entryperformance entry buffer 끝에 추가합니다.
    3. 리소스 타이밍 버퍼 현재 크기를 1 증가시킵니다.
    4. entry리소스 타이밍 보조 버퍼에서 제거합니다.
    5. 리소스 타이밍 보조 버퍼 현재 크기를 1 감소시킵니다.

버퍼 가득 참 이벤트 발생을 실행하려면 다음 단계를 진행합니다:

  1. 리소스 타이밍 보조 버퍼가 비어 있지 않은 동안 다음 하위 단계를 반복합니다:
    1. number of excess entries before리소스 타이밍 보조 버퍼 현재 크기로 설정합니다.
    2. 리소스 타이밍 엔트리 추가 가능 여부가 false이면 이벤트 발생 resourcetimingbufferfullPerformance 객체에서 실행합니다.
    3. 보조 버퍼 복사를 실행합니다.
    4. number of excess entries after리소스 타이밍 보조 버퍼 현재 크기로 설정합니다.
    5. number of excess entries beforenumber of excess entries after보다 작거나 같으면 리소스 타이밍 보조 버퍼에서 모든 엔트리를 제거하고, 리소스 타이밍 보조 버퍼 현재 크기를 0으로 설정한 후, 이 단계를 중단합니다.
  2. 리소스 타이밍 버퍼 가득 참 이벤트 대기 플래그를 false로 설정합니다.
    참고

    resourcetimingbufferfull 이벤트 핸들러가 버퍼 크기를 늘리는 것보다 더 많은 리소스를 추가하지 않을 경우, 초과 엔트리가 버퍼에서 삭제됨을 의미합니다. 개발자는 resourcetimingbufferfull 이벤트 핸들러에서 clearResourceTimings를 호출하거나 setResourceTimingBufferSize로 버퍼를 충분히 확장해야 합니다.

4.5 교차 출처 리소스

참고

Fetch에 자세히 설명된 바와 같이, 교차 출처 리소스에 대한 요청도 PerformanceResourceTiming 객체로 Performance Timeline에 포함됩니다. 교차 출처 리소스에 대해 timing allow check 알고리즘이 실패할 경우, 해당 엔트리는 불투명(opaque) 엔트리가 됩니다. 이러한 엔트리는 교차 출처 데이터 유출을 방지하기 위해 대부분의 속성이 마스킹됩니다. 즉, redirectStart, redirectEnd, workerStart, domainLookupStart, domainLookupEnd, connectStart, connectEnd, requestStart, firstInterimResponseStart, finalResponseHeadersStart, responseStart, secureConnectionStart, transferSize, encodedBodySize, 그리고 decodedBodySize 속성은 0으로 설정됩니다. 또한 nextHopProtocol 속성은 빈 문자열로 설정됩니다.

서버측 애플리케이션은 Timing-Allow-Origin HTTP 응답 헤더를 반환하여, 명시된 문서 출처(origin)에 대해 교차 출처 제한으로 인해 0이 되었을 속성 값을 완전히 노출하도록 User Agent에 허용할 수 있습니다.

4.5.1 Timing-Allow-Origin 응답 헤더

Timing-Allow-Origin HTTP 응답 헤더 필드는 교차 출처 제한 때문에 0이 되었을 속성 값을 볼 수 있도록 허용되는 출처(origin) 정책을 전달하는데 사용할 수 있습니다. 이 헤더 값은 다음 ABNF로 표현됩니다 [RFC5234] (List Extension 사용, [RFC9110]):

Timing-Allow-Origin = 1#( origin-or-null / wildcard )

송신자는 Timing-Allow-Origin 헤더 필드를 여러 개 생성할 수 있습니다(MAY). 수신자는 여러 Timing-Allow-Origin 헤더 필드를 순서대로 각각의 필드 값을 결합해, 쉼표로 구분된 하나의 필드 값으로 만들 수 있습니다(MAY).

사용자 에이전트는 MAY Timing-Allow-Origin HTTP 응답 헤더가 있어도 교차 출처 제한을 계속 적용하여 transferSize, encodedBodySize, decodedBodySize 속성을 0으로 설정할 수 있습니다. 이 경우 deliveryType도 ""로 설정할 수 있습니다(MAY).

Timing-Allow-Origin 헤더는 FETCH에서 처리되어 적절하게 속성 값이 계산됩니다.

참고

Timing-Allow-Origin 헤더는 캐시된 응답에 포함되어 있을 수 있습니다. 캐시 재검증 시(RFC 7234 참조), 헤더 값은 재검증 응답에서 오거나, 그곳에 없다면 원래 캐싱된 리소스에서 올 수 있습니다.

참고

222223 이슈는 Timing-Allow-Origin의 와일드카드 지원을 제거하여 사용을 제한할 것을 제안합니다.

4.5.2 IANA 고려 사항

본 섹션에서는 Timing-Allow-Origin임시 메시지 헤더(Provisional Message Header)로 등록합니다.

헤더 필드 이름:
Timing-Allow-Origin
적용 프로토콜:
http
상태:
임시(provisional)
작성자/변경 컨트롤러:
W3C
명세 문서:
4.5.1 Timing-Allow-Origin 응답 헤더

4.6 리소스 타이밍 속성

이 섹션은 비규범적입니다.

아래 그래프는 PerformanceResourceTiming 인터페이스에서 정의된 타이밍 속성을 보여줍니다. 괄호로 표시된 속성은 교차 출처 리소스 fetch 시 제공되지 않을 수 있습니다. 사용자 에이전트는 타이밍 사이에 내부 처리를 수행할 수 있으므로, 타이밍 간 비규범적 간격이 존재할 수 있습니다.

그림 1 이 그림은 PerformanceResourceTiming 인터페이스에서 정의된 타이밍 속성을 보여줍니다. 괄호로 표시된 속성은 리소스가 timing allow check 알고리즘을 통과하지 못한 경우 제공되지 않을 수 있습니다.
Resource Timing attributes

4.7 리소스 타이밍 항목 생성

리소스 타이밍 마킹을 수행하려면 fetch timing info timingInfo, DOMString requestedURL, DOMString initiatorType, global object global, 문자열 cacheMode, response body info bodyInfo, status responseStatus, 그리고 선택적으로 string deliveryType (기본값은 빈 문자열)로, 다음 단계를 수행합니다:

  1. PerformanceResourceTiming 객체 entryglobalrealm에서 생성합니다.
  2. 리소스 타이밍 항목 설정entry에 대해, initiatorType, requestedURL, timingInfo, cacheMode, bodyInfo, responseStatus, deliveryType를 사용하여 수행합니다.
  3. Queue entry를 수행합니다.
  4. Add entryglobalperformance entry buffer에 추가합니다.

리소스 타이밍 항목 설정PerformanceResourceTiming entry에 대해, DOMString initiatorType, DOMString requestedURL, fetch timing info timingInfo, DOMString cacheMode, response body info bodyInfo, status responseStatus, 그리고 선택적 DOMString deliveryType(기본값은 빈 문자열)으로, 다음 단계를 수행합니다:

  1. cacheMode가 빈 문자열, "local", 또는 "validated"임을 단언합니다.
  2. globalentry관련 글로벌 객체로 설정합니다.
  3. Initialize entry를, 타임스탬프 변환으로 얻은 timingInfostart timeglobal, "resource", requestedURL타임스탬프 변환으로 얻은 timingInfoend timeglobal을 사용하여 초기화합니다.
  4. entryinitiator typeinitiatorType으로 설정합니다.
  5. entryrequested URLrequestedURL로 설정합니다.
  6. entrytiming infotimingInfo로 설정합니다.
  7. entryresponse body infobodyInfo로 설정합니다.
  8. entrycache modecacheMode로 설정합니다.
  9. entryresponse statusresponseStatus로 설정합니다.
  10. deliveryType이 빈 문자열이고 cacheMode가 빈 문자열이 아니면, deliveryType을 "cache"로 설정합니다.
  11. entrydelivery typedeliveryType으로 설정합니다.

fetch 타임스탬프 변환DOMHighResTimeStamp tsglobal object global에 대해 수행하려면 다음을 실행합니다:

  1. ts가 0이면 0을 반환합니다.
  2. 그 밖에는, 상대 고해상도 시간tsglobal로 계산하여 반환합니다.

4.8 보안 고려 사항

이 섹션은 비규범적입니다.

PerformanceResourceTiming 인터페이스는 리소스를 요청한 웹 페이지 또는 워커에 타이밍 정보를 노출합니다. PerformanceResourceTiming 인터페이스 접근을 제한하기 위해 기본적으로 동일 출처 정책이 적용되며 특정 속성이 0으로 설정됩니다. 이는 HTTP fetch에서 설명한 바와 같습니다. 리소스 제공자는 Timing-Allow-Origin HTTP 응답 헤더를 추가하여 리소스의 모든 타이밍 정보를 명시적으로 수집할 수 있도록 허용할 수 있습니다. 이 헤더는 타이밍 정보에 접근할 수 있는 도메인을 지정합니다.

4.9 개인정보 보호 고려 사항

이 섹션은 비규범적입니다.

통계적 핑거프린팅은 악의적인 웹사이트가 사용자가 제3자 웹사이트를 방문했는지 여부를, 제3자 웹사이트의 리소스 캐시 적중/미스의 타이밍을 측정함으로써 파악할 수 있는 개인정보 보호 문제입니다. PerformanceResourceTiming 인터페이스는 문서 내 리소스에 대한 타이밍 정보를 제공하지만, 리소스의 load 이벤트만으로도 제한적으로 캐시 적중/미스를 측정할 수 있습니다. 또한 HTTP Fetch의 교차 출처 제한은 추가 정보 유출을 방지합니다.

4.10 감사의 글

이 작업에 기여해 준 Anne Van Kesteren, Annie Sullivan, Arvind Jain, Boris Zbarsky, Darin Fisher, Jason Weber, Jonas Sicking, James Simonsen, Karen Anderson, Kyle Scholz, Nic Jansma, Philippe Le Hegaret, Sigbjørn Vik, Steve Souders, Todd Reifsteck, Tony Gentilcore, William Chan, 그리고 Alex Christensen에게 감사드립니다.

A. 참고문헌

A.1 규범적 참고문헌

[dom]
DOM 표준. Anne van Kesteren. WHATWG. 현행 표준. URL: https://dom.spec.whatwg.org/
[FETCH]
Fetch 표준. Anne van Kesteren. WHATWG. 현행 표준. URL: https://fetch.spec.whatwg.org/
[HR-TIME]
고해상도 시간(High Resolution Time). Yoav Weiss. W3C. 2024년 11월 7일. W3C Working Draft. 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/
[NAVIGATION-TIMING-2]
내비게이션 타이밍 레벨 2(Navigation Timing Level 2). Yoav Weiss; Noam Rosenthal. W3C. 2025년 2월 13일. W3C Working Draft. URL: https://www.w3.org/TR/navigation-timing-2/
[PERFORMANCE-TIMELINE-2]
Performance Timeline. Nicolas Pena Moreno. W3C. 2025년 5월 21일. CRD. URL: https://www.w3.org/TR/performance-timeline/
[RFC2119]
RFC에서 요구 수준을 나타내는 키워드(Key words for use in RFCs to Indicate Requirement Levels). S. Bradner. IETF. 1997년 3월. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC2397]
"data" URL 스킴. L. Masinter. IETF. 1998년 8월. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc2397
[RFC5234]
구문 명세를 위한 확장 BNF(ABNF). D. Crocker, Ed.; P. Overell. IETF. 2008년 1월. Internet Standard. URL: https://www.rfc-editor.org/rfc/rfc5234
[RFC8174]
RFC 2119 키워드의 대소문자 모호성(Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words). B. Leiba. IETF. 2017년 5월. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc8174
[RFC9110]
HTTP 의미론(HTTP Semantics). R. Fielding, Ed.; M. Nottingham, Ed.; J. Reschke, Ed. IETF. 2022년 6월. Internet Standard. URL: https://httpwg.org/specs/rfc9110.html
[WEBIDL]
Web IDL 표준. Edgar Chen; Timothy Gu. WHATWG. 현행 표준. URL: https://webidl.spec.whatwg.org/

A.2 비규범적 참고문헌

[BEACON]
Beacon. Ilya Grigorik; Alois Reitbauer. W3C. 2022년 8월 3일. CRD. URL: https://www.w3.org/TR/beacon/
[CSS-VALUES]
CSS 값 및 단위 모듈 3(CSS Values and Units Module Level 3). Tab Atkins Jr.; Elika Etemad. W3C. 2024년 3월 22일. CRD. URL: https://www.w3.org/TR/css-values-3/
[css-values-4]
CSS 값 및 단위 모듈 4(CSS Values and Units Module Level 4). Tab Atkins Jr.; Elika Etemad. W3C. 2024년 3월 12일. W3C Working Draft. URL: https://www.w3.org/TR/css-values-4/
[EARLY_HINTS]
Early hints. URL: https://httpwg.org/specs/rfc8297.html
[INCREMENTAL_FONT_TRANSFER]
Incremental Font Transfer. URL: https://www.w3.org/TR/IFT/
[SVG11]
Scalable Vector Graphics (SVG) 1.1 (Second Edition). Erik Dahlström; Patrick Dengler; Anthony Grasso; Chris Lilley; Cameron McCormack; Doug Schepers; Jonathan Watt; Jon Ferraiolo; Jun Fujisawa; Dean Jackson 등. W3C. 2011년 8월 16일. W3C Recommendation. URL: https://www.w3.org/TR/SVG11/
[SVG2]
Scalable Vector Graphics (SVG) 2. Amelia Bellamy-Royds; Bogdan Brinza; Chris Lilley; Dirk Schulze; David Storey; Eric Willigers. W3C. 2018년 10월 4일. W3C Candidate Recommendation. URL: https://www.w3.org/TR/SVG2/
[XHR]
XMLHttpRequest 표준. Anne van Kesteren. WHATWG. 현행 표준. URL: https://xhr.spec.whatwg.org/