1. 개념
스토리지 파티셔닝을 고려하여, 이 명세는 동일 파티션 내에서 발생하는 탐색(예: 동일 사이트 내 최상위 탐색)과 별도 파티션에서 발생하는 탐색(예: 다른 사이트로의 최상위 탐색)에 대한 프리페치를 정의합니다.
-
hypotheticalEnvironment을 예약 클라이언트 생성하기의 결과로 생성한다. 매개값으로 navigable, response의 URL, 그리고 null을 전달한다.
-
hypotheticalPartitionKey를 네트워크 파티션 키 결정을 hypotheticalEnvironment에 대해 실행한 결과로 생성한다.
-
만약 hypotheticalPartitionKey가 sourcePartitionKey와 같거나, 자격 증명이 URL과 hypotheticalPartitionKey를 기준으로 연관되지 않은 경우 false를 반환한다.
-
true를 반환한다.
-
단언: redirectChain의 마지막 항목의 request가 request와 동일하며, response가 null입니다.
-
redirectChain의 마지막 항목의 request를 request 클론으로 설정합니다.
클론 작업을 통해 향후 리다이렉트로 인해 request가 변경되어도 저장된 request는 활성화 시점(prefetch 기록에서 네비게이션 파라미터 만들기 단계)에서 원본 리다이렉트 체인을 제대로 참조하기 위해 보존됩니다. 현재 명세상에서 request의 필드가 변형되면서 활성화 시점에도 필요로 하는 유일한 경우는 referrer 필드입니다. 명세 견고성을 위해 전체 request를 클론합니다.
프리페치는 오직
`GET`요청에 대해서만 수행하므로, request의 body는 항상 null이며, 따라서 클론이 간단합니다. -
redirectChain의 마지막 항목의 response를 response로 설정합니다.
각 Document
객체는 프리페치 기록을 가지며, 이는 리스트 형태의 프리페치 기록입니다.
-
tags, 정렬 집합(ordered set) 형태의 추측 규칙 태그
-
URL, URL
-
익명화 정책, 프리페치 IP 익명화 정책
-
리퍼러 정책, 리퍼러 정책
-
No-Vary-Search 힌트, URL 검색 변동성
-
source, 문자열
이 항목은 명세나 구현자 정의 기능이 어떤 프리페치를 생성했는지 식별하기 위해 사용됩니다. 다른 데이터와 연계될 수도 있습니다. -
prerendering traversable, prerendering traversable, "
생성 예정", 또는 null (기본값: null) -
prerendering target navigable name hint, 유효한 navigable 대상 이름 또는 키워드 또는 null (기본값: null)
-
상태, "
진행중"(기본값), "완료됨", "취소됨""취소됨"은 프리페치가 저자 또는 사용자가 중단하거나, 사용자 에이전트에 의해 종료되었음을 의미합니다. -
fetch controller, fetch controller (기본값은 새로운 fetch controller)
-
리다이렉트 체인, 리다이렉트 체인 (기본값은 빈 값)
-
시작 시간,
DOMHighResTimeStamp(기본값: 0.0) -
만료 시간,
DOMHighResTimeStamp(기본값: 0.0) -
source partition key, 네트워크 파티션 키 또는 null (기본값)
-
격리된 파티션 키, 네트워크 파티션 키이며 첫 항목은 불투명(origin) 오리진이고, 크로스 파티션 상태를 임시로 저장하는 별도 파티션을 나타냄. 혹은 null (기본값)
-
충돌하는 자격 증명을 가졌는지 여부, boolean (초기값: false)
자격 증명을 원래 전송했어야 했지만, 크로스 파티션 프리페치로 인해 전송할 수 없을 때 프리페치는 폐기됩니다.
프리페치 기록의 response는 그 redirect chain의 마지막 요소의 response이거나, 그 리스트가 비어있으면 null입니다.
사용자 에이전트는 프리페치 기록 취소 및 폐기를 프리페치 기록에서 만료되지 않았더라도(자원 제약 등으로 인해) 할 수 있습니다. 완료된 기록 중 만료 시간이 지난 기록은 프리페치 검색 대상이 아니므로, 삭제해도 문제가 없습니다.
-
prefetchRecord의 URL이 url과 같으면 true를 반환한다.
-
prefetchRecord의 response가 null이 아니라면:
-
searchVariance을 URL 검색 변동성 얻기를 prefetchRecord의 redirect chain[0]의 response에 대해 실행한 결과로 설정한다.
첫 response(prefetchRecord의 response가 아니라)의
No-Vary-Search헤더만 매칭에 영향을 주므로, 꼭 0번째 response를 체크해야 합니다. -
prefetchRecord의 URL과 url이 검색 변동성 기준으로 동등(equivalent modulo search variance)하면 true를 반환한다.
-
-
그 외에는 false를 반환한다.
-
prefetchRecord가 URL에 매칭된다면 true를 반환한다.
-
prefetchRecord의 response가 null일 경우:
-
searchVariance를 prefetchRecord의 No-Vary-Search 힌트로 한다.
-
prefetchRecord의 URL과 url이 검색 변동성 기준으로 동등하면 true 반환.
-
-
그 외에는 false 반환.
Document
document가 주어졌을 때 아래를 수행합니다.
-
prefetchRecord의 상태를 "
취소됨"으로 설정한다. -
중단(abort): prefetchRecord의 fetch controller. 이로 인해 진행중인 fetch는 취소되고, 네트워크 오류가 발생합니다.
-
prefetchRecord의 prerendering traversable이 traversable navigable이면 파괴(destroy)한다.
-
프리페치 상태 갱신 이벤트 트리거를 document의 node navigable, prefetchRecord, 그리고 "
실패" 상태로 호출한다.
완료된 프리페치나 프리렌더도 활성화되지 않습니다. 하지만 프리페치 또는 프리렌더 과정에서 HTTP 캐시가 수정된다면, 이후의 탐색 속도를 높일 수 있습니다.
Document
document가 주어졌을 때 아래를 수행합니다.
-
currentTime을 현재 고해상도 시간으로 설정, document의 관련 글로벌 객체 기준.
-
expiryTime을 currentTime + 300000(즉, 5분)으로 설정.
-
제거: document의 프리페치 기록 중 prefetchRecord와 동일한 URL을 가진 완료(상태가 "
완료됨")된 기록을 모두 제거. -
프리페치 상태 갱신 이벤트 트리거를 document의 node navigable, prefetchRecord, 그리고 "
준비됨" 상태로 호출.
-
exactRecord를 null로 초기화.
-
inexactRecord를 null로 초기화.
-
recordToUse를 exactRecord가 null이 아니면 그것으로, 아니면 inexactRecord로 설정.
-
recordToUse가 null이 아니면:
-
currentTime을 현재 고해상도 시간으로 설정, navigable의 활성 문서 기준.
-
recordToUse의 만료 시간이 currentTime보다 작으면:
-
프리페치 상태 갱신 이벤트 트리거를 navigable, recordToUse, "
실패" 상태로 호출. -
null 반환.
-
-
각 exchangeRecord에 대해 recordToUse의 redirect chain에서 반복:
-
충돌하는 자격 증명이 존재하면, exchangeRecord의 response, navigable, recordToUse의 source partition key를 기준으로:
-
프리페치 상태 갱신 이벤트 트리거를 navigable, recordToUse, "
실패" 상태로 호출. -
null 반환.
-
초기엔 크로스 파티션 자격증명이 없어도 이후 생길 수 있습니다. 사용자 에이전트는 URL의 쿠키가 변경되었는지 모니터링하거나, 해시/타임스탬프/버전번호 등을 저장하는 식의 조잡한 알고리즘을 쓸 수도 있습니다. -
-
recordToUse 반환.
-
-
null 반환.
실제로 프리페치가 본문 전체를 가져왔는지 필요는 없고, 응답 헤더만 있으면 됩니다. 즉, 프리페치를 활용한 탐색이라도 즉시 로드되지 않을 수 있습니다.
캐시 응답 헤더를 활용하여 여러 번 응답을 사용할 수 있을지 결정하는 것도 가능할 수 있으나, 프리페치 버퍼의 짧은 수명으로 실효성은 불투명합니다.
-
단언: 병렬로 실행중인지 확인(in parallel).
-
timeout을 null로 초기화.
-
선택적으로 timeout을 구현자 정의 지속 기간으로 설정, 진행중인 프리페치가 응답하지 않으면 탐색을 재시작하는 최대 대기 시간.
적정 timeout 선택은 어렵고, 탐색 또는 프리페치의 정확한 발신자(예: 추측 규칙 eagerness나 프리렌더 예정 여부 등)에 따라 달라질 수 있다. 일반적으로 timeout은 피하는 게 좋지만, 일부 구현체에선 몇 초 수준의 timeout이 더 나은 결과를 줄 때가 있다.
-
startTime을 공유 현재 시간으로 설정.
-
이 단계들을 실행하되, timeout이 null이 아니고 위험한 공유 현재 시각 − startTime이 timeout보다 크면 중단(abort when)한다:
-
반복:
-
completeRecord를 완료된 프리페치 기록 찾기의 결과(navigable, sourceSnapshotParams, url 매개값)로 설정.
-
completeRecord가 null이 아니면 completeRecord를 반환.
-
potentialRecords를 빈 리스트로 초기화.
-
각 record에 대해 sourceSnapshotParams의 프리페치 기록에서 반복:
-
아래 모두 true이면:
-
record의 상태가 "
진행중"; -
record가 URL에 매칭될 것으로 예상됨; 그리고
-
record의 만료 시간이 현재 고해상도 시간보다 큼(navigable의 활성 창 기준),
-
반복마다 potentialRecords를 새로 계산합니다. 이후 반복에서 potentialRecords는 이전보다 적은 항목이 될 수 있습니다. sourceSnapshotParams의 프리페치 기록은 스냅샷이기 때문이며, 해당 조건들은 false→true로 변화하지 않음에서 비롯됩니다.
-
-
potentialRecords가 비어있으면 null 반환.
-
-
-
null 반환.
sourceSnapshotParams의 프리페치 기록은 스냅샷이므로, 탐색 이후에 시작된 프리페치는 해당 탐색에서 활성화될 수 없습니다.
Document
document가 매칭되는 프리페치 기록을 가진다는 프리페치 기록
recordUnderConsideration과 선택적 boolean checkPrerender (기본값 false)가 주어졌을 때
아래 알고리즘이 true를 반환하면 해당합니다:
-
각 record를 document의 프리페치 기록에서 반복:
-
checkPrerender가 true이면:
-
record의 프리렌더링 traversable 값이 null이면 다음으로 계속.
-
record의 프리렌더링 대상 navigable name 힌트가 recordUnderConsideration의 프리렌더링 대상 navigable name 힌트와 다르면 사용자 에이전트는 다음으로 계속할 수 있다.
프리렌더링 대상 name 힌트에 따라 별도의 프리렌더링 traversable을 만드는 사용자 에이전트는 여기서 continue 합니다. 반대로, 해당 힌트와 상관없이 기존 traversable을 활성화할 수 있다면, 기록을 동일하게 취급합니다.
-
-
recordNVS를 null로 둡니다.
-
record의 response가 null이 아니면, recordNVS = URL 검색 변동성 취득 결과 (record의 response 기준).
-
그 외에는 recordNVS = record의 No-Vary-Search 힌트로 둡니다.
-
recordUnderConsideration의 No-Vary-Search 힌트가 recordNVS와 다르면 다음으로 계속.
-
recordUnderConsideration의 URL과 record의 URL이 검색 변동성 기준으로 동등(recordUnderConsideration의 No-Vary-Search 힌트 기준)이면 true 반환.
-
false 반환.
No-Vary-Search 비교에 관한 논의는 HTML 표준을 참조
NavigationTimingType
navTimingType, request request, 프리페치 기록 record, target snapshot params targetSnapshotParams, source snapshot params sourceSnapshotParams로 아래 단계
수행.
-
responseOrigin을 null로.
-
responseCOOP을 null로.
-
coopEnforcementResult를 탐색용 COOP enforcement 결과 생성의 결과로 함. navigable의 active document, documentState의 initiator origin 사용.
-
finalSandboxFlags을 빈 샌드박스 플래그 집합으로.
-
responsePolicyContainer를 null로.
-
urlList를 빈 리스트로.
-
response를 record의 response로.
-
각 exchangeRecord에 대해 record의 redirect chain 반복:
-
redirectChainRequest를 exchangeRecord의 request로.
-
redirectChainResponse를 exchangeRecord의 response로.
-
responsePolicyContainer를 fetch response로 정책 컨테이너 만들기 결과로 설정. redirectChainResponse, redirectChainRequest의 reserved client 사용.
-
finalSandboxFlags를 합집합으로, targetSnapshotParams의 샌드박스 플래그와 responsePolicyContainer의 CSP list의 CSP 파생 샌드박스 플래그.
-
responseOrigin를 origin 결정 결과로, redirectChainResponse의 URL, finalSandboxFlags, documentState의 initiator origin, null 사용.
-
responseCOOP을 cross-origin opener policy 획득 결과로, redirectChainResponse, redirectChainRequest의 reserved client 사용.
-
coopEnforcementResult를 cross-origin opener policy enforcement 결과로 수정, navigable의 active browsing context, redirectChainResponse의 URL, responseOrigin, responseCOOP, coopEnforcementResult 및 redirectChainRequest의 referrer 사용.
-
finalSandboxFlags가 empty가 아니고 responseCOOP의 값이 "
unsafe-none"이면, response를 적절한 네트워크 오류로 하고 반복 종료.
-
-
request의 URL이 urlList[0]과 다르면 request의 URL을 0번째 항목 뒤에 urlList에 삽입.
이 경우, 탐색은 request의 URL로가지만, 프리페치는 urlList[0]의 response에서 온다는 점(No-Vary-Search 헤더 때문). 이를 0번째 응답에서 URL로의 리다이렉트처럼 취급. 만약 삽입 후 urlList 크기가 2이면, 생성된
Document에서 탐색 대상 URL을 사용. 그 이상이면 영향 없음. -
request의 URL 리스트를 urlList로 설정.
-
request의 reserved client를 reserved client 생성 결과로, navigable, request의 URL 사용.
이 환경은
Document등 생성에 쓰이는 environment settings object임. 프리페치 기록 소비 때마다 별도 환경 필요. 기록의 redirect chain 마지막 항목의 request의 reserved client 쓰면 다중 탐색에서 id가 중복되어 혼동 유발. -
request의 reserved client의 active service worker를 record의 redirect chain 마지막 항목의 request의 reserved client의 active service worker로 설정.
여기서 생성될Document의 Service Worker로 프리페치 처리 중 최종 응답을 가로챈 SW 또는 탐색된 URL의 등록 SW 중 선택 가능. 대부분 같지만, No-Vary-Search+경로 별 SW 등록 시 다름.최종 응답을 가로챈 SW를 사용. SW를 추가로 조회하지 않아도 되고, 프리렌더링에서도 URL 업데이트가 SW 변경을 일으키지 않으므로 일관됨.
-
resultPolicyContainer를 navigation params 정책 컨테이너 결정 결과로, record의 response의 URL, documentState의 history policy container, sourceSnapshotParams의 source policy container, null, responsePolicyContainer 사용.
-
response가 네트워크 오류가 아니면:
-
선택적으로 response를 클론으로 만드세요. 다회 소비 예상시 필요.
향후 프리페치가 프리렌더로 소비될 경우 등, 프리렌더 traversable이 삭제되어도 응답을 계속 쓰려면 클론 필요. [PRERENDERING-REVAMPED]
-
직전 단계를 하지 않았다면, 반드시 제거: record를 navigable의 active document의 프리페치 기록에서 제외.
-
-
아래 정보를 포함한 새로운 navigation params를 반환:
- id
-
navigationId
- request
-
request
- response
-
response
- origin
-
responseOrigin
- policy container
-
resultPolicyContainer
- final sandboxing flag set
-
finalSandboxFlags
- cross-origin opener policy
-
responseCOOP
- COOP enforcement result
-
coopEnforcementResult
- reserved environment
-
request의 reserved client
- navigable
-
navigable
- navigation timing type
-
navTimingType
- fetch controller
-
record의 fetch controller
위 optional 단계를 수행하여 record가 다수 navigation params를 생성한 경우, 모든 navigation params에서 동일 fetch controller를 공유해도 무방. fetch controller는 navigation timing 정보 계산에만 쓰이므로 reuse해도 문제 없음.
- commit early hints
-
null
프리페치 문서에 대해 early hints가 처리되지 않음을 의미. 향후 명세에서 유용한 리소스 힌트가 흔하다면 바뀔 수 있음. 현재 프리페치가 응답 헤더 도착 전에는 제공되지 않으므로 early hints를 더 일찍 처리할 수 없음. 향후 명세에서 활용 가능성 있음.
- delivery type
-
"
navigational-prefetch"
2. HTML 패치
이 섹션은 [HTML]에 대한 패치를 포함합니다.
environment에 다음 항목을 추가하세요:
- is navigational prefetch client
-
boolean (기본값: false)
navigation params에 다음 항목을 추가하세요:
- delivery type
모든 생성 사이트를 업데이트하여 기본값으로 빈 문자열을 제공하세요. 단, 이 문서 내에서 다른 값을 제공하는 경우(create navigation params from a prefetch record)는 예외입니다.
source snapshot params에 다음 항목을 추가하세요:
- prefetch records
-
list 형태의 prefetch records입니다.
snapshot source snapshot params 알고리즘을 수정하여 반환값의 prefetch records를 sourceDocument의 prefetch records의 clone으로 설정합니다.
create a reserved client: navigable navigable, URL url, opaque origin 또는 null isolationOrigin이 주어졌을 때:
-
topLevelCreationURL = url로 둡니다.
-
topLevelOrigin = null로 둡니다.
-
isolationOrigin이 null이 아니면:
-
topLevelCreationURL을
about:blank로 설정 -
topLevelOrigin을 isolationOrigin으로 설정
-
-
아니면, navigable이 top-level traversable이 아니면:
-
parentEnvironment = navigable의 parent의 active document의 relevant settings object로 둡니다.
-
topLevelCreationURL = parentEnvironment의 top-level creation URL로 설정.
-
topLevelOrigin = parentEnvironment의 top-level origin으로 설정.
-
-
새로운 environment 반환: id는 고유 불투명 문자열, target browsing context는 navigable의 active browsing context, creation URL은 url, top-level creation URL은 topLevelCreationURL, top-level origin은 topLevelOrigin.
create a cross-origin
opener policy enforcement result for navigation: Document
activeDocument와 origin initiatorOrigin이 주어졌을 때,
새 cross-origin opener policy enforcement result 반환:
- url
-
activeDocument의 URL
- origin
-
activeDocument의 origin
- cross-origin opener policy
-
activeDocument의 cross-origin opener policy
- current context is navigation source
-
activeDocument의 origin이 initiatorOrigin과 same origin이면 true, 아니면 false
create a navigation request: session history entry entry, environment settings object fetchClient, navigable container 또는 null container, boolean hasTransientActivation 주어졌을 때 아래 단계 수행:
-
documentResource = entry의 document state의 resource.
-
request를 새 request로 생성하며 구성:
- url
-
entry의 URL
- policy container
- client
-
fetchClient
- destination
-
"
document" - credentials mode
-
"
include" - use-URL-credentials flag
-
설정됨
- redirect mode
-
"
manual" - mode
-
"
navigate" - referrer
-
entry의 document state의 request referrer
- referrer policy
-
documentResource가 POST resource이면:
-
request의 method를
`POST`로 설정. -
request의 body를 documentResource의 request body로 설정.
-
Set
`Content-Type`을 documentResource의 request content-type으로 request의 header list에 설정.
-
-
entry의 document state의 reload pending이 true면, request의 reload-navigation flag를 설정.
-
아니면 entry의 document state의 ever populated가 true면, request의 history-navigation flag를 설정.
-
hasTransientActivation이 true면, request의 user-activation을 true로.
-
container가 null이 아니면:
-
container에 browsing context scope origin이 있으면 request의 origin을 해당 browsing context scope origin으로 설정.
-
request의 destination 및 initiator type을 container의 local name으로 설정.
-
-
request 반환.
-
아래 두 조건 모두 true면:
-
entry의 URL의 scheme이 fetch scheme인 경우
-
documentResource가 null이거나, allowPOST가 true이고 documentResource의 request body가 실패(failure)가 아님
이면:
-
request = create a navigation request 결과. 인자: entry, sourceSnapshotParams의 fetch client, navigable의 container, sourceSnapshotParams의 has transient activation.
-
request의 replaces client id = navigable의 active document의 relevant settings object의 id로 설정.
-
prefetched = false로 둠.
-
documentResource가 null이고 navigable이 top-level traversable면:
-
prefetchRecord = wait for a matching prefetch record 결과. 인자: navigable, sourceSnapshotParams, entry의 URL.
-
prefetchRecord가 null이 아니면:
-
navigationParams = create navigation params from a prefetch record 결과. 인자: navigable, entry의 document state, navigationId, navTimingType, request, prefetchRecord, targetSnapshotParams, sourceSnapshotParams.
-
Copy prefetch cookies: prefetchRecord의 isolated partition key, navigationParams의 reserved environment 인자로.
이 복사는 계속 진행됩니다. 즉, 서브리소스 fetch,document.cookie등이 쿠키를 관찰 가능. 프리페치가 cross-site URL에 도달하지 못했다면 복사할 쿠키 없음. -
prefetched = true로 설정.
-
Trigger a prefetch status updated event 호출: navigable, prefetchRecord, "
success" 상태.
이 단계에 따라 prefetch는 오직 `
GET` 요청에만 사용되고, 반드시 top-level traversable로 활성화됩니다. -
-
-
prefetched가 false이면 navigationParams = create navigation params by fetching 결과. 인자: request, entry, navigable, sourceSnapshotParams, targetSnapshotParams, cspNavigationType, navigationId, navTimingType.
-
create navigation params by fetching의 입력 값은 request request, session history entry entry, navigable
navigable, source snapshot params sourceSnapshotParams,
target snapshot params targetSnapshotParams,
string cspNavigationType, navigation ID 또는 null navigationId, NavigationTimingType
navTimingType, 그리고 선택적 prefetch record prefetchRecord 입니다. 다음 단계를
수행합니다.
-
단언: request의 redirect mode가 "
manual"임. -
단언: request의 reserved client가 null임.
-
response를 null로 둔다.
-
responseOrigin을 null로 둔다.
-
fetchController를 null로 둔다.
-
coopEnforcementResult를 탐색용 교차 오리진 오프너 정책 강제 결과 생성의 결과로 설정 navigable의 active document와 entry의 document state의 initiator origin 사용.
-
finalSandboxFlags를 빈 샌드박스 플래그 집합으로 둔다.
-
responsePolicyContainer를 null로 둔다.
-
responseCOOP를 새 교차 오리진 오프너 정책으로 둔다.
-
locationURL을 null로 둔다.
-
currentURL을 request의 current URL로 둔다.
-
commitEarlyHints를 null로 둔다.
-
isolationOrigin을 null로 둔다.
-
prefetchRecord가 주어졌다면:
-
while true:
-
request의 reserved client가 null이 아니고 currentURL의 origin이 request의 reserved client의 creation URL의 origin과 다르면:
-
environment 폐기 절차를 request의 reserved client에 대해 실행.
-
request의 reserved client를 null로.
-
commitEarlyHints를 null로.
-
-
request의 reserved client가 null이면:
-
request의 reserved client를 예약 클라이언트 생성(navigable, currentURL, isolationOrigin) 결과로 설정.
-
prefetchRecord가 주어졌다면, request의 reserved client의 네비게이션 프리페치 클라이언트 여부를 true로.
-
-
Content Security Policy로 네비게이션 요청 차단 여부?(request, cspNavigationType)의 결과가 "
Blocked"이면 response를 network error로 하고 break. [CSP] -
prefetchRecord가 주어졌다면:
-
만약 prefetchRecord의 익명화 정책이 익명성 필요라면:
-
anonymous-client-ip키, 값 true인 파라미터를prefetchtoken에 추가 (purpose에). -
사용자 에이전트는 클라이언트 IP 익명화(예: 프록시)를 하여 request fetch 하거나, 불가하다면 response를 network error 및 break.
IP 익명화 구현은 현재 불명확하며, 프록시·릴레이 등 구현자 정의 방식 예상. 장기적으론 연결 획득(obtain a connection)까지 연계 가능성 있음.
-
-
prefetchRecord의 프리렌더링 traversable이 null이 아니면
prerender(값 true) 파라미터를prefetchtoken에 추가. -
구조화 필드 값 설정 (`
Sec-Purpose`, purpose)을 request의 header list에 설정.구현체는 vendor별 헤더(Purpose/prefetch, X-moz/prefetch, X-Purpose/preview 등)도 전송할 수 있음. 시간이 지나면 이 표준 헤더로 통합 기대. -
request의 current URL의 origin이 same site인 경우 prefetchRecord의 URL의 origin과 비교:
-
tags는 prefetchRecord의 tags 각각을 item 별로 문자열/Token 변환해 List 생성.
-
구조화 필드 값 설정 (`
Sec-Speculation-Tags`, tags)을 request의 header list에 설정.
-
-
request의 current URL이 잠재적으로 신뢰할 수 있는 URL이 아니다? response를 network error로 하여 break.
프리페치 트래픽이 공격자에게 노출되는 걸 막고, 공용망에서 암호화 스킴 사용을 유도하기 위함. -
proposedPartitionKey를 네트워크 파티션 키 결정(request의 reserved client) 결과로 둔다.
-
proposedPartitionKey가 prefetchRecord의 source partition key와 다르고 request의 referrer policy가 충분히 엄격한 추론형 네비 referrer 정책 목록에 없다면 response를 network error 및 break.
즉, 교차사이트 프리페치는 origin 이상 referrer 노출 막음. -
request가 prefetchRecord의 익명화 정책으로 fetch 불가 시 response를 network error 및 break.
구현체별로 더욱 제약 있을 수 있음, 예: 공개 라우팅 안되는 호스트·private prefetch 거부 호스트 등 -
추가: 새 exchange record(request, response=null) 를 prefetchRecord의 redirect chain에.
-
response를 null로 둔다.
-
fetchController가 null이라면, fetching request의 결과를 fetchController로 두고 processEarlyHintsResponse·processResponse는 아래와 같이, useParallelQueue는 true로 한다.
processEarlyHintsResponse 알고리즘 (earlyResponse):
-
prefetchRecord가 주어졌고 commitEarlyHints가 null이면 commitEarlyHints=early hint 헤더 처리(earlyResponse, request의 reserved client)로 한다.
processResponse 알고리즘(fetchedResponse):
-
response = fetchedResponse로 한다.
-
-
그 외에는 다음 수동 리다이렉트 처리를 fetchController에 대해 실행.
-
response가 null 아니게 되거나, navigable의 진행 중 탐색이 navigationId와 달라질 때까지 대기.
후자라면 abort fetchController 하고 return, 아니면 계속. 이렇게 하면 탐색 시작 즉시 프리페치 중단됨, 바람직하지 않을 수 있음.
-
request의 body가 null이면 entry의 document state의 resource를 null로.
-
responsePolicyContainer를 fetch 응답에서 정책 컨테이너 생성(response, request의 reserved client)으로 둔다.
-
finalSandboxFlags를 합집합으로, targetSnapshotParams의 샌드박스 플래그와 responsePolicyContainer의 CSP 목록의 CSP 유도 샌드박스 플래그의 합집합으로 한다.
-
responseOrigin을 오리진 결정(response의 URL, finalSandboxFlags, entry의 document state의 initiator origin, null)으로 둔다.
-
navigable이 최상위 traversable이고 prefetchRecord가 없는 경우:
-
responseCOOP를 교차 오리진 오프너 정책 획득(response, request의 reserved client) 결과로 한다.
-
coopEnforcementResult를 응답의 교차 오리진 오프너 정책 강제(navigable의 active browsing context, request의 URL, responseOrigin, responseCOOP, coopEnforcementResult, request의 referrer) 결과로 한다.
-
finalSandboxFlags이 비어있지 않고 responseCOOP의 value가 "
unsafe-none"이 아니면 response를 network error로 하고 break.
-
-
response가 network error가 아니고 navigable이 child navigable이며 cross-origin resource policy check(navigable의 container document의 origin, navigable의 container document의 relevant settings object, request의 destination, response, true)이 blocked면 response를 network error로 하고 break.
-
prefetchRecord가 주어졌다면:
-
Update prefetchRecord의 redirect chain(request, response).
-
자격 증명 충돌 존재(response, navigable, prefetchRecord의 source partition key)라면 prefetchRecord의 충돌 자격 증명 있음을 true로.
이 즉시 프리페치/리다이렉트 중단은 하지 않음. 즉시 중단시 사용자 외부 파티션 저장 여부 노출될 수 있음. 대신 계속하지만 실질적 사용은 불가. 이 경우 콘솔 경고 등으로 알릴 수 있음.
-
-
locationURL을 response의 location URL(currentURL의 fragment)로 한다.
-
locationURL이 failure 또는 null이면 break.
-
entry의 serialized state를 StructuredSerializeForStorage(null)로 한다.
-
oldDocState를 entry의 document state로 한다.
-
entry의 document state를 새 document state로 지정 (구성:)
- history policy container
-
oldDocState의 history policy container 복제
- request referrer
-
oldDocState의 request referrer
- request referrer policy
-
oldDocState의 request referrer policy
- origin
-
oldDocState의 origin
- resource
-
oldDocState의 resource
- ever populated
-
oldDocState의 ever populated
- navigable target name
-
oldDocState의 navigable target name
-
locationURL의 scheme이 HTTP(S) scheme이 아니라면:
-
entry의 document state의 resource를 null로.
-
-
currentURL을 locationURL로 한다.
-
entry의 URL을 currentURL로 한다.
-
-
locationURL이 URL이고, scheme이 fetch scheme이 아니면, 새 비fetch 스킴 navigation params를 반환 (내용:)
- initiator origin
-
request의 current URL의 origin
-
아래 중 하나라도 true이면:
-
response가 network error
-
locationURL이 failure임
-
locationURL이 URL이고, scheme이 fetch scheme
-
-
resultPolicyContainer를 네비게이션 파라미터 정책 컨테이너 결정 결과로 (response의 URL, entry의 document state의 history policy container, sourceSnapshotParams의 source policy container, null, responsePolicyContainer 인자).
-
아래와 같은 새 navigation params 반환:
- id
-
navigationId
- request
-
request
- response
-
response
- origin
-
responseOrigin
- policy container
-
resultPolicyContainer
- 최종 샌드박스 플래그 집합
-
finalSandboxFlags
- 교차 오리진 오프너 정책
-
responseCOOP
- COOP 강제 결과
-
coopEnforcementResult
- 예약 environment
-
request의 reserved client
- navigable
-
navigable
- navigation timing type
-
navTimingType
- fetch controller
-
fetchController
- early hints 커밋
-
commitEarlyHints
-
navigationParams의 delivery type이 "
prefetch"이면 swapGroup을 true로 설정(옵션).이렇게 하면 참조 사이트가 프리페치가 사용되었는지 로드 타이밍을 통해 판단하기 어렵게 되어, 목적지 사이트 정보 유출을 방지할 수 있습니다.
3. 내비게이션 타이밍 패치
이 섹션은 [NAVIGATION-TIMING]에 대한 패치를 포함합니다.
4. 서비스 워커 패치
이 섹션은 [SERVICE-WORKERS]에 대한 패치를 포함합니다.
resultingClientId
를 설정하는 단계를 아래와 같이 변경:
request가 비서브리소스 요청이고 request의 destination이 "report"가 아니며 그리고 reservedClient의 is navigational prefetch client가 false인 경우 e의resultingClientId속성을 reservedClient의 id로, 그 외에는 빈 문자열로 초기화.
프리페치 케이스에선 request가 이 시점에 reserved client를 갖고 있지만, 이는 스펙 상 허구로, 요청이 제대로
흐르도록 돕기 위한 것임. 실제 클라이언트(client)는 존재하지 않으며, 예시로 clients.matchAll()
등에서 보이지 않음.
실제 클라이언트 생성은 active 시점에, 즉 FetchEvent
실행 이후에 이뤄짐.
5. 사이트 데이터 지우기 패치
Clear Site Data § 3.1 The Clear-Site-Data HTTP Response Header Field에 아래 헤더 값 설명을 추가하세요:
- "
prefetchCache" -
"
prefetchCache" 타입은 서버가 특정 origin의 response의 URL에 의해 시작된 모든 프리페치를 제거하고자 함을 나타냅니다.이 타입은 "
cache" 타입의 부분집합입니다.구현 세부사항은 아래를 참조하세요.
parse response’s Clear-Site-Data header의 파싱 단계에서 아래와 같이 수정하세요:
-
`"cache"`또는`"*"`를 만날 경우 "prefetchCache"를 types에 추가(기존에 추가되는 값 외에도). -
`"prefetchCache"`를 만날 경우 "prefetchCache"를 types에 추가.
clear site data for response의 switch 문에
"prefetchCache"를
처리하는 케이스를 추가하고, clear
prefetch cache를 origin에 대해 실행하세요.
-
각 최상위 traversable traversable에 대해, 사용자 에이전트의 최상위 traversable set에서 반복:
-
navigables를 포함 자손 navigables로, traversable의 active document 기준으로.
-
각 navigable을 navigables에서 반복:
-
activeDocument를 navigable의 active document로 둡니다.
-
activeDocument의 origin이 origin과 same origin이 아니면 다음으로 계속.
-
각 prefetchRecord를 activeDocument의 prefetch records에서 반복:
-
prefetchRecord의 prerendering traversable이 null이 아니면 다음으로 계속.
-
취소 및 폐기를 prefetchRecord, activeDocument 인자로 실행.
-
-
-
6. 프리페치 알고리즘
충분히 엄격한 추측 네비게이션 리퍼러 정책
목록은 다음 값을 포함한 리스트입니다: "",
"strict-origin-when-cross-origin", "strict-origin", "same-origin",
"no-referrer".
Document
document와 prefetch
record prefetchRecord가 주어졌을 때 아래 순서를 따릅니다.
-
단언: document의 node navigable이 최상위 traversable임.
프리페치가 child navigable에서 지원되는 것은 복잡성이 있고 아직 정의되지 않았으며, 미래에 정의될 가능성은 존재합니다.
-
document가 매칭 프리페치 기록을 가질 경우 prefetchRecord로 return.
-
sourceSnapshotParams = source snapshot params 스냅샷(document).
-
targetSnapshotParams = target snapshot params 스냅샷(document의 node navigable).
-
prefetchRecord의 source partition key를 네트워크 파티션 키 결정(document의 relevant settings object)로 설정.
-
단언: prefetchRecord의 URL의 scheme이 HTTP(S) scheme임.
-
추가: prefetchRecord를 document의 prefetch records에.
-
prefetchRecord의 start time을 현재 고해상도 시간 (relevant global object 기준)로 설정.
-
프리페치 상태 업데이트 이벤트 트리거(document의 node navigable, prefetchRecord, "
pending" 상태). -
referrerPolicy = prefetchRecord의 referrer policy가 빈 문자열이 아니면 그 값, 아니면 document의 policy container의 referrer policy.
-
documentState = 새 document state (구성:)
- request referrer policy
-
referrerPolicy
- initiator origin
-
document의 origin
-
entry = 새 session history entry (구성:)
- URL
-
prefetchRecord의 URL
- document state
-
documentState
-
request = 네비게이션 요청 생성(entry, document의 relevant settings object, document의 node navigable의 container, false).
-
global = document의 relevant global object.
-
-
navigationParams = create navigation params by fetching(request, entry, document의 node navigable, sourceSnapshotParams, targetSnapshotParams, "
other", null(navigationId), "navigate", prefetchRecord prefetchRecord). -
navigationParams의 response가 프리페치 지원이 아니면 navigationParams = null.
-
prefetchRecord의 충돌 자격증명 존재가 true면 navigationParams를 null로.
즉, 리다이렉트 체인 어느 한 크로스 파티션 오리진이라도 자격 증명이 있으면 프리페치가 폐기됨. 사용자가 로그인 상태임에도 로그아웃 페이지를 볼 위험을 줄임. -
글로벌 태스크를 네트워킹 태스크 소스에 큐잉(global, 아래 내용):
-
navigationParams가 navigation params 타입이 아니라면 취소 및 폐기(prefetchRecord, document) 및 중단.
-
단언: navigationParams의 response는 리다이렉트 체인 마지막 응답임.
-
프리페치 기록 완료(prefetchRecord, document).
-
-
-
status = response의 status.
-
단언: status가 리다이렉트 status가 아님.
-
status가 ok status가 아니면 false 반환.
즉, 오류 응답은 저장되지 않고 탐색 실행 시 다시 시도됨. 이는 오류가 일시적이거나 프리페치로 인해 발생 시 성공 가능성을 높여줌. 또 prefetch를 명시하는Sec-Purpose헤더가 있을 때 서버가 요청 거절 쉽게 하도록 함. -
true 반환.
103은 ok status가 아니지만 early hints는 프리페치를 막지 않음. supports prefetch 판정은 실제 response에서만 쓰이며, 1xx status는 오지 않음.
단, 다른 곳에서 언급했다시피 현재 프리페치 시 early hints는 무시됨.
7. 쿠키
[COOKIES]
는
`Set-Cookie`
응답 헤더 필드를 사용하여 설정할 수 있는 "쿠키"를 정의합니다. "uncredentialed" 파티셔닝 방식을 사용하면 별도의 네트워크 파티션
키가 적용되기 때문에, 이러한 쿠키를 탐색 시점에서 수신된 것처럼 일반
파티션에 복사하는 처리가 필요합니다.
-
isolatedCookieStore를 isolatedPartitionKey에 연관된 쿠키 저장소로 둡니다.
-
쿠키 cookie를 isolatedCookieStore에서 반복합니다.
-
cookie를 isolatedCookieStore에서 제거합니다.
-
사용자 에이전트는 쿠키를 완전히 무시할 수 있습니다. 그런 경우 continue.
-
topLevelSite를 null로 둡니다.
-
environment의 target browsing context가 최상위 브라우징 컨텍스트라면:
-
topLevelSite를 사이트 획득 결과값으로 둡니다. 인자는 튜플 오리진("https", cookie의 domain, null, null).
여기서 "https" 스킴과 null 포트는 관례상 선택된 것으로, 실제로 쿠키는 스킴 및 포트에 구애받지 않으므로 쿠키 저장소 연결에는 영향이 없습니다.
최상위 브라우징 컨텍스트에서 프리페치를 할 때(리다이렉트 포함), 해당 요청은 최상위 네비게이션 준비를 의미합니다. environment의 최상위 사이트는 리다이렉트 따라 변경될 수 있지만, 탐색이 최상위일 경우 쿠키를 전달하는 오리진이 바로 그 시점의 최상위 사이트입니다. 쿠키의 domain이 해당 오리진과 same-site여야 하므로, 이를 통해 올바른 최상위 사이트를 결정할 수 있습니다. -
-
그렇지 않으면:
-
topLevelOrigin을 environment의 최상위 오리진으로 둡니다.
-
topLevelOrigin이 null이면, environment의 최상위 생성 URL의 오리진으로 설정.
-
topLevelSite = 사이트 획득(topLevelOrigin) 결과로 설정.
child navigable에서 프리페치 처리 시, 최상위 사이트는 자신을 포함하는 최상위 traversable로 정해집니다. 이는 리다이렉트로도 변하지 않으므로 environment로 판단 가능합니다. -
-
secondKey를 null 또는 구현자 정의 값으로 둡니다.
secondKey는 이 응답이 일반 네비게이션 처리일 경우와 동일하게 처리될 수 있도록 예상 값을 갖습니다. -
destinationPartitionKey = (topLevelSite, secondKey)로 설정합니다.
-
cookieStore를 destinationPartitionKey와 연결된 쿠키 저장소로 둡니다.
-
newCookie를 cookie 복제본으로 만듭니다.
-
newCookie의 생성 시간과 마지막 접근 시간을 현재 날짜/시간으로 설정합니다.
-
cookieStore에 같은 이름, 도메인, 경로를 가진 existingCookie가 있다면:
-
newCookie의 생성 시간을 existingCookie의 생성 시간으로 맞춥니다.
-
existingCookie를 cookieStore에서 제거합니다.
-
-
newCookie를 cookieStore에 삽입합니다.
이와 같이 remove 후 insert하는 패턴은 쿠키 수신 처리와 같습니다.
-
8.
`Sec-Purpose`
HTTP 요청 헤더
이 섹션은 Sec-Purpose HTTP 요청 헤더의 [FETCH] 정의를 오버라이드합니다.
`Sec-Purpose`
HTTP 요청 헤더는 해당 요청이 즉시 사용자에게 리소스를 제공하지 않고 다른 목적을 위해 사용된다는 것을 지정합니다.
헤더 필드는 [RFC9651]의 Structured Header이며 값은 List 타입이어야 합니다.
구성원 중 Item이 Token
prefetch라면, 곧 요청될 것으로 예상되는 리소스 다운로드 목적으로 사용됨을 의미합니다.
prefetch 토큰의 매개변수 정의:
-
키가 "
anonymous-client-ip"인 매개변수.필드값이 boolean false(
`?0`)가 아닌 경우, 해당 프리페치 요청은 익명 클라이언트 IP로 이루어짐을 의미합니다. 서버는 이것이 일반 요청 시점 IP와 위치 또는 네트워크 사업자를 공유한다고 신뢰하면 안 됩니다.적절한 응답이 불가능하다면(예: 리소스가 위치 정보에 따라 제공되나 판단할 방법이 없거나 위치 독립적 응답이 없다면), 서버는 적절한 HTTP 상태코드 및 캐시 부적합 헤더를 반환해야 합니다.
향후 명세가 non-boolean 값에 추가 의미를 부여할 수 있지만, 현재는 true와 동등하게 취급합니다. 구현체는 이러한 값을 내보내지 않는 것이 권장됩니다.이 명세도 이 권고에 따릅니다; 리퍼러 기반 네비게이션 프리페치 시작 알고리즘은 non-boolean 값을 내보내지 않습니다.
-
키가 "
prerender"인 매개변수.필드값이 boolean false(
`?0`)가 아닌 경우, 해당 프리페치 요청은 프리렌더 목적임을 의미합니다. 본 값은 프리렌더링 navigable 안에서 활성화 전에도 설정될 수 있습니다.향후 명세가 non-boolean 값에 추가 의미를 부여할 수 있지만, 현재는 true와 동등하게 취급합니다. 구현체는 이러한 값을 내보내지 않는 것이 권장됩니다.이 명세도 이 권고에 따릅니다; 리퍼러 기반 네비게이션 프리페치 시작 알고리즘은 non-boolean 값을 내보내지 않습니다.
9. 자동화 테스트
사용자 에이전트 자동화 및 애플리케이션 테스트를 위해, 본 문서는 [WebDriver-BiDi] 명세에 대한 확장 규정도 포함합니다.
9.1. speculation 모듈
speculation 모듈은 프리페치, 프리렌더, 추측 규칙의 remote end 처리를 관리하는 명령을 포함합니다.
9.1.1. 정의
speculation.PreloadingStatus = "pending" / "ready" / "success" / "failure"
speculation.PreloadingStatus 타입은 프리로딩 상태 종류를 표기합니다.
프리페치와 프리렌더에 대해 공통적으로 사용됩니다.
- "
pending" - prefetch 기록 prefetchRecord가 리퍼러 기반 네비게이션 프리페치 시작 단계로 진입.
- "
ready" - prefetch 기록 prefetchRecord가 완료됨.
- "
success" - prefetch 기록 prefetchRecord가 사용자 에이전트의 네비게이션 등으로 활성화됨.
- "
failure" - prefetch 기록 prefetchRecord가 만료 등으로 실패함.
9.1.2. 이벤트
SpeculationEvent = ( speculation.PrefetchStatusUpdated )
9.1.2.1. speculation.prefetchStatusUpdated 이벤트
speculation.PrefetchStatusUpdated = ( method : "speculation.prefetchStatusUpdated" , params : speculation.PrefetchStatusUpdatedParameters ) speculation.PrefetchStatusUpdatedParameters = { context : text, url : text, status : speculation.PreloadingStatus }
speculation.PreloadingStatus
preloadingStatus가 주어졌을 때 다음 절차로 실행합니다:
-
params를
speculation.PrefetchStatusUpdatedParameters타입 맵으로 만들고,context필드를 navigable의 최상위 traversable의 navigable id로,url필드를 prefetchRecord의 URL로,status필드를 preloadingStatus로 설정. -
body를
speculation.PrefetchStatusUpdatedParameters타입의 맵으로 만들고,params필드를 params로 설정. -
relatedNavigables를 navigable을 포함한 set으로 둠.
-
"speculation.prefetchStatusUpdated" 이벤트가 enable된 relatedNavigables에 대해 session 반복:
-
이벤트 emit(session, body).
-
10. 보안 고려 사항
자세한 내용은 HTML § 7.6.5 보안 고려 사항 참고.
11. 개인정보 고려 사항
자세한 내용은 HTML § 7.6.6 개인정보 고려 사항 참고.