Copyright © 2026 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
이 명세는 웹 애플리케이션이 문서의 리소스에 대한 전체 타이밍 정보를 접근할 수 있는 인터페이스를 정의합니다.
이 섹션은 이 문서가 공개된 시점의 상태를 설명합니다. 현재 W3C 출판물 목록과 이 기술 보고서의 최신 개정본은 W3C 표준 및 초안 인덱스에서 확인할 수 있습니다.
이 문서는 웹 성능 작업 그룹이 권고안 트랙을 사용하여 후보 권고안 초안으로 발표한 것입니다.
후보 권고안으로 출판된다고 해서 W3C 및 그 회원의 승인됨을 의미하지 않습니다. 후보 권고안 초안은 이전 후보 권고안에서 작업 그룹이 이후 후보 권고안 스냅샷에 포함하려는 변경 사항을 통합한 것입니다.
이 문서는 초안 문서로, 언제든지 업데이트, 대체 또는 폐기될 수 있습니다. 진행 중인 작업 외의 것으로 이 문서를 인용하는 것은 적절하지 않습니다.
이 문서는 W3C 특허 정책에 따라 운영되는 그룹이 작성하였습니다. W3C는 그룹 결과물과 관련된 특허 공개 공용 목록 을 관리합니다. 해당 페이지에는 특허 공개 방법도 포함되어 있습니다. 개인이 필수적 청구를 포함한다고 생각되는 특허를 실제로 알고 있는 경우, 필수적 청구 정보를 W3C 특허 정책 섹션 6에 따라 공개해야 합니다.
이 문서는 2025년 8월 18일 W3C 절차 문서에 따라 관리됩니다.
이 섹션은 비규범적입니다.
사용자 지연(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>
비규범적으로 표시된 섹션뿐만 아니라, 이 명세의 모든 저작 가이드라인, 도표, 예제, 그리고 참고 사항은 비규범적입니다. 이 명세의 그 외 모든 내용은 규범적입니다.
이 문서에서 MAY, MUST, SHOULD와 같은 핵심 키워드는 BCP 14 [RFC2119] [RFC8174] 에서 설명된 대로, 그리고 오직 이와 같이 모두 대문자로 표시될 때만 해당 의미로 해석됩니다.
알고리즘의 일부로 명령형으로 표현된 요구사항(예: "앞의 공백 문자를 모두 제거한다" 또는 "false를 반환하고 이 단계를 중단한다")은 알고리즘 앞부분에서 사용된 키워드("MUST", "SHOULD", "MAY" 등) 의미에 따라 해석되어야 합니다.
일부 적합성 요구사항은 속성, 메서드 또는 객체에 대한 요구사항으로 표현됩니다. 이러한 요구사항은 사용자 에이전트에 대한 요구사항으로 해석되어야 합니다.
알고리즘 또는 특정 단계로 표현된 적합성 요구사항은 결과가 동등하다면 어떤 방식으로든 구현할 수 있습니다. (특히, 이 명세서에서 정의된 알고리즘은 따라하기 쉽도록 설계된 것이며, 성능을 위해 설계된 것은 아닙니다.)
실제로 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) 이후의 밀리초 단위로 측정됩니다.
이 섹션은 비규범적입니다.
PerformanceResourceTiming 인터페이스는
fetch된
http(s)
리소스의 타이밍 측정을 지원합니다. 예를 들어, 이 인터페이스는
XMLHttpRequest 객체 [XHR], HTML 요소들 [HTML] (예:
iframe,
img,
script,
object,
embed,
link
(link 타입이
stylesheet인
경우),
SVG 요소 [SVG11]
(예: svg), 그리고
EventSource
등에서 사용할 수 있습니다.
PerformanceResourceTiming
인터페이스에 포함되는 리소스
이 섹션은 비규범적입니다.
non-null client에 의해 Request가 fetch될 경우,
해당 리소스는 PerformanceResourceTiming 객체로
global
object의
Performance Timeline에
포함됩니다.
단, fetch 과정에서 타임라인에 포함되지 않도록 제외된 경우는 예외입니다.
HTTP 캐시에서 가져온 리소스도 PerformanceResourceTiming 객체로
Performance Timeline에
포함됩니다.
fetch가 시작됐으나 이후 중단된(예: 네트워크 오류) 리소스도 시작/종료 타이밍과 함께
PerformanceResourceTiming 객체로
Performance Timeline에
포함됩니다.
예시:
IMG 요소의 src 속성에 사용될 경우,
첫 번째 HTML IMG 요소가 시작한 리소스의 fetch는
PerformanceResourceTiming 객체로
Performance Timeline에
포함됩니다.
사용자 에이전트는 두 번째 HTML IMG 요소에 대해 URL을 재요청하지 않고, 첫 번째 IMG 요소를 위해 시작한 다운로드를
사용할 수도 있습니다.
이 경우, IMG 요소의 fetch가
Performance Timeline에
한 번만 나타납니다.
IMG 요소의 src 속성이 스크립트로 변경된 경우,
원래 리소스의 fetch와 새
URL의 fetch 모두가
PerformanceResourceTiming 객체로
Performance Timeline에
포함됩니다.
IFRAME 요소가 마크업으로 추가되고 src 속성이 지정되지 않은 경우,
사용자 에이전트는 about:blank 문서를 IFRAME에 로드할 수 있습니다.
이후에 src 속성이 스크립트로 동적으로 변경되면, 사용자 에이전트는 IFRAME에 대해 새 URL 리소스를 fetch할 수 있습니다.
이 경우, 새 URL의 fetch만
PerformanceResourceTiming 객체로
Performance Timeline에
포함됩니다.
XMLHttpRequest가 두 번 생성된 경우,
리소스에 대한 두 번의 fetch
모두가
PerformanceResourceTiming 객체로
Performance Timeline에
포함됩니다.
두 번째 XMLHttpRequest의 fetch는 첫 번째 XMLHttpRequest의 다운로드를 재사용할 수 없기 때문입니다.
IFRAME 요소가 페이지에 포함된 경우,
IFRAME의 src 속성에 의해 요청된 리소스만
PerformanceResourceTiming 객체로
Performance Timeline에
포함됩니다.
IFRAME 문서가 요청한 하위 리소스는 IFRAME 문서의
Performance Timeline에
포함되며,
부모 문서의 Performance
Timeline에는 포함되지 않습니다.
IMG 요소의 src가
data: URI인 경우 [RFC2397], 해당 리소스는
PerformanceResourceTiming 객체로
Performance Timeline에
포함되지 않습니다.
PerformanceResourceTiming 엔트리는
http(s) 리소스에 대해서만 보고됩니다.
PerformanceResourceTiming 객체로
Performance Timeline에
포함되며,
startTime, fetchStart, duration, responseEnd만
설정됩니다.
PerformanceResourceTiming 객체로
Performance Timeline에
포함되지 않습니다.
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 DOMHighResTimeStamp workerRouterEvaluationStart;
readonly attribute DOMHighResTimeStamp workerCacheLookupStart;
readonly attribute DOMString workerMatchedRouterSource;
readonly attribute DOMString workerFinalRouterSource;
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();
};
PerformanceResourceTiming은
관련된 DOMString
초기자 유형을 가진다.
PerformanceResourceTiming은
관련된 DOMString
전달 유형을 가진다.
PerformanceResourceTiming은
관련된 DOMString
요청된 URL을 가진다.
PerformanceResourceTiming은
관련된 DOMString
캐시 모드
(빈 문자열, "local", 또는 "validated")를 가진다.
PerformanceResourceTiming는
fetch timing
info에 해당하는 timing
info를 가집니다.
PerformanceResourceTiming는
response
body info에 해당하는 resource
info를 가집니다.
PerformanceResourceTiming는
status에 해당하는 response status를 가집니다.
PerformanceResourceTiming는
RenderBlockingStatusType에 해당하는 render-blocking status를 가집니다.
toJSON가 호출되면, 기본 toJSON 단계를
PerformanceResourceTiming에 대해 실행합니다.
initiatorType getter 단계는 initiator type을 this에 대해 반환합니다.
initiatorType은 다음 값 중 하나를 반환합니다:
"navigation" : 요청이 navigation request인 경우
"body" : 요청이 이미 폐기된
body
요소의 background 속성 처리 결과인 경우
"css", 요청이 다음과 같은
CSS url() 지시문을 처리한 결과인 경우:
@import
url()
또는
background: url();
[CSS-VALUES]
참고: CSS에서 @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
요소의
type이
image인
경우
"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 type을 this에 대해 반환합니다.
deliveryType은 다음 값 중 하나를 반환합니다:
"cache", cache mode가
빈 문자열이 아닌 경우
""이는 향후 명세 업데이트(예: 프리로드된 리소스 소비, 프리페치 내비게이션 요청 설명 등)에 따라 확장될 수 있습니다.
workerStart getter 단계는 fetch 타임스탬프 변환을 this의 timing info의 final
service worker start time과 관련 글로벌 객체에
대해 실행합니다. 자세한 내용은 HTTP
fetch를 참조하세요.
redirectStart getter 단계는 fetch 타임스탬프 변환을 this의 timing info의 redirect start time과
관련 글로벌 객체에
대해 실행합니다. 자세한 내용은 HTTP-redirect
fetch를 참조하세요.
redirectEnd getter 단계는 fetch 타임스탬프 변환을 this의 timing info의 redirect end time과
관련 글로벌 객체에
대해 실행합니다. 자세한 내용은 HTTP-redirect
fetch를 참조하세요.
fetchStart getter 단계는 fetch 타임스탬프 변환을 this의 timing info의 post-redirect start
time과 관련 글로벌 객체에
대해 실행합니다. 자세한 내용은 HTTP
fetch를 참조하세요.
domainLookupStart getter 단계는 fetch 타임스탬프 변환을 this의 timing info의 final
connection timing info의 domain lookup
start time과 관련 글로벌 객체에
대해 실행합니다. 자세한 내용은 연결 타이밍 정보
기록를 참조하세요.
domainLookupEnd getter 단계는 fetch 타임스탬프 변환을 this의 timing info의 final
connection timing info의 domain lookup
end time과 관련 글로벌 객체에
대해 실행합니다. 자세한 내용은 연결 타이밍 정보
기록를 참조하세요.
connectStart getter 단계는 fetch 타임스탬프 변환을 this의 timing info의 final
connection timing info의 connection start
time과 관련 글로벌 객체에
대해 실행합니다. 자세한 내용은 연결 타이밍 정보
기록를 참조하세요.
connectEnd getter 단계는 fetch 타임스탬프 변환을 this의 timing info의 final
connection timing info의 connection end
time과 관련 글로벌 객체에
대해 실행합니다. 자세한 내용은 연결 타이밍 정보
기록를 참조하세요.
secureConnectionStart getter 단계는 fetch 타임스탬프 변환을 this의 timing info의 final
connection timing info의 secure
connection start time과 관련 글로벌 객체에
대해 실행합니다. 자세한 내용은 연결 타이밍 정보
기록를 참조하세요.
nextHopProtocol getter 단계는 isomorphic decode를
this의 timing info의
final
connection timing info의 ALPN
negotiated protocol에 적용합니다. 자세한 내용은 연결 타이밍 정보 기록를 참조하세요.
221번 이슈는 nextHopProtocol 지원을 제거할 것을 제안하고 있습니다. 이는 사용자 네트워크 구성에 대한 세부 정보를 노출할 수 있기 때문입니다.
requestStart getter 단계는 fetch 타임스탬프 변환을 this의 timing info의 final
network-request start time과 관련 글로벌 객체에
대해 실행합니다. 자세한 내용은 HTTP
fetch를 참조하세요.
firstInterimResponseStart getter 단계는
fetch 타임스탬프 변환을 this의 timing info의 first
interim network-response start time과 관련 글로벌 객체에
대해 실행합니다. 자세한 내용은 HTTP
fetch를 참조하세요.
finalResponseHeadersStart getter 단계는
fetch 타임스탬프 변환을 this의 timing info의 final
network-response start time과 관련 글로벌 객체에
대해 실행합니다. 자세한 내용은 HTTP
fetch를 참조하세요.
responseStart getter 단계는 this의
firstInterimResponseStart
값이 0이 아니면 해당 값을 반환하고, 그렇지 않으면 this의
finalResponseHeadersStart
값을 반환합니다.
responseEnd getter 단계는 fetch 타임스탬프 변환을 this의 timing info의 end time과 관련 글로벌 객체에
대해 실행합니다. 자세한 내용은 fetch를
참조하세요.
encodedBodySize getter 단계는
this의 resource
info의 encoded size 값을 반환합니다.
decodedBodySize getter 단계는
this의 resource
info의 decoded size 값을 반환합니다.
transferSize getter 단계는 다음과 같습니다:
this의 cache
mode가 "local"이면 0을 반환합니다.
this의 cache
mode가 "validated"이면 300을 반환합니다.
this의 response body info의 encoded size에 300을 더한 값을 반환합니다.
transferSize에 더해지는 상수 값은 HTTP 헤더의 총 바이트 크기 노출을 대체합니다. 이는 특정 쿠키의 존재를 노출할 수 있기
때문입니다. 자세한 내용은 이 이슈를 참조하세요.
responseStatus getter 단계는
this의 response
status 값을 반환합니다.
responseStatus는 Fetch에서 결정됩니다. 교차 출처의 no-cors 요청의 경우, 응답이 opaque filtered
response이므로 0이 됩니다.
contentType getter 단계는 this의
resource info의
content
type 값을 반환합니다.
contentEncoding getter 단계는
this의 resource
info의 content encoding 값을
반환합니다.
renderBlockingStatus getter 단계는
blocking을 반환합니다. 만약 this의 timing info의 render-blocking이 true이면,
그렇지 않으면 non-blocking을 반환합니다.
workerRouterEvaluationStart getter 단계는
this의 timing
info의 service worker
timing info의
worker
router evaluation start를 반환하는 것이다.
workerCacheLookupStart getter 단계는
this의 timing
info의 service worker
timing info의
worker
cache lookup start를 반환하는 것이다.
workerMatchedRouterSource getter 단계는
this의 timing
info의 service worker
timing info의
worker
matched router source를 반환하는 것이다.
workerFinalRouterSource getter 단계는
return
this의 timing
info의 service worker
timing info의
worker
final router source를 반환하는 것이다.
PerformanceResourceTiming을 구현하는
사용자 에이전트는
supportedEntryTypes에
"resource"를 포함해야 합니다. 이를 통해 개발자는 리소스 타이밍 지원 여부를 감지할 수 있습니다.
WebIDLenum RenderBlockingStatusType {
"blocking",
"non-blocking"
};
각 값의 정의는 다음과 같습니다:
blocking
non-blocking
사용자 에이전트는 MAY
PerformanceResourceTiming 객체가
Performance Timeline
[PERFORMANCE-TIMELINE-2]에 포함되는 리소스 개수를 제한할 수 있습니다.
본 섹션은 Performance
인터페이스를 확장하여
PerformanceResourceTiming 객체 저장 개수에
대한 제어 기능을 제공합니다.
PerformanceResourceTiming
객체의 권장 최소 개수는 250개이며, 이는 사용자 에이전트에 의해 변경될 수 있습니다.
setResourceTimingBufferSize
를 호출하여 이 한도를 변경 요청할 수 있습니다.
각 ECMAScript 글로벌 환경은 다음을 가집니다:
PerformanceResourceTiming 객체를 저장
WebIDLpartial interface Performance {
undefined clearResourceTimings ();
undefined setResourceTimingBufferSize (unsigned long maxSize);
attribute EventHandler onresourcetimingbufferfull;
};
Performance 인터페이스는 [HR-TIME]에 정의되어 있습니다.
clearResourceTimings 메서드는 다음 단계로 실행됩니다:
PerformanceResourceTiming 객체를
performance entry
buffer에서 모두 제거합니다.
setResourceTimingBufferSize 메서드는 다음 단계로
실행됩니다:
PerformanceResourceTiming 객체는
performance entry
buffer에서 제거하지 않습니다.
onresourcetimingbufferfull 속성은 아래에서 설명하는
resourcetimingbufferfull 이벤트의 이벤트 핸들러입니다.
리소스 타이밍 엔트리 추가 가능 여부를 확인하려면 다음 단계를 실행합니다:
PerformanceResourceTiming 엔트리 추가 new entry를 performance entry buffer에 추가하려면 다음 단계를 실행합니다:
보조 버퍼 복사를 실행하려면 다음 단계로 진행합니다:
PerformanceResourceTiming로
설정합니다.
버퍼 가득 참 이벤트 발생을 실행하려면 다음 단계를 진행합니다:
resourcetimingbufferfull을
Performance 객체에서 실행합니다.
resourcetimingbufferfull 이벤트 핸들러가 버퍼 크기를 늘리는 것보다 더 많은 리소스를 추가하지 않을 경우,
초과 엔트리가 버퍼에서 삭제됨을 의미합니다. 개발자는 resourcetimingbufferfull 이벤트 핸들러에서
clearResourceTimings를 호출하거나 setResourceTimingBufferSize로 버퍼를 충분히
확장해야 합니다.
이 절은 비규범적입니다.
Fetch에 자세히 설명된 바와 같이, 교차 출처 리소스에 대한 요청은PerformanceResourceTiming 객체로
Performance
Timeline에 포함됩니다.
교차 출처 리소스에 대해 timing
allow check 알고리즘이 실패하면,
해당 엔트리는 불투명 엔트리가 됩니다. 이러한
엔트리는 다른 방식으로는 노출되지 않는 교차 출처 데이터가 누출되는 것을 방지하기 위해 대부분의 속성이 마스킹됩니다. 따라서
불투명 엔트리의 경우,
다음
속성들은 항상 0 또는 빈 문자열을 반환합니다:
redirectStart,
redirectEnd,
workerStart,
domainLookupStart,
domainLookupEnd,
connectStart,
connectEnd,
requestStart,
firstInterimResponseStart,
finalResponseHeadersStart,
responseStart,
secureConnectionStart,
그리고 nextHopProtocol.
contentType,
encodedBodySize,
그리고
decodedBodySize
같은 일부 속성은 응답이
CORS-cross-origin일 때 0으로
설정됩니다(또는
contentType의 경우 빈
문자열).
transferSize는
timing
allow check와
CORS-cross-origin 상태의
영향을 모두 받습니다.
서비스 워커가
respondWith()를
사용하여 처리한 요청의 경우, 보고되는 타이밍 데이터는
서비스 워커 자체의 내부 네트워크 활동이 아니라
클라이언트와 서비스 워커 간의 상호작용을 반영합니다.
예를 들어, 서비스 워커는 동일 출처 요청에 대해 교차 출처 응답으로 응답할 수도 있고
그 반대일 수도 있으며,
어느 쪽이든 캐시된 또는 합성된 응답을 반환할 수도 있습니다.
그러므로 서비스 워커에서 전달된 리소스는 리소스를 가져오는 전체 과정을 모두 말해 주지 않으며,
timing
allow check를 거치지 않습니다.
이러한 fetch에 대한 전체 정보를 얻으려면, 서비스 워커 자체의 성능 타임라인을
검사할 수 있습니다. [SERVICE-WORKERS]
자세한 내용은 HTTP Fetch #4를 참조하십시오
- timing
allow check는 서비스 워커로부터 응답이 없을 때에만 수행됩니다.
또한 respondWith()
알고리즘에서 복제된 response는
내부 fetch의 fetch
timing info를
포함하지 않는데, 그 정보는 response가 아니라 fetch에
부착되기 때문입니다.
서버 측 애플리케이션은 지정된 문서 출처(들)에 대해 교차 출처 제한으로 인해 0이 되었을 속성 값들을 사용자 에이전트가 완전히 노출할 수 있도록 Timing-Allow-Origin HTTP 응답 헤더를 반환할 수 있습니다.
Timing-Allow-Origin HTTP 응답 헤더 필드는 교차 출처 제한으로 인해 0이 되었을 속성 값들을 볼 수 있도록 허용될 수 있는 출처(들)를 나타내는 정책을 전달하는 데 사용할 수 있습니다. 헤더의 값은 다음 ABNF로 표현됩니다 [RFC5234] (List Extension 사용, [RFC9110]):
Timing-Allow-Origin = 1#( origin-or-null / wildcard )
발신자는 여러 개의 Timing-Allow-Origin 헤더 필드를 생성할 수도 있습니다. 수신자는 여러 개의 Timing-Allow-Origin 헤더 필드를 각 후속 필드 값을 결합된 필드 값 뒤에 순서대로 덧붙이고 쉼표로 구분하여 결합할 수도 있습니다.
사용자 에이전트는 Timing-Allow-Origin HTTP 응답 헤더 필드가 있더라도 여전히 교차 출처 제한을 강제하고 transferSize, encodedBodySize, decodedBodySize 속성을 0으로 설정할 수도 있습니다. 그렇게 한다면 deliveryType도 ""로 설정할 수도 있습니다.
Timing-Allow-Origin 헤더는 FETCH에서 처리되어 그에 따라 속성을 계산합니다.
Timing-Allow-Origin 헤더는 캐시된 응답의 일부로 도착할 수 있습니다. 캐시 재검증의 경우, RFC 7234에 따라, 헤더의 값은 재검증 응답에서 올 수도 있고, 거기에 존재하지 않으면 원래의 캐시된 리소스에서 올 수도 있습니다.
이 절은 Timing-Allow-Origin을 임시 메시지 헤더로 등록합니다.
Timing-Allow-Origin
Timing-Allow-Origin 응답 헤더
이 절은 비규범적입니다.
다음 그래프는 PerformanceResourceTiming 인터페이스에 의해 정의된 타이밍 속성을 보여줍니다. 괄호 안의 속성은 교차 출처 리소스를 가져오는 경우 사용할 수 없을 수 있습니다. 사용자 에이전트는 타이밍들 사이에서 내부 처리를 수행할 수 있으며, 그로 인해 타이밍들 사이에 비규범적 간격이 생길 수 있습니다.
PerformanceResourceTiming
인터페이스에 의해 정의된 타이밍 속성을 보여줍니다. 괄호 안의 속성은 리소스가
timing allow
check 알고리즘에 실패하는 경우 사용할 수 없을 수 있음을 나타냅니다.
fetch timing info timingInfo, a DOMString requestedURL, a DOMString initiatorType a global object global, a string cacheMode, a response body info bodyInfo, a status responseStatus, 그리고 선택적인 string deliveryType(기본값은 빈 문자열)가 주어졌을 때 리소스 타이밍을 마킹하려면, 다음 단계를 수행합니다:
PerformanceResourceTiming 객체
entry를
global의 realm에
생성합니다.
DOMString initiatorType, DOMString requestedURL, fetch timing info
timingInfo, a DOMString cacheMode, a response body info
bodyInfo, a status
responseStatus, 그리고 선택적인 DOMString deliveryType(기본값은
빈 문자열)가 주어졌을 때
PerformanceResourceTiming
entry에 대해 리소스 타이밍 엔트리를 설정하려면, 다음 단계를 수행합니다:
local", 또는 "validated"임을 단언합니다.
resource", requestedURL, 그리고 global이 주어졌을 때
timingInfo의
end time을
변환한 결과로
entry를 초기화합니다.
cache"로 설정합니다.
DOMHighResTimeStamp
ts와 global object
global이 주어졌을 때 fetch
타임스탬프를 변환하려면, 다음을 수행합니다:
이 절은 비규범적입니다.
PerformanceResourceTiming 인터페이스는
해당 리소스를 요청한 어떤 웹 페이지 또는 워커에게든 리소스에 대한 타이밍
정보를 노출합니다. PerformanceResourceTiming 인터페이스에 대한
접근을 제한하기 위해,
동일 출처 정책이 기본적으로 강제되며,
HTTP fetch에 설명된 바와 같이
특정 속성들은 0으로 설정됩니다.
리소스 제공자는 타이밍 정보에 접근할 수 있도록 허용된 도메인을 지정하는
Timing-Allow-Origin
HTTP 응답 헤더를 추가함으로써,
리소스에 대해 모든 타이밍 정보가 수집되도록 명시적으로 허용할 수 있습니다.
이 절은 비규범적입니다.
통계적 핑거프린팅은 악의적인 웹 사이트가
제3자 웹 사이트의 리소스에 대한 캐시 적중/미적중 타이밍을 측정함으로써,
사용자가 해당 제3자 웹 사이트를 방문했는지 여부를 판단할 수 있는
개인정보 보호 우려입니다. 비록
PerformanceResourceTiming
인터페이스가 문서 내 리소스에 대한 타이밍 정보를 제공하더라도,
리소스의 load 이벤트는 이미 제한된 방식으로 타이밍을 측정하여
캐시 적중 및 미적중을 판단할 수 있으며,
HTTP
Fetch의 교차 출처 제한은 추가 정보가 누출되는 것을 방지합니다.
이 작업에 기여해 준 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에게 감사드립니다.
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: