Copyright © 2025 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 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
는
initiator
type에 해당하는 DOMString을 가집니다.
PerformanceResourceTiming
는
delivery
type에 해당하는 DOMString을 가집니다.
PerformanceResourceTiming
는
requested
URL에 해당하는 DOMString을 가집니다.
PerformanceResourceTiming
는
cache mode
(빈 문자열, "local
", 또는
"validated
")에 해당하는 DOMString을 가집니다.
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]
참고: @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
을 반환합니다.
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
알고리즘이 실패할 경우,
해당 엔트리는 불투명(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에 허용할 수 있습니다.
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 참조), 헤더 값은 재검증 응답에서 오거나, 그곳에 없다면 원래 캐싱된 리소스에서 올 수 있습니다.
본 섹션에서는 Timing-Allow-Origin을 임시 메시지 헤더(Provisional Message Header)로 등록합니다.
Timing-Allow-Origin
Timing-Allow-Origin
응답 헤더
이 섹션은 비규범적입니다.
아래 그래프는 PerformanceResourceTiming 인터페이스에서 정의된 타이밍 속성을 보여줍니다. 괄호로 표시된 속성은 교차 출처 리소스 fetch 시 제공되지 않을 수 있습니다. 사용자 에이전트는 타이밍 사이에 내부 처리를 수행할 수 있으므로, 타이밍 간 비규범적 간격이 존재할 수 있습니다.
PerformanceResourceTiming
인터페이스에서 정의된 타이밍 속성을 보여줍니다. 괄호로 표시된 속성은 리소스가 timing allow check 알고리즘을 통과하지 못한
경우 제공되지 않을 수 있습니다.
리소스 타이밍 마킹을 수행하려면 fetch timing info timingInfo, DOMString requestedURL, DOMString initiatorType, global object global, 문자열 cacheMode, response body info bodyInfo, status responseStatus, 그리고 선택적으로 string deliveryType (기본값은 빈 문자열)로, 다음 단계를 수행합니다:
PerformanceResourceTiming
객체
entry를
global의 realm에서
생성합니다.
리소스 타이밍 항목 설정을 PerformanceResourceTiming
entry에 대해, DOMString
initiatorType, DOMString requestedURL, fetch timing info
timingInfo, DOMString cacheMode, response body info
bodyInfo, status
responseStatus, 그리고 선택적 DOMString deliveryType(기본값은 빈 문자열)으로, 다음 단계를 수행합니다:
local
", 또는 "validated
"임을 단언합니다.
resource
", requestedURL 및 타임스탬프 변환으로 얻은
timingInfo의
end
time과 global을 사용하여 초기화합니다.
cache
"로 설정합니다.
fetch
타임스탬프 변환을 DOMHighResTimeStamp
ts와 global object
global에 대해 수행하려면 다음을 실행합니다:
이 섹션은 비규범적입니다.
PerformanceResourceTiming
인터페이스는
리소스를 요청한 웹 페이지 또는 워커에 타이밍 정보를 노출합니다.
PerformanceResourceTiming
인터페이스 접근을
제한하기 위해
기본적으로 동일 출처 정책이 적용되며
특정 속성이 0으로 설정됩니다. 이는 HTTP fetch에서 설명한 바와 같습니다.
리소스 제공자는 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: