same-origin으로의 Wasm 모듈 공유 제한

동일 사이트 환경 간에 WebAssembly 모듈을 공유하는 것은 동일 출처로만 제한됩니다.

에이전트 클러스터의 범위를 장기적으로 출처로 지정할 수 있도록 동일 사이트이지만 교차 출처 환경 간에 WebAssembly (Wasm) 모듈을 공유하는 기능이 지원 중단됩니다. 이러한 방식으로 Wasm 모듈을 사용하는 개발자는 Chrome 95 이후에도 계속 사용하려면 동일한 출처에서 해당 모듈을 인스턴스화해야 합니다.

Wasm 모듈의 정의 및 작동 방식

WebAssembly 프로그램은 배포, 로드, 컴파일의 단위인 모듈로 구성됩니다.

다음 예시 코드에서 https://iframe.site.example에서 가져온 Wasm 모듈은 postMessage()를 통해 https://main.site.example와 공유됩니다. 이러한 도메인은 동일 사이트이지만 교차 출처입니다.

https://iframe.site.example의 Wasm 모듈:

(async () => {
  const instance = await WebAssembly.instantiateStreaming(fetch('./add.wasm'), {});
  iframe.contentWindow.postMessage(instance.module, `https://main.site.example`);
})();

Chrome 95부터 발신자와 수신자는 동일 출처여야 합니다. 위의 경우 https://iframe.site.example는 https://main.site.example이어야 하며 그 반대의 경우도 마찬가지입니다.

필요한 이유

Chrome은 사이트 키 에이전트 클러스터에서 다양한 문서, 탭, 프레임을 내부적으로 처리해 왔습니다. 즉, 동일 사이트 문서는 동일한 프로세스 내에서 처리됩니다 (정확한 작동 방식은 브라우저마다 다름). 최근 Chrome은 이를 더 세분화된 단위인 출처로 처리하기 시작했습니다. 이를 출처 기반 에이전트 클러스터라고 합니다. 하지만 이 작업은 리소스가 많이 소모되므로 출처 기반 에이전트 클러스터는 휴리스틱 방식으로 제한된 웹사이트에만 적용되었습니다.

모든 에이전트 클러스터를 기본적으로 출처 기반으로 설정할 계획입니다. 이를 달성하려면 사이트 키가 지정된 출처 클러스터가 필요한 기능을 제한해야 합니다.

  • (Chrome만 해당) 더 이상 SharedArrayBuffer 또는 WebAssembly.Memory 객체를 다른 동일 사이트 교차 출처 페이지로 전송할 수 없습니다. 이 기능은 Chrome 92부터 이미 적용되었습니다.
  • 더 이상 postMessage()를 통해 다른 동일 사이트 교차 출처 페이지로 WebAssembly.Module 객체를 전송할 수 없습니다. 이 변경사항은 아래에서 자세히 설명합니다.
  • 더 이상 document.domain를 설정할 수 없습니다. 이는 일반적으로 동일 사이트 교차 출처 페이지가 서로의 DOM에 동기식으로 액세스할 수 있도록 허용하는 기존 기능이지만 출처 기반 에이전트 클러스터에서는 사용 중지됩니다.

위의 모든 변경사항을 해결하면 Chrome은 기본적으로 출처 기반 에이전트 클러스터를 사용하도록 전환됩니다.

출처 기반 에이전트 클러스터에 관한 자세한 내용은 Origin-Agent-Cluster 헤더를 사용한 성능 격리 요청을 참고하세요.

다음 단계 및 리소스

Chrome이 기본적으로 출처 기반 에이전트 클러스터와 작동하도록 하려면 document.domain를 읽기 전용으로 설정합니다. Chrome팀은 2022년 중에 이 변경사항을 적용하는 것을 목표로 하고 있습니다.

사진: Markus Winkler(Unsplash 제공)