TimewareTimeware
블로그 목록으로
블로그

WebAssembly와 엣지 컴퓨팅 2026: Cloudflare Workers, Deno Deploy에서 WASM 실전 활용

WebAssembly가 서버사이드 엣지 컴퓨팅의 핵심 기술로 부상하고 있다. Cloudflare Workers에서 Rust로 작성한 WASM 모듈을 배포하고 응답 시간을 85% 줄인 실전 사례와 2026년 WASM 생태계 현황.

2026년 3월 5일Timeware Engineeringwebassemblyedge-computingcloudflareperformancebackend
WebAssembly와 엣지 컴퓨팅 2026: Cloudflare Workers, Deno Deploy에서 WASM 실전 활용

요약

WebAssembly가 서버사이드 엣지 컴퓨팅의 핵심 기술로 부상하고 있다. Cloudflare Workers에서 Rust로 작성한 WASM 모듈을 배포하고 응답 시간을 85% 줄인 실전 사례와 2026년 WASM 생태계 현황.

WebAssembly와 엣지 컴퓨팅 2026: Cloudflare Workers, Deno Deploy에서 WASM 실전 활용

Executive Summary - Topic: WebAssembly(WASM) 서버사이드 엣지 컴퓨팅 실전 적용과 2026년 생태계 - Target: 백엔드 엔지니어, 성능 최적화 담당자, 플랫폼 아키텍트 - TL;DR 1: WASM은 브라우저뿐 아니라 서버사이드 엣지에서 Rust/C++ 성능을 JavaScript 환경에서 실행하는 핵심 기술 - TL;DR 2: Cloudflare Workers + WASM = Cold start 없는 글로벌 엣지 배포, 응답 3~10ms - TL;DR 3: 모든 것을 WASM으로 대체하는 건 오버엔지니어링 — CPU 집약적 작업만 선택적 적용

"JavaScript로 짰는데 왜 이렇게 느리죠?" — 이미지 처리 API를 Cloudflare Workers로 옮긴 클라이언트에서 온 질문입니다.

JavaScript로 이미지 리사이징을 처리하던 코드가 Cloudflare Workers에서 P99 1.2초였습니다. Rust로 동일 로직을 WASM으로 컴파일하고 Worker에 임베드했더니 P99 180ms가 됐습니다. 85% 감소.

오늘은 그 과정을 정리합니다.

WebAssembly 서버사이드의 핵심 가치

왜 엣지에서 WASM인가?

code
1Traditional Server:
2[사용자 요청] → [CDN] → [원본 서버 (서울)] → [응답]
3지연: 200~500ms (지리적 거리)
4
5Edge + JS:
6[사용자 요청] → [엣지 PoP (도쿄)] → [응답]
7지연: 20~50ms
8냉각: Cold start 없음 (Isolate 기반)
9한계: CPU 집약적 작업에서 JS 속도 제한
10
11Edge + WASM:
12[사용자 요청] → [엣지 PoP (도쿄)] → [WASM 실행] → [응답]
13지연: 3~15ms
14성능: Rust/C++ 수준 (JS 대비 3~10배)

실전 예시 1: 이미지 리사이징 (Rust → WASM)

