롱 태스크 API

W3C 워킹 드래프트,

이 문서에 대한 추가 정보
이 버전:
https://www.w3.org/TR/2024/WD-longtasks-1-20240524/
최신 공개 버전:
https://www.w3.org/TR/longtasks-1/
에디터스 드래프트:
https://w3c.github.io/longtasks/
이전 버전:
히스토리:
https://www.w3.org/standards/history/longtasks-1/
테스트 스위트:
http://w3c-test.org/longtask-timing/
피드백:
GitHub
명세 내 인라인
에디터:
(Google)
이전 에디터:
(Google)
(Google)
(Google)

요약

이 문서는 웹 페이지 작성자가 "롱 태스크"의 존재를 감지할 수 있는 API를 정의합니다. 롱 태스크는 UI 스레드를 오랜 시간 독점하여 다른 중요한 태스크의 실행을 방해합니다. 예를 들어, 사용자 입력에 반응하는 작업 등이 있습니다.

이 문서의 상태

이 섹션은 이 문서가 발행될 당시의 상태를 설명합니다. 최신 W3C 발행물 목록과 이 기술 보고서의 최신 개정판은 W3C 기술 보고서 인덱스 https://www.w3.org/TR/에서 확인할 수 있습니다.

이 문서는 웹 성능 워킹 그룹에서 워킹 드래프트권고안 트랙을 통해 발행되었습니다. 워킹 드래프트로 발행되었다고 해서 W3C 및 그 회원이 이를 공식적으로 승인했다는 의미는 아닙니다.

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

GitHub 이슈가 이 명세에 대한 논의에 권장됩니다.

이 문서는 2023년 11월 3일 W3C 프로세스 문서에 따라 관리됩니다.

이 문서는 W3C 특허 정책에 따라 운영되는 그룹에서 작성되었습니다. W3C는 그룹의 산출물과 관련해 제출된 특허 공개의 공개 목록을 유지합니다; 해당 페이지에는 특허 공개 방법도 안내되어 있습니다. 개인이 필수 청구항(Essential Claim(s))을 포함한다고 믿는 특허에 대해 실제 정보를 알고 있는 경우, W3C 특허 정책 6항에 따라 정보를 공개해야 합니다.

이 문서에 대해 의견을 남기고 싶다면 public-web-perf@w3.org (구독, 아카이브)로 [LongTasks]를 메일 제목 앞에 붙여 보내주세요.

1. 소개

페이지가 로드되는 동안과 이후 사용자가 페이지와 상호작용할 때, 애플리케이션과 브라우저는 다양한 이벤트를 큐에 추가하며, 이러한 이벤트들은 브라우저에 의해 실행됩니다. 예를 들어, 사용자 에이전트는 사용자의 활동에 따라 입력 이벤트를 스케줄하고, 애플리케이션은 requestAnimationFrame과 기타 콜백을 위한 콜백을 스케줄합니다. 큐에 들어가면 브라우저는 이 이벤트들을 하나씩 꺼내 실행합니다.

하지만 어떤 작업은 오랜 시간(여러 프레임) 걸릴 수 있으며, 이런 일이 발생하면 UI 스레드가 막혀 다른 모든 작업도 막히게 됩니다. 사용자는 이를 "멈춘" 페이지로 경험하게 되며, 브라우저가 사용자 입력에 반응하지 못하는 현상으로 나타납니다. 이는 오늘날 웹에서 나쁜 사용자 경험의 주요 원인입니다:

지연된 "인터랙티브 가능 시간":

페이지가 로딩 중이거나 시각적으로 완전히 렌더링된 경우에도, 롱 태스크가 메인 스레드를 점유하여 사용자가 페이지와 상호작용하지 못하게 합니다. 설계가 잘못된 써드파티 콘텐츠가 종종 원인입니다.

높거나 불규칙한 입력 지연:

