수명이 연장된 공유 작업자 오리진 트라이얼

게시일: 2025년 7월 31일

Chrome 139부터 수명이 연장된 공유 작업자를 위한 새로운 오리진 트라이얼에 참여하세요. 이 실험에서는 공유 작업자가 마지막 문서 언로드 이후에도 계속 작동할 수 있도록 새로운 extendedLifetime: true 옵션을 추가합니다.

연장된 수명 기능의 사용 사례

사용자가 페이지를 벗어날 때 일부 작업을 실행하려는 사이트가 많습니다. 예를 들어 상태를 저장하거나 분석을 기록하기 위해 스토리지에 쓰거나 서버로 데이터를 다시 전송합니다.

웹 플랫폼은 몇 가지 간단한 사용 사례를 처리하기 위한 API를 제공하지만 각 API에는 제한사항이 있습니다.

  • localStorage 쓰기와 같은 동기 JavaScript API는 현재 페이지를 언로드하기 전에 완료될 때까지 실행됩니다.
  • fetch API에는 keepalive, 최근에는 fetchLater과 같은 여러 옵션이 있어 요청이 문서 언로드 후에도 잠시 동안 유지되도록 할 수 있습니다.

하지만 이러한 요청은 최종 fetch 요청을 제외하고 동기 작업만 다룹니다. IndexedDB, Compression Streams, Web Crypto와 같은 비동기 API를 사용하여 해싱하거나 암호화할 수 없습니다. 많은 API, 특히 최신 API는 기본 스레드를 차단하지 않도록 비동기식이므로 언로드 시 이러한 API를 사용할 수 없는 것은 제한적입니다.

대안은 개별 페이지 수명 주기 외부에 있는 서비스 워커를 사용하는 것입니다. 하지만 이는 다소 무거운 솔루션으로, 개발자에게 더 복잡한 수명 주기 및 관리 요구사항이 있으며 사용자에게는 추가 프로세스 및 메모리 요구사항이 있습니다. 또한 서비스 워커의 기본 사용 사례 (네트워크 요청의 프록시 역할)와도 일치하지 않습니다. 페이지 언로드 시 일부 작업을 완료하는 사용 사례에만 전체 서비스 워커를 사용하는 것은 과도해 보입니다.

제안된 해결 방법

SharedWorker API는 기본 스레드에서 작업을 오프로드하는 데 사용되는 경량 API입니다. 하지만 현재는 출처의 수명 (해당 출처의 마지막 페이지가 언로드될 때)을 초과하여 유지되지 않습니다. Chrome에서는 공유 워커가 문서 삭제 후에도 잠시 동안 유지되도록 SharedWorker API에 새로운 옵션을 추가할 것을 제안합니다.

HTML 표준에서는 동일 출처 페이지 간 탐색 시 공유 작업자가 종료된 후 다시 생성되지 않도록 문서 언로드 후 짧은 시간 동안 공유 작업자를 활성 상태로 유지하도록 구현을 권장합니다. 확장된 수명 제안은 사용자가 동일 출처 대상으로 이동하지 않더라도 비동기 작업이 완료될 수 있도록 사용자 에이전트가 일정 시간 동안 공유 작업자를 활성 상태로 유지해야 한다고 제안하여 이를 확장합니다.

이 제안은 마지막 문서 언로드 후에도 공유 작업자가 서버 작업자가 유휴 상태로 유지될 수 있는 시간(Chrome의 경우 30초)만큼 계속 유지되도록 허용하는 것입니다. 공유 작업자의 경우 유휴 시간이 아닌 언로드 후 최대 수명입니다. 즉, 30초 제한은 유휴 시간부터가 아니라 언로드부터 시작됩니다. 해당 기간 내에 시작되었지만 아직 완료되지 않은 작업은 취소됩니다.

연장된 수명 사용 설정

수명이 긴 공유 워커오리진 트라이얼에 등록하여 사이트에서 사용자를 위해 이 기능을 사용 설정할 수 있습니다. 또는 개발자가 chrome://flags/#enable-experimental-web-platform-features 플래그를 사용하여 자체 브라우저에서 사용 설정할 수 있습니다.

예시 코드

무료 체험 또는 기능 플래그를 선택한 후 다음과 같이 수명 연장을 사용 설정합니다.

const myWorker = new SharedWorker("worker.js", { extendedLifetime: true });

공유 작업자는 blob도 지원하므로 별도의 스크립트 없이도 이를 사용 설정할 수 있습니다. 예를 들어 IndexedDb에 데이터를 쓰려면 다음을 실행합니다.

const sharedWorkerScript = `
  const transaction = db.transaction("analytics", "readwrite");
  const store = transaction.objectStore("analytics");
  const request = store.get("visitCount");
  request.onsuccess = (event) => {
    const newCount = (event.target.result || 0) + 1;
    store.put(newCount, "visitCount");
  };
`;

document.addEventListener("pagehide", () => {
  const blob = new Blob([sharedWorkerScript], { type: "text/javascript" });
  const blobURL = URL.createObjectURL(blob);
  new SharedWorker(blobURL, { extendedLifetime: true });
});

https://sharedworker-extendedlifetime.netlify.app/에도 예시 애플리케이션이 있습니다. 페이지를 새로고침하거나 30초 이내에 닫았다가 다시 열면 이전 계산을 계속 사용할 수 있습니다.

공유 작업자는 chrome://inspect/#workers에서 사이트에 대해 볼 수 있으며, 곧 extendedLifetime 옵션이 사용되었는지 여부를 표시하도록 개선될 예정입니다. 수명이 연장된 공유 작업자도 페이지 언로드 후 30초 동안 이 페이지에 계속 표시됩니다.

의견 공유

수명이 연장된 공유 작업자 오리진 트레일에 대한 의견을 기다리겠습니다.

API 모양은 GitHub에서 논의되고 있으며 자세한 기술 설명이 있습니다.

Chrome 구현에 관한 의견은 Chromium 버그를 신고하세요.