rust
1// src/lib.rs
2use wasm_bindgen::prelude::*;
3use image::{DynamicImage, ImageFormat};
4use std::io::Cursor;
5
6#[wasm_bindgen]
7pub fn resize_image(data: &[u8], width: u32, height: u32) -> Vec<u8> {
8 let img = image::load_from_memory(data)
9 .expect("Failed to load image");
10
11 let resized = img.resize(
12 width,
13 height,
14 image::imageops::FilterType::Lanczos3, // 고품질
15 );
16
17 let mut output = Vec::new();
18 resized
19 .write_to(&mut Cursor::new(&mut output), ImageFormat::WebP)
20 .expect("Failed to encode");
21
22 output
23}
toml
1# Cargo.toml
2[package]
3name = "image-processor"
4version = "0.1.0"
5edition = "2021"
6
7[lib]
8crate-type = ["cdylib"]
9
10[dependencies]
11wasm-bindgen = "0.2"
12image = { version = "0.25", features = ["webp"] }
13
14[profile.release]
15opt-level = 3
16lto = true
bash
1# WASM으로 컴파일
2wasm-pack build --target web --release
javascript
1// Cloudflare Worker에서 사용
2import init, { resize_image } from './pkg/image_processor.js';
3import wasm from './pkg/image_processor_bg.wasm';
4
5export default {
6 async fetch(request, env) {
7 await init(wasm);
8
9 const url = new URL(request.url);
10 const width = parseInt(url.searchParams.get('w') || '800');
11 const height = parseInt(url.searchParams.get('h') || '600');
12
13 // 원본 이미지 가져오기
14 const imageResponse = await fetch(url.searchParams.get('src'));
15 const imageData = new Uint8Array(await imageResponse.arrayBuffer());
16
17 // WASM으로 리사이징
18 const resized = resize_image(imageData, width, height);
19
20 return new Response(resized, {
21 headers: {
22 'Content-Type': 'image/webp',
23 'Cache-Control': 'public, max-age=86400',
24 },
25 });
26 },
27};

성능 결과:

code
1JavaScript (sharp): P50=350ms, P99=1200ms
2Rust WASM: P50=45ms, P99=180ms
3개선율: 85%

실전 예시 2: PDF 생성 (C++ → WASM)

javascript
1// Emscripten으로 컴파일된 C++ 라이브러리 (haru PDF)
2import createHaruModule from './haru.js';
3
4const haru = await createHaruModule();
5
6export function generatePDF(data) {
7 const pdf = haru.HPDF_New();
8 const page = haru.HPDF_AddPage(pdf);
9
10 haru.HPDF_Page_SetSize(page, haru.HPDF_PAGE_SIZE_A4, haru.HPDF_PAGE_PORTRAIT);
11
12 // 텍스트 추가
13 const font = haru.HPDF_GetFont(pdf, 'Helvetica', null);
14 haru.HPDF_Page_SetFontAndSize(page, font, 24);
15 haru.HPDF_Page_BeginText(page);
16 haru.HPDF_Page_TextOut(page, 50, 700, data.title);
17 haru.HPDF_Page_EndText(page);
18
19 const result = haru.HPDF_SaveToMemory(pdf);
20 haru.HPDF_Free(pdf);
21
22 return result;
23}

실전 예시 3: 암호화 연산 최적화

CPU 집약적 암호화 연산에서 WASM의 효과가 특히 큽니다:

javascript
1// JavaScript (순수 JS 구현)
2function hashPasswordJS(password, salt) {
3 // bcrypt JavaScript 구현: ~800ms
4 return bcryptjs.hash(password, 12);
5}
6
7// WASM (Rust argon2)
8import { hash } from './argon2_wasm.js';
9async function hashPasswordWASM(password, salt) {
10 // Rust argon2 WASM: ~120ms (메모리 안전, 병렬 처리)
11 return hash(password, salt, { memoryCost: 64 * 1024, timeCost: 3 });
12}

WASM 적용 의사결정 트리

code
1이 작업이 CPU 집약적인가?
2├── 아니오 → JavaScript/TypeScript로 충분
3└── 예
4 ├── 이미 최적화된 JS 라이브러리가 있는가?
5 │ ├── 예 → 해당 라이브러리 사용 (WASM 오버엔지니어링)
6 │ └── 아니오 → WASM 고려
7 ├── 팀에 Rust/C++ 역량이 있는가?
8 │ ├── 없음 → JS 라이브러리 최적화 먼저
9 │ └── 있음 → WASM 구현 진행
10 └── 목표 성능 개선이 3배 이상인가?
11 ├── 아니오 → JS 최적화로 충분
12 └── 예 → WASM 적합

