WASM: WebAssembly 개요
개요
- 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 생태계 초기