중요한 사용자 상호작용 이벤트(예: 탭, 클릭, 스크롤, 휠 등)가 롱 태스크 뒤에 큐잉되어 끊기고 예측 불가한 사용자 경험을 초래합니다.

높거나 불규칙한 이벤트 처리 지연:

입력과 마찬가지로, 이벤트 콜백(onload 이벤트 등) 처리도 애플리케이션 업데이트를 지연시킵니다.

끊기는 애니메이션과 스크롤:

일부 애니메이션 및 스크롤 상호작용은 컴포지터 스레드와 메인 스레드 간의 협력이 필요합니다. 롱 태스크가 메인 스레드를 막으면 애니메이션과 스크롤의 반응성이 저하될 수 있습니다.

일부 애플리케이션(그리고 RUM 벤더)은 이미 "롱 태스크"가 발생하는 경우를 식별하고 추적하려고 시도하고 있습니다. 예를 들어, 잘 알려진 패턴 중 하나는 짧은 주기의 타이머를 설치하고 연속 만료 사이의 경과 시간을 측정하는 것입니다. 만약 경과 시간이 타이머 주기보다 길다면, 하나 이상의 롱 태스크가 이벤트 루프 실행을 지연시켰을 가능성이 높습니다. 이 방식은 대체로 동작하지만 몇 가지 성능상 문제점이 있습니다: 롱 태스크를 감지하기 위해 폴링하면 애플리케이션은 정지 상태와 긴 유휴 블록(requestIdleCallback 참조)을 방해하게 되며, 배터리 수명에도 나쁘고, 지연의 원인(예: 퍼스트파티 또는 써드파티 코드)을 알 방법이 없습니다.

RAIL 성능 모델에 따르면 애플리케이션은 사용자 입력에 100ms 이내에 반응해야 하며(터치 이동과 스크롤의 경우 임계값은 16ms입니다). 이 API의 목적은 애플리케이션이 이런 목표를 달성하지 못하게 하는 작업에 대한 알림을 제공하는 것입니다. 이 API는 50ms 이상 걸리는 작업을 노출합니다. 이러한 작업이 없는 웹사이트는 100ms 이내에 사용자 입력에 반응할 수 있습니다: 사용자가 입력했을 때 실행 중인 작업을 끝내는 데 50ms 미만, 사용자 입력에 반응하는 작업을 실행하는 데에도 50ms 미만이 소요됩니다.

1.1. 사용 예시

const observer = new PerformanceObserver(function(list) {
    for (const entry of list.getEntries()) {
        // 롱 태스크 알림 처리:
        // 분석 및 모니터링을 위해 리포트
        // ...
    }
});
// 이전 및 이후 롱 태스크 알림에 대해 옵저버 등록.
observer.observe({type: "longtask", buffered: true});
// 이 이후 긴 스크립트 실행은 큐잉 및
// 옵저버에서 "longtask" 엔트리 수신을 초래합니다.

2. 용어 정의

롱 태스크는 50ms를 초과하는 다음과 같은 발생을 의미합니다:

브라우징 컨텍스트 컨테이너브라우징 컨텍스트 bc활성 문서노드 내비게이블컨테이너를 의미합니다.

참고: 이 용어는 오래되었으며, 개편 시 새 용어를 재사용해야 합니다.

문제 브라우징 컨텍스트 컨테이너브라우징 컨텍스트 컨테이너(iframe, object, 등)가 전체적으로 롱 태스크의 원인으로 지목되는 경우를 의미합니다.

기여 정보는 롱 태스크에 크게 기여한 작업 유형(스크립트, 레이아웃 등)을 식별하고, 해당 작업에 책임이 있는 문제 브라우징 컨텍스트 컨테이너를 식별하는 것을 의미합니다.

3. 롱 태스크 타이밍

롱 태스크 타이밍은 다음과 같은 새로운 인터페이스를 포함합니다:

3.1. PerformanceLongTaskTiming 인터페이스

