WebAssembly 웹 API

W3C 후보 권고안 초안,

이 문서에 대한 자세한 내용
이 버전:
https://www.w3.org/TR/2025/CRD-wasm-web-api-2-20251102/
최신 공개 버전:
https://www.w3.org/TR/wasm-web-api-2/
에디터 초안:
https://webassembly.github.io/spec/web-api/
이력:
https://www.w3.org/standards/history/wasm-web-api-2/
구현 보고서:
https://webassembly.org/features/
피드백:
GitHub
에디터:
Ms2ger (Igalia)
이슈 추적:
GitHub Issues

요약

이 문서는 WebAssembly를 보다 넓은 웹 플랫폼과 통합하는 방법을 설명합니다.

이는 관련 문서 모음의 일부입니다: WebAssembly 핵심 명세, WebAssembly JS 인터페이스, 그리고 WebAssembly 웹 API입니다.

이 문서의 상태

이 섹션은 문서가 출판될 당시의 상태를 설명합니다. 현재 W3C 출판물 목록과 이 기술 보고서의 최신 버전은 W3C 기술 보고서 색인에서 확인할 수 있습니다.

이 문서는 WebAssembly 워킹 그룹에 의해 권고안 경로를 이용한 후보 권고안 초안으로 출판되었습니다.

후보 권고안으로 출판된다고 해서 W3C 및 그 회원의 승인을 의미하는 것은 아닙니다. 후보 권고안 초안은 워킹 그룹이 후속 후보 권고안 스냅샷에 포함하고자 하는 이전 후보 권고안의 변경 사항을 통합한 것입니다.

WebAssembly 워킹 그룹은 이 출판물을 후보 권고안 상태로 유지하면서 권고안 상태로 전환하기보다는 "살아있는 표준"으로 지속적으로 업데이트할 예정입니다. 어떠한 경우에도 권고안(REC) 전환은 2025년 12월 2일 이전에 요청되지 않습니다.

이 문서는 언제든지 유지 및 업데이트됩니다. 일부 내용은 작성 중일 수 있습니다.

이 명세에 대한 토론은 GitHub Issues를 권장합니다. 모든 이슈와 댓글은 아카이브됩니다.

이 문서는 WebAssembly 워킹 그룹에서 제작하였습니다.

이 문서는 W3C 특허 정책에 따라 운영되는 그룹에서 제작하였습니다. W3C는 해당 그룹의 결과물과 관련하여 이루어진 모든 특허 공개의 공개 목록을 관리합니다; 그 페이지에는 특허 공개 방법에 대한 안내도 포함되어 있습니다. 어떤 개인이 필수 청구항(Essential Claim(s))을 포함한다고 믿는 특허에 대해 실제로 알고 있는 경우, W3C 특허 정책 6절에 따라 정보를 공개해야 합니다.

이 문서는 2025년 8월 18일 W3C 프로세스 문서의 적용을 받습니다.

1. 소개

이 문서는 WebAssembly 명세 [WEBASSEMBLY]와 WebAssembly JavaScript 임베딩 [WASMJS]를 기반으로 작성되었습니다. 이 문서는 WebAssembly가 JavaScript [ECMASCRIPT] 자체의 범위를 벗어나지만, 웹 사용자 에이전트에 의해 구현되는 추가 API와 같이 WebAssembly를 더 넓은 웹 플랫폼과 통합하는 방법을 설명합니다.

2. 스트리밍 모듈 컴파일 및 인스턴스화

[Exposed=(Window,Worker)]
partial namespace WebAssembly {
  Promise<Module> compileStreaming(Promise<Response> source, optional WebAssemblyCompileOptions options = {});
  Promise<WebAssemblyInstantiatedSource> instantiateStreaming(
      Promise<Response> source, optional object importObject, optional WebAssemblyCompileOptions options = {});
};
compileStreaming(source, options) 메서드는 호출되면 sourceoptions를 사용하여 잠재적 WebAssembly 응답 컴파일의 결과를 반환합니다.
instantiateStreaming(source, importObject, options) 메서드는 호출되면 다음 단계를 수행합니다:
  1. promiseOfModulesourceoptions를 이용한 잠재적 WebAssembly 응답 컴파일의 결과로 둔다.

  2. importObject로 가져오기(import)를 하여 promiseOfModule모듈의 프로미스를 인스턴스화한 결과를 반환한다.

