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.examplehttps://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년 중에 이 변경사항을 적용할 계획입니다.

사진: Unsplash마르쿠스 윙클러