[Exposed=Window]
interface PerformanceLongTaskTiming : PerformanceEntry {
    /* Overloading PerformanceEntry */
    readonly attribute DOMHighResTimeStamp startTime;
    readonly attribute DOMHighResTimeStamp duration;
    readonly attribute DOMString name;
    readonly attribute DOMString entryType;

    readonly attribute FrozenArray<TaskAttributionTiming> attribution;
    [Default] object toJSON();
};

PerformanceLongTaskTiming의 속성 값들은 § 4.1 롱 태스크 보고의 처리 모델에서 설정됩니다. 아래는 이 값들이 어떻게 설정되는지에 대한 참고 요약입니다.

name 속성의 getter는 다음 문자열 중 하나를 반환합니다:

"unknown"

롱 태스크가 사용자 에이전트가 이벤트 루프 외부에서 수행한 작업에서 발생했습니다.

"self"

롱 태스크가 이 이벤트 루프 작업에서 발생했으며, 이 브라우징 컨텍스트 내에서 발생했습니다.

"same-origin-ancestor"

롱 태스크가 이벤트 루프 작업에서 발생했으며, 동일 출처의 상위 내비게이블 내에서 발생했습니다.

"same-origin-descendant"

롱 태스크가 이벤트 루프 작업에서 발생했으며, 동일 출처의 하위 브라우징 컨텍스트 내에서 발생했습니다.

"same-origin"

롱 태스크가 이벤트 루프 작업에서 발생했으며, 동일 출처의 브라우징 컨텍스트 내에서 발생했으나 상위 또는 하위가 아닙니다.

"cross-origin-ancestor"

롱 태스크가 이벤트 루프 작업에서 발생했으며, 교차 출처의 상위 내비게이블 내에서 발생했습니다.

"cross-origin-descendant"

롱 태스크가 이벤트 루프 작업에서 발생했으며, 교차 출처의 하위 브라우징 컨텍스트 내에서 발생했습니다.

"cross-origin-unreachable"

롱 태스크가 이벤트 루프 작업에서 발생했으며, 교차 출처의 브라우징 컨텍스트 내에서 발생했으나 상위 또는 하위가 아닙니다.

"multiple-contexts"

롱 태스크가 이벤트 루프 작업에서 발생했으며, 여러 브라우징 컨텍스트가 관련되었습니다.

참고: 이러한 이름들에는 "-unreachable"과 "-contexts"와 같은 접미사가 있어 일관성이 떨어질 수 있습니다. 하지만 이전 버전과의 호환성을 위해 그대로 유지됩니다.

entryType 속성의 getter 단계는 "longtask"를 반환하는 것입니다.

startTime 속성의 getter 단계는 작업이 시작된 시점의 DOMHighResTimeStamp를 반환합니다.

duration 속성의 getter 단계는 작업 시작과 종료 사이의 경과 시간을 1ms 단위로 나타내는 DOMHighResTimeStamp를 반환합니다.

attribution 속성의 getter는 TaskAttributionTiming 엔트리로 구성된 고정 배열을 반환합니다.

3.2. TaskAttributionTiming 인터페이스

[Exposed=Window]
interface TaskAttributionTiming : PerformanceEntry {
    /* Overloading PerformanceEntry */
    readonly attribute DOMHighResTimeStamp startTime;
    readonly attribute DOMHighResTimeStamp duration;
    readonly attribute DOMString name;
    readonly attribute DOMString entryType;

    readonly attribute DOMString containerType;
    readonly attribute DOMString containerSrc;
    readonly attribute DOMString containerId;
    readonly attribute DOMString containerName;
    [Default] object toJSON();
};

TaskAttributionTiming의 속성 값들은 § 4.1 롱 태스크 보고의 처리 모델에서 설정됩니다. 아래는 값들이 어떻게 설정되는지에 대한 참고 요약입니다.

name 속성의 getter는 항상 "unknown"을 반환합니다.

entryType 속성의 getter는 항상 "taskattribution"을 반환합니다.