잠재적 WebAssembly 응답 컴파일Response sourceWebAssemblyCompileOptions options 프로미스와 함께 다음 단계를 수행합니다:

참고: 이 알고리즘은 Response 객체 또는 그에 대한 프로미스를 받아, response의 바이트를 컴파일·인스턴스화합니다. 이 컴파일은 백그라운드에서 스트리밍 방식으로 수행될 수 있습니다. ResponseCORS-동일-출처가 아니거나, ok 상태가 아니거나, `application/wasm` MIME 타입이 아니면, 반환된 프로미스는 TypeError로 거부됩니다; 만약 컴파일 또는 인스턴스화에 실패하면, 반환된 프로미스는 CompileError 또는 원인에 따른 오류로 거부됩니다.

  1. returnValue새로운 프로미스로 둔다.

  2. 프로미스 처리 후 반응source에 대해 시행한다:

  3. returnValue를 반환한다.

3. 직렬화

웹 사용자 에이전트는 Module 인터페이스에 [Serializable] 익스텐디드 어트리뷰트를 추가해야 합니다.

직렬화 단계value, serialized, forStorage가 주어졌을 때 다음과 같습니다:

  1. forStorage가 true이면, "DataCloneError" DOMException을 throw한다.

  2. serialized.[[Bytes]]를 value.[[Bytes]]의 서브 직렬화로 설정한다.

  3. serialized.[[AgentCluster]]를 현재 Realm이 대응하는 agent cluster로 설정한다.

역직렬화 단계serialized, value, targetRealm이 주어졌을 때 다음과 같습니다:

  1. bytesserialized.[[Bytes]]의 서브 역직렬화로 둔다.

  2. value.[[Bytes]]를 bytes로 설정한다.

  3. targetRealm이 대응하는 agent clusterserialized.[[AgentCluster]]와 다르면, "DataCloneError" DOMException을 throw한다.

  4. WebAssembly 모듈 컴파일bytes로부터 수행하여 value.[[Module]]에 저장한다.

엔진은 구조적 직렬화(structured serialization) 과정에서 내부적으로 컴파일된 코드를 공유/재사용하려고 시도해야 하지만, CPU 업그레이드나 브라우저 업데이트와 같은 예외적인 경우에는 불가능하며 완전 재컴파일이 필요할 수 있습니다.

참고: 구조적 직렬화의 의미는 Module 이 컴파일된 바이너리 소스를 직렬화하고, 역직렬화 후 타깃 Realm에 재컴파일하는 것과 동일합니다. 위의 엔진 최적화 덕분에 구조적 직렬화는 개발자에게 컴파일된 코드의 캐싱 및 윈도우/워커 간 코드 공유에 대한 명시적 제어권을 제공합니다.

4. 개발자용 표시 규칙

이 섹션은 비규범적입니다.

브라우저, JavaScript 엔진, 오프라인 도구는 JavaScript 산출물과 언어 구조를 나타내는 공통 방법을 가지고 있습니다. 예를 들어, JavaScript 소스 코드 위치는 스택 트레이스나 오류 메시지에 출력되며, 텍스트 파일의 10진수 형식 줄과 열로 자연스럽게 표현됩니다. 함수와 변수의 이름도 소스에서 바로 가져옵니다. 따라서(예를 들어) 구현마다 스택 트레이스 문자열 포맷이 완전히 일치하지 않아도, 위치 정보는 쉽게 읽을 수 있으며 브라우저마다 동일합니다.

WebAssembly 구조체의 일관된 표현을 위해, 다음 규칙이 채택되었습니다.

WebAssembly의 위치는 바이너리 내 특정 명령어를 가리키며, 브라우저나 엔진에서 JavaScript 소스 위치와 유사하게 표시될 수 있습니다. 다음과 같은 형식을 가집니다:

${url}:wasm-function[${funcIndex}]:${pcOffset}

여기서

주의사항:

내보낸 함수 인스턴스의 "name" 프로퍼티는 JS API에 의해 지정되지만, 합성된 함수 이름은 디버거의 콜스택이나 스택 트레이스 문자열 표현 등 다른 문맥에도 표시됩니다.
WebAssembly 모듈에 이름 섹션이 있다면, 다음과 같이 함수 이름을 합성해 표시해야 합니다:

이 문서는 스택 프레임 표현 등 문자열의 완전한 포맷을 지정하지 않으므로, 엔진은 JavaScript용 기존 포맷(이미 사용 중인 코드가 있을 수 있음)을 계속 사용할 수 있습니다. 그럼에도, WebAssembly 프레임은 JavaScript와 형식을 일관성 있게 출력해야 합니다.

5. 미디어 타입 등록

미디어 타입 application/wasm은 IANA 미디어 타입 데이터베이스 [IANA-MEDIA-TYPES]에 다음과 같은 등록 템플릿으로 등록되었습니다:

application/wasm

타입 이름(Type Name):
application
서브타입 이름(Subtype Name):
wasm
필수 매개변수(Required Parameters):
없음
선택적 매개변수(Optional Parameters):
없음
인코딩 고려사항(Encoding Considerations):
binary
보안 고려사항(Security Considerations):

WebAssembly는 안전하고 이식 가능한 저수준 코드 포맷이며, 이에 따른 보안 고려사항은 https://www.w3.org/TR/wasm-core/#security-considerations 에 설명되어 있습니다.

WebAssembly 포맷에는 무결성 또는 프라이버시 보호 기능이 내장되어 있지 않습니다. 필요하다면 HTTPS 등 외부에서 제공해야 합니다.

상호운용성 고려사항(Interoperability Considerations):
WebAssembly Core 적합성 참조
https://www.w3.org/TR/wasm-core/#conformance
공개 명세(Published specification):
https://www.w3.org/TR/wasm-core-1/ https://www.w3.org/TR/wasm-js-api-1/ https://www.w3.org/TR/wasm-web-api-1/
적용 용도(Application Usage):
application/wasm 미디어 타입은 HTTP를 통해 브라우저에서 실행되도록 WebAssembly 파일을 전송할 때 사용하도록 고안되었습니다. 이는 매우 일반적인 시나리오입니다. 또한 이 타입은 여러 WebAssembly 런타임에서 안전성 및 이식성을 활용하며, 효율적인 실행과 압축된 표현을 목표로 사용됩니다.
프래그먼트 식별자 고려(Fragment Identifier Considerations):
없음
사용 제한(Restrictions on usage):
없음
임시 등록(Provisional Registrations):
N/A
추가 정보(Additional information):
이 타입의 사용 중단된 별칭명들:
없음
매직 넘버(Magic number(s)):
0x00 0x61 0x73 0x6D
파일 확장자(File extension(s)):
.wasm
맥킨토시 파일 타입 코드(Macintosh file type code(s)):
없음
객체 식별자(Object Identifier(s) or OID(s)):
없음
의도된 사용(Intended usage):
일반(Common)
기타 정보 및 의견(Other Information & Comments):
일반(Common)
담당자(Contact Person):
담당자 이름(Contact Name):
Eric Prud’hommeaux
담당자 이메일(Contact Email Address):
eric@w3.org
작성자/변경 관리자(Author/Change Controller):
W3C

6. 보안 및 개인정보 보호 고려사항

이 섹션은 비규범적입니다.

WebAssembly는 JS API 명세에 설명된 JavaScript API를 통해서만 주변 환경에 접근할 수 있습니다. 따라서 WebAssembly는 JavaScript로 수집, 노출, 처리할 수 있는 것 외에는 웹사이트나 타사에 어떠한 정보(개인정보, 민감 정보 등)를 수집하거나 노출할 수 없습니다. WebAssembly 메모리는 주변 JavaScript 환경 내 객체와 동일한 수명을 가지며, (JavaScript로 추출하여 기존 직렬화 API를 사용하는 경우를 제외하고) 영구 저장되거나 직렬화되지 않습니다. 기본 플랫폼이나 하드웨어, 다른 장치, 사용자 에이전트의 네이티브 UI 등에 접근 권한도 제공되지 않습니다.