WASM이 적합한 케이스:

  • 이미지/비디오 처리
  • 암호화/해시 연산
  • 데이터 압축/해제
  • 수치 계산 (ML 전처리, 통계)
  • 파서 (PDF, XML, 커스텀 바이너리 포맷)

WASM이 불필요한 케이스:

  • 단순 API 라우팅
  • JSON 처리 (V8이 이미 매우 빠름)
  • DB 쿼리
  • 문자열 변환

엣지 플랫폼 비교 (2026)

플랫폼WASM 지원콜드 스타트PoP 수월 비용
Cloudflare Workers완전 지원없음 (Isolate)300+$5~$25
Deno Deploy완전 지원없음35$0~$20
Fastly Compute완전 지원~1ms90+사용량 기반
AWS Lambda@Edge제한적100~500ms450+사용량 기반
Vercel Edge Functions완전 지원없음100+무료~$20

2026년 WASM 생태계 현황

성숙한 것:

  • wasm-bindgen (Rust↔JS 바인딩)
  • Emscripten (C/C++→WASM)
  • wasm-pack (Rust WASM 빌드 도구)
  • WASI (WebAssembly System Interface) — 파일, 네트워크 I/O

성장 중인 것:

  • Component Model — WASM 모듈 간 상호운용
  • WasmGC — 가비지 컬렉션 언어(Go, Kotlin) WASM 지원 개선
  • WASM 스레딩 — SharedArrayBuffer를 통한 멀티스레딩

아직 해결 중인 것:

  • 디버깅 UX (source maps가 아직 불완전)
  • 빌드 시간 (Rust WASM 빌드: 1~5분)
  • 모듈 크기 (최적화 없으면 1~5MB, 최적화 후 200~500KB)

실무 배포 팁

javascript
1// wrangler.toml (Cloudflare Workers)
2name = "image-processor"
3main = "src/index.js"
4compatibility_date = "2026-01-01"
5
6[build]
7command = "wasm-pack build --target web --release && npm run build"
8
9[[rules]]
10type = "CompiledWasm"
11globs = ["**/*.wasm"]
bash
1# 배포
2npx wrangler deploy
3
4# 로컬 테스트
5npx wrangler dev

WASM 모듈 크기 최적화:

toml
1# Cargo.toml
2[profile.release]
3opt-level = "z" # 크기 최적화
4lto = true
5codegen-units = 1
6panic = "abort" # 패닉 핸들러 제거
bash
1# wasm-opt으로 추가 최적화
2wasm-opt -Oz -o optimized.wasm input.wasm
3# 결과: 보통 20~40% 추가 크기 감소

FAQ

Q. Rust를 모르면 WebAssembly를 활용할 수 없나요? A. Rust가 가장 성숙한 WASM 생태계를 가지고 있지만, C/C++ (Emscripten), Go (TinyGo), AssemblyScript (TypeScript 유사 문법)도 WASM으로 컴파일할 수 있습니다. 기존 팀 역량에 맞는 언어를 선택하세요. 단, 성능과 생태계 완성도에서는 Rust가 가장 앞서 있습니다.

Q. WASM 모듈을 Cloudflare Workers에서 동시에 여러 요청이 사용하면 어떻게 되나요? A. 각 Worker Isolate가 독립적인 메모리 공간을 가집니다. WASM 모듈은 각 Isolate에 로드되어 메모리를 공유하지 않습니다. 단, 동일 Isolate 내에서 동시 요청이 오면 단일 스레드로 처리됩니다. CPU 집약적 작업에는 Cloudflare의 D1 Compute 또는 별도 서버로 오프로드를 고려하세요.

Q. WASM이 서버리스의 Cold Start 문제를 해결하나요? A. 직접적으로는 아닙니다. Cold Start는 실행 환경 초기화 시간입니다. Cloudflare Workers는 V8 Isolate 기반으로 이미 Cold Start가 거의 없습니다. WASM이 기여하는 것은 Isolate 내에서 실행되는 코드의 성능입니다. AWS Lambda + WASM은 여전히 Lambda Cold Start(100~500ms)가 있습니다.