startTime 속성의 getter는 항상 0을 반환합니다.

duration 속성의 getter는 항상 0을 반환합니다.

containerType 속성의 getter는 문제 브라우징 컨텍스트 컨테이너의 타입(예: "iframe", "embed", "object")을 반환합니다. 단일 문제 브라우징 컨텍스트 컨테이너가 없다면 "window"를 반환합니다.

containerName 속성의 getter는 컨테이너name 콘텐츠 속성 값을 반환합니다. 단일 문제 브라우징 컨텍스트 컨테이너가 없다면 빈 문자열을 반환합니다.

containerId 속성의 getter는 컨테이너id 콘텐츠 속성 값을 반환합니다. 단일 문제 브라우징 컨텍스트 컨테이너가 없다면 빈 문자열을 반환합니다.

containerSrc 속성의 getter는 컨테이너src 콘텐츠 속성 값을 반환합니다. 단일 문제 브라우징 컨텍스트 컨테이너가 없다면 빈 문자열을 반환합니다.

3.3. 문제 지점 표시

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

롱 태스크는 스크립트, 레이아웃, 스타일 등 다양한 유형의 작업을 포함할 수 있고, 여러 브라우징 컨텍스트 내에서 실행될 수 있으며, 전체 에이전트 클러스터 또는 브라우징 컨텍스트 그룹 세트에 걸친 긴 가비지 컬렉션 등 전역적으로 발생할 수도 있습니다.

따라서 기여 정보에는 여러 측면이 있습니다:

따라서 nameattribution 필드는 PerformanceLongTaskTiming에서 롱 태스크의 책임 소재를 보여줍니다. 이 정보를 제공할 때 웹의 same-origin 정책을 반드시 따라야 합니다.

이 필드들은 독립적이지 않습니다. 아래는 이들이 어떻게 연관되는지 개요를 보여줍니다:

name 문제 브라우징 컨텍스트 컨테이너 (attribution으로 지목됨)
"self" empty
"same-origin-ancestor" same-origin 문제 지점
"same-origin-descendant" same-origin 문제 지점
"same-origin" same-origin 문제 지점
"cross-origin-ancestor" empty
"cross-origin-descendant" empty
"cross-origin-unreachable" empty
"multiple-contexts" empty
"unknown" empty

4. 처리 모델

참고: Long Tasks API를 구현하는 사용자 에이전트는 "longtask"supportedEntryTypes 에 각각 Window 컨텍스트에 포함해야 합니다.

이로써 개발자는 롱 태스크 지원 여부를 감지할 수 있습니다.

4.1. 롱 태스크 보고

start time, end time, top-level browsing contexts, task가 주어지면 다음 알고리즘을 수행합니다:
  1. 작업 종료 시간 기록end timetaskdocument로 수행합니다.

  2. end time에서 start time을 뺀 값이 롱 태스크 임계값 50ms 미만이면 이 단계들을 중단합니다.

  3. destinationRealms를 빈 집합으로 둡니다.

  4. 보고가 전달될 JavaScript Realm의 집합을 결정합니다:

    최상위 브라우징 컨텍스트 topmostBC에 대해 top-level browsing contexts에서:

    1. topmostBC활성 문서관련 RealmdestinationRealms에 추가합니다.

    2. descendantBCstopmostBC활성 문서하위 브라우징 컨텍스트 목록으로 둡니다.

    3. documentdescendantBC활성 문서로 둡니다.

    4. descendantBC에 대해 descendantBCs에서, (document관련 Realm, document관련 설정 객체cross-origin 격리 기능)을 destinationRealms에 추가합니다.

  5. 사용자 에이전트는 JavaScript Realm 일부를 destinationRealms에서 제거할 수 있습니다.

참고: 이러한 제거는 사용자 에이전트가 별도의 프로세스에서 처리하는 JavaScript Realm에 대해 롱 태스크 보고를 피하기 위해 사용될 수 있습니다. 하지만 이 개념은 정확하게 명세되어 있지 않습니다.