WebAssembly는 추가적인 프로그램 실행 메커니즘으로, JavaScript가 실행될 수 있는 곳 어디서든 실행될 수 있습니다. 따라서 위협 모델은 본질적으로 JavaScript 코드와 동일하며, 전달(예: WebAssembly 코드는 적극적·수동적 네트워크 공격자로부터 전송 중 보호되어야 함) 및 정책(예: 일부 로딩 방식 또는 실행은 동일 출처 정책이나 Content Security Policy와 같은 메커니즘으로 제한됨)에 대한 고려도 비슷합니다.

7. 변경 이력

이 섹션은 비규범적입니다.

WebAssembly 명세 1.0 최초 릴리스 이후 여러 확장 제안이 통합되었습니다. 다음 섹션에서는 변경된 내용을 개략적으로 제공합니다.

7.1. 2.0 릴리스

미디어 타입 등록 완료

application/wasm 미디어 타입에 대한 등록이 성공적으로 완료되었습니다.

적합성

문서 규칙

적합성 요구사항은 설명적 진술과 RFC 2119 용어의 조합으로 표현됩니다. 본 문서의 규범적 부분에서 "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", "OPTIONAL" 같은 핵심 단어는 RFC 2119에서 설명된 의미로 해석되어야 합니다. 다만 가독성을 위해 이 명세에서 해당 단어들은 모두 대문자로 등장하지 않습니다.

명시적으로 비규범적, 예시, 참고로 표시된 섹션을 제외한 본 명세의 모든 텍스트는 규범적입니다. [RFC2119]

이 명세의 예시는 "for example"라는 말로 시작하거나, 다음과 같이 class="example"로 구분되어 본문과 분리됩니다.

이것은 참고 예시입니다.

참고(Informative) 노트는 "Note"로 시작하며, 다음과 같이 class="note"로 구분되어 본문과 분리됩니다.

Note, 이것은 참고 노트입니다.

적합한 알고리즘

알고리즘의 일부로 명령형 어조("선행 공백 문자 모두 제거", "false를 반환하고 이 단계를 중단" 등)로 제시된 요구사항은 알고리즘 도입부에서 사용된 핵심 단어("must", "should", "may" 등)의 의미로 해석되어야 합니다.

알고리즘이나 특정 단계로 표현된 적합성 요구사항은 결과가 동등하기만 하면 어떠한 방법으로든 구현할 수 있습니다. 특히, 본 명세의 알고리즘은 이해하기 쉽도록 설계되어 있으므로 반드시 최적화되어 있을 필요는 없습니다. 구현자는 최적화를 장려합니다.

색인

이 명세에서 정의된 용어

참조에 의해 정의된 용어

참고문헌

규범적 참고문헌

[ECMASCRIPT]
ECMAScript 언어 명세. URL: https://tc39.es/ecma262/multipage/
[FETCH]
Anne van Kesteren. Fetch Standard. Living Standard. URL: https://fetch.spec.whatwg.org/
[HTML]
Anne van Kesteren; et al. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living Standard. URL: https://infra.spec.whatwg.org/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. March 1997. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[WASM-JS-API-2]
. Ms2ger. WebAssembly JavaScript Interface. 2025년 11월 1일. CRD. URL: https://www.w3.org/TR/wasm-js-api-2/
[WASMJS]
WebAssembly JS Integration Specification. 초안. URL: https://webassembly.github.io/spec/js-api/
[WEBASSEMBLY]
WebAssembly Core Specification. 초안. URL: https://webassembly.github.io/spec/core/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/

비공식적 참고문헌

[IANA-MEDIA-TYPES]
Media Types. URL: https://www.iana.org/assignments/media-types/

IDL 색인

[Exposed=(Window,Worker)]
partial namespace WebAssembly {
  Promise<Module> compileStreaming(Promise<Response> source, optional WebAssemblyCompileOptions options = {});
  Promise<WebAssemblyInstantiatedSource> instantiateStreaming(
      Promise<Response> source, optional object importObject, optional WebAssemblyCompileOptions options = {});
};