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 제공)