어떤 문서 가 어떤 롱 태스크에 대한 가시성을 갖는지에 대한 범위에 대해 지속적인 논의가 있으므로 이 논리가 앞으로 바뀔 수 있습니다. [Issue #75]

  1. 각 (destinationRealm, crossOriginIsolatedCapability)에 대해 destinationRealms에서:

    1. name을 빈 문자열로 둡니다. 이는 아래에서 최소 문제 지목 보고에 사용됩니다.

    2. culpritSettingsnull로 둡니다.

    3. task스크립트 평가 환경 설정 객체 집합을 처리하여 nameculpritSettings를 다음과 같이 결정합니다:

      1. 만약 task스크립트 평가 환경 설정 객체 집합이 비어 있다면: name을 "unknown"으로, culpritSettingsnull로 설정합니다.

      2. 그렇지 않고 task스크립트 평가 환경 설정 객체 집합 길이가 1보다 크면: name을 "multiple-contexts"로, culpritSettingsnull로 설정합니다.

      3. 그렇지 않고 task스크립트 평가 환경 설정 객체 집합 길이가 1이면:

        1. culpritSettingstask스크립트 평가 환경 설정 객체 집합의 단일 항목으로 설정합니다.

        2. destinationSettingsdestinationRealm관련 설정 객체로 둡니다.

        3. destinationOrigindestinationSettingsorigin으로 둡니다.

        4. destinationBCdestinationSettingsglobal object브라우징 컨텍스트로 둡니다.

        5. culpritBCculpritSettingsglobal object브라우징 컨텍스트로 둡니다.

        6. Assert: culpritBCnull이 아님.

        7. 만약 culpritSettingsdestinationSettings와 동일하다면, name을 "self"로 설정합니다.

        8. 그렇지 않고 culpritSettingsorigindestinationOrigin동일 출처라면:

          1. destinationBCnull이면, name을 "same-origin"로 설정합니다.

          2. 그렇지 않고 culpritBC상위 브라우징 컨텍스트라면 destinationBC에 대해, name을 "same-origin-ancestor"로 설정합니다.

          3. 그렇지 않고 destinationBC상위 브라우징 컨텍스트라면 culpritBC에 대해, name을 "same-origin-descendant"로 설정합니다.

          4. 그 밖의 경우, name을 "same-origin"로 설정합니다.

        9. 그 밖의 경우:

          1. destinationBCnull이면, name을 "cross-origin-unreachable"로 설정합니다.

          2. 그렇지 않고 culpritBC상위 브라우징 컨텍스트라면 destinationBC에 대해, name을 "cross-origin-ancestor" 로 설정하고 culpritSettingsnull로 설정합니다.

            참고: 이는 보안을 위해 보고되지 않습니다. 개발자는 직접 확인해야 합니다.

          3. 그렇지 않고 destinationBC상위 브라우징 컨텍스트라면 culpritBC에 대해, name을 "cross-origin-descendant"로 설정합니다.

          4. 그 밖의 경우, name을 "cross-origin-unreachable"로 설정합니다.

    4. attributiondestinationRealm으로 새 TaskAttributionTiming 객체로 생성하고, 다음과 같이 속성을 설정합니다:

      1. attributionname 속성을 "unknown"으로 설정합니다.

        참고: 향후 API 버전에서는 name 속성에 더 많은 값을 추가할 예정이지만, 현재는 단일 값만 지원합니다.

      2. attributionentryType 속성을 "taskattribution"으로 설정합니다.

      3. attributionstartTimeduration 을 0으로 설정합니다.

      4. attributioncontainerType 속성을 "window"로 설정합니다.

      5. attributioncontainerNamecontainerSrc 속성을 빈 문자열로 설정합니다.

      6. culpritSettingsnull이 아니라면:

        1. culpritBCculpritSettingsglobal object브라우징 컨텍스트로 둡니다.

        2. Assert: culpritBCnull이 아님.

        3. containerculpritBC브라우징 컨텍스트 컨테이너로 둡니다.

        4. Assert: containernull이 아님.

        5. attributioncontainerId 속성을 containerID 값 또는 ID가 없으면 빈 문자열로 설정합니다.

        6. containeriframe 요소라면:

          1. attributioncontainerType 속성을 "iframe"으로 설정합니다.

          2. attributioncontainerName 속성을 containername 콘텐츠 속성 값 또는 없으면 빈 문자열로 설정합니다.

          3. attributioncontainerSrc 속성을 containersrc 콘텐츠 속성 값 또는 없으면 빈 문자열로 설정합니다.

          참고: 프레임의 src 속성을 현재 URL 대신 기록하는 것은 일부러입니다. 이는 프레임 식별에 도움이 되며, 교차 출처 iframe의 현재 URL을 알 수 있게 하는 것은 보안상 문제가 있기 때문입니다.

        7. containerframe 요소라면:

          1. attributioncontainerType 속성을 "frame"으로 설정합니다.

          2. attributioncontainerName 속성을 containername 콘텐츠 속성 값 또는 없으면 빈 문자열로 설정합니다.

          3. attributioncontainerSrc 속성을 containersrc 콘텐츠 속성 값 또는 없으면 빈 문자열로 설정합니다.

        8. containerobject 요소라면:

          1. attributioncontainerType 속성을 "object"로 설정합니다.

          2. attributioncontainerName 속성을 containername 콘텐츠 속성 값 또는 없으면 빈 문자열로 설정합니다.

          3. attributioncontainerSrc 속성을 containerdata 콘텐츠 속성 값 또는 없으면 빈 문자열로 설정합니다.

        9. containerembed 요소라면:

          1. attributioncontainerType 속성을 "embed"로 설정합니다.

          2. attributioncontainerName 속성을 빈 문자열로 설정합니다.

          3. attributioncontainerSrc 속성을 containersrc 콘텐츠 속성 값 또는 없으면 빈 문자열로 설정합니다.

    5. newEntry라는 PerformanceLongTaskTiming 객체를 destinationRealm으로 새로 생성하고, 다음과 같이 속성을 설정합니다:

      1. newEntryname 속성을 name으로 설정합니다.

      2. newEntryentryType 속성을 "longtask"로 설정합니다.

      3. newEntrystartTime 속성을 coarsening start time의 결과로, crossOriginIsolatedCapability를 기준으로 설정합니다.

      4. durcoarsening end time의 결과로, crossOriginIsolatedCapability를 기준으로 계산한 값에서 newEntrystartTime을 뺀 값을 둡니다.

      5. newEntryduration 속성을 dur의 정수 부분으로 설정합니다.

      6. attributionnull이 아니면, newEntryattribution 속성을 attribution 단일 값을 담은 새 고정 배열로 설정합니다.

        참고: 향후 API 버전에서는 attribution 속성에 더 많은 값을 추가할 예정이지만, 현재는 단일 값만 포함됩니다.

    6. PerformanceEntry를 큐에 추가 합니다: newEntry.

5. 보안 및 프라이버시 고려사항

Long Tasks API는 롱 태스크의 출처에 대해 출처 안전한 기여 정보를 포함함으로써 same-origin 정책을 준수합니다. 롱 태스크에는 50ms의 임계값이 적용되며, 지속 시간은 1ms 단위로만 제공됩니다. 이로써 교차 출처 정보 유출로부터 충분한 보호가 제공됩니다.

Long Tasks API는 사용자가 실행한 태스크의 지속 시간, 유형, 그리고 함수 호출을 유발한 브라우징 컨텍스트와 같은 기여 정보를 제공합니다. 이는 공격자가 부채널 타이밍 공격을 통해 사용자의 행동을 추측하거나 신원을 식별하는 데 악용할 수 있습니다. 예를 들어, 긴 스크립트 다음에 긴 렌더가 발생하는 패턴을 통해 사용자가 소셜 위젯과 상호작용했음을 추측할 수 있습니다. 상세한 함수 호출 기여 정보는 사용자의 행동을 결정하는 데 활용될 수 있습니다.

이 API가 새로운 프라이버시 공격을 도입하는 것은 아니지만, 기존 프라이버시 공격을 더 빠르게 할 수 있습니다. 이를 완화하는 방법은 필요에 따라 구현할 수 있습니다:

5.1. 옵저버에 노출되는 정보

최상위 페이지 내 모든 옵저버(즉, 페이지 내 모든 iframe과 메인 프레임)는 롱 태스크의 존재에 대한 알림을 받습니다. 우리는 태스크의 시작 시간, 지속 시간(1ms 단위), 그리고 문제 프레임에 대한 포인터를 노출합니다. 이 정보는 오늘날에도 setTimeout을 통해 더 높은 해상도로 관찰할 수 있습니다. 공격자는 페이지의 다른 요소를 모두 제거하고 취약한 교차 출처 리소스를 추가하여 setTimeout의 지연이 해당 리소스에 의해 발생했음을 보장할 수 있습니다. 다른 페이지(탭 또는 창)의 옵저버는 사용자 에이전트의 구조와 관계없이 알림을 받지 않아야 합니다.

교차 출처 노출 규칙:

5.2. 고려된 공격 시나리오

다음은 고려된 타이밍 공격입니다:

  1. 전통적인 타이밍 공격: 외부 리소스의 로드 시간을 이용해 비공개 데이터의 크기를 밝히는 공격. 예를 들어 갤러리의 숨겨진 사진 수, 사용자 이름이 유효한지 등. 예시 참고.

  2. 부채널 타이밍 공격: 동영상 파싱, 스크립트 파싱, App Cache 읽기 또는 Cache API(서비스 워커) 사용 시 소요 시간을 이용해 사용자를 식별하거나 사용자 프로필(나이, 성별, 위치, 관심사 등)을 만드는 공격. 예시에서는, 소셜 네트워크의 상태 업데이트가 특정 인구 집단(예: 20~30세 여성)에게만 제한된다면, 퍼머링크 페이지의 파일 크기를 통해 사용자가 타깃 인구 집단에 속하는지 확인할 수 있습니다.

이러한 시나리오는 50ms 임계값과 교차 출처 경계 준수(즉, 신뢰할 수 없는 교차 출처 옵저버에게 작업 유형이나 추가 기여 정보를 보여주지 않음)로 해결됩니다.

적합성

문서 규칙

적합성 요구사항은 설명적 단언과 RFC 2119 용어를 조합하여 표현됩니다. "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", "OPTIONAL" 등의 핵심 단어는 명세의 규범적 부분에서 RFC 2119에서 설명한 대로 해석되어야 합니다. 단, 가독성을 위해 이 용어들은 이 명세에서 모두 대문자로 표시되지는 않습니다.

이 명세의 모든 텍스트는 명시적으로 비규범적, 예시, 참고임을 표시하지 않은 부분은 모두 규범적입니다. [RFC2119]

이 명세의 예시는 "예를 들어"라는 표현으로 시작하거나, class="example"와 같이 규범 텍스트와 구분되어 표시됩니다:

이것은 참고용 예시입니다.

참고 노트는 "참고"라는 단어로 시작하며, class="note"로 규범 텍스트와 구분되어 표시됩니다:

참고, 이것은 정보 제공용 노트입니다.

적합성 알고리즘

알고리즘에서 명령문 형태로 표현된 요구사항(예: "앞의 공백 문자를 모두 제거한다" 또는 "false를 반환하고 이 단계들을 중단한다")은 알고리즘을 소개하는 데 사용된 핵심 단어("must", "should", "may" 등)의 의미에 따라 해석되어야 합니다.

알고리즘이나 특정 단계로 표현된 적합성 요구사항은 결과가 동일하기만 하면 어떤 방식으로든 구현할 수 있습니다. 특히 이 명세에서 정의된 알고리즘은 이해하기 쉽도록 작성된 것이며, 성능을 위해 설계된 것이 아닙니다. 구현자는 최적화를 권장합니다.

색인

이 명세에서 정의된 용어

참조에서 정의된 용어

참고 문헌

규범적 참고 문헌

[DOM]
Anne van Kesteren. DOM 표준. 현행 표준. URL: https://dom.spec.whatwg.org/
[ECMASCRIPT]
ECMAScript 언어 명세. URL: https://tc39.es/ecma262/multipage/
[HR-TIME-2]
Ilya Grigorik. 고해상도 시간 2단계. 2019년 11월 21일. REC. URL: https://www.w3.org/TR/hr-time-2/
[HR-TIME-3]
Yoav Weiss. 고해상도 시간. 2023년 7월 19일. WD. URL: https://www.w3.org/TR/hr-time-3/
[HTML]
Anne van Kesteren; et al. HTML 표준. 현행 표준. URL: https://html.spec.whatwg.org/multipage/
[LONG-ANIMATION-FRAMES]
롱 애니메이션 프레임 API. 에디터스 드래프트. URL: https://w3c.github.io/long-animation-frames/
[PERFORMANCE-TIMELINE]
Nicolas Pena Moreno. Performance Timeline. 2024년 2월 16일. CR. URL: https://www.w3.org/TR/performance-timeline/
[RFC2119]
S. Bradner. RFC에서 요구 사항 수준을 표시하는 데 사용할 키워드. 1997년 3월. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL 표준. 현행 표준. URL: https://webidl.spec.whatwg.org/

IDL 색인

[Exposed=Window]
interface PerformanceLongTaskTiming : PerformanceEntry {
    /* Overloading PerformanceEntry */
    readonly attribute DOMHighResTimeStamp startTime;
    readonly attribute DOMHighResTimeStamp duration;
    readonly attribute DOMString name;
    readonly attribute DOMString entryType;

    readonly attribute FrozenArray<TaskAttributionTiming> attribution;
    [Default] object toJSON();
};

[Exposed=Window]
interface TaskAttributionTiming : PerformanceEntry {
    /* Overloading PerformanceEntry */
    readonly attribute DOMHighResTimeStamp startTime;
    readonly attribute DOMHighResTimeStamp duration;
    readonly attribute DOMString name;
    readonly attribute DOMString entryType;

    readonly attribute DOMString containerType;
    readonly attribute DOMString containerSrc;
    readonly attribute DOMString containerId;
    readonly attribute DOMString containerName;
    [Default] object toJSON();
};

이슈 색인

어떤 문서 가 어떤 롱 태스크에 대한 가시성을 갖는지에 대한 범위에 대해 지속적인 논의가 있으므로, 이 논리가 앞으로 바뀔 수 있습니다. [이슈 #75]
MDN

PerformanceLongTaskTiming/attribution

In only one current engine.

FirefoxNoneSafariNoneChrome58+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

PerformanceLongTaskTiming/toJSON

In only one current engine.

FirefoxNoneSafariNoneChrome58+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

PerformanceLongTaskTiming

In only one current engine.

FirefoxNoneSafariNoneChrome58+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

TaskAttributionTiming/containerId

In only one current engine.

FirefoxNoneSafariNoneChrome58+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

TaskAttributionTiming/containerName

In only one current engine.

FirefoxNoneSafariNoneChrome58+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

TaskAttributionTiming/containerSrc

In only one current engine.

FirefoxNoneSafariNoneChrome58+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

TaskAttributionTiming/containerType

In only one current engine.

FirefoxNoneSafariNoneChrome58+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

TaskAttributionTiming/toJSON

In only one current engine.

FirefoxNoneSafariNoneChrome58+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

TaskAttributionTiming

In only one current engine.

FirefoxNoneSafariNoneChrome58+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?