1 분 소요

개요

  • WebAssembly(WASM)는 이식 가능하고 빠르게 실행되는 저수준 바이너리 명령어 포맷
  • W3C 표준, 모든 주요 브라우저(Chrome / Firefox / Safari / Edge) 지원
  • 브라우저뿐 아니라 서버·엣지·임베디드·플러그인 런타임 등으로 확장
  • 설계 목표: 빠른 시작, 안전한 샌드박스, 언어 중립, 네이티브에 가까운 속도


핵심 특징

  • 포맷: .wasm 바이너리(스택 머신 ISA), 텍스트 표현 .wat
  • 샌드박스: 메모리·시스템 콜 격리. 명시적으로 import한 함수만 호출 가능
  • 언어 중립: C / C++ / Rust / Go / AssemblyScript / Zig / Kotlin / .NET / Python(Pyodide) 등 컴파일 가능
  • 이식성: 동일 바이너리가 OS·CPU·환경(브라우저/서버) 무관하게 실행
  • 고성능: AOT / JIT, SIMD, 멀티스레딩(SharedArrayBuffer) 지원


사용 사례

영역 사례
브라우저 가속 Figma, Photoshop Web, AutoCAD Web, ffmpeg.wasm
서버사이드 Fastly Compute, Cloudflare Workers, Fermyon Spin
플러그인 런타임 Envoy, Istio, Zellij, OBS, Shopify Functions
데이터 처리 DuckDB-WASM, SQLite-WASM, Polars-WASM
엣지·IoT WASI 기반 가벼운 런타임 배포


WASI (WebAssembly System Interface)

  • 브라우저 외부에서 WASM이 파일·네트워크·시계 같은 시스템 자원에 접근하기 위한 표준 ABI
  • POSIX 영감, 기능 기반(capability-based) 보안 모델
  • WASI Preview 1: 초기 표준, 광범위 지원
  • WASI Preview 2 (P2): Component Model 기반 재설계, 모듈식 인터페이스(wasi:filesystem, wasi:http, wasi:cli 등)


Component Model

  • WASM 모듈을 언어 중립 컴포넌트로 합성하는 차세대 표준
  • 인터페이스 정의 언어(WIT, WebAssembly Interface Types)로 타입 안전한 경계 정의
  • 서로 다른 언어로 작성한 컴포넌트를 조합 가능 (Rust 컴포넌트가 Go 컴포넌트 호출 등)


주요 런타임

런타임 특징
브라우저 V8/SpiderMonkey/JSC 표준 WASM, 웹 통합
Wasmtime Bytecode Alliance, WASI 레퍼런스, Cranelift JIT/AOT
Wasmer 다양한 백엔드(Cranelift/LLVM/Singlepass), WAPM 패키지
WasmEdge CNCF, 클라우드/엣지/AI 추론 특화
Wazero Go 순수 구현, CGO 없이 임베드
wasmi Rust 인터프리터, 임베디드용


컴파일 도구체인

  • Rust: cargo build --target wasm32-unknown-unknown / wasm32-wasi / wasm32-wasip2
  • C/C++: Emscripten (브라우저), wasi-sdk (WASI)
  • Go: GOOS=js GOARCH=wasm (브라우저), GOOS=wasip1 GOARCH=wasm (WASI)
  • AssemblyScript: TypeScript 유사 문법으로 WASM 직접 컴파일
  • wasm-bindgen / wasm-pack: Rust ↔ JS 인터롭


브라우저 사용 예시 (JavaScript)

  const response = await fetch('module.wasm');
  const { instance } = await WebAssembly.instantiateStreaming(response, {
    env: { log: (x) => console.log(x) },
  });
  const result = instance.exports.add(1, 2);


서버사이드 실행 예시 (Wasmtime)

  # WASI 모듈 실행
  wasmtime run app.wasm

  # 디렉토리·환경변수 노출
  wasmtime run --dir=. --env=KEY=value app.wasm


장점 / 한계

  • 장점: 빠른 콜드 스타트, 강력한 샌드박스, 언어·OS 독립, 작은 바이너리
  • 한계: GC 통합 진행 중(WasmGC), DOM 직접 접근 불가(JS 경유), 디버깅 도구 미성숙, Component Model 생태계 초기


관련 포스트