WebAssembly(줄여서 Wasm이라고 함)은 웹 애플리케이션 분야에 많은 이점을 제공합니다. 브라우저에서는 안전한 샌드박스 실행 환경을 제공하여 프런트엔드 개발자가 성능 저하 없이 다양한 고급 언어(JavaScript뿐만 아니라!)로 작업할 수 있게 해 줍니다. 또한 백엔드(서버 측)에서는 WebAssembly의 크로스 플랫폼 지원과 다중 아키텍처 이식성 덕분에 개발, 배포 및 확장성이 그 어느 때보다 쉬워질 것으로 기대됩니다.
NGINX는 서버 측 WebAssembly 모듈을 만들어 수정이나 여러 빌드 파이프라인 없이 어디서나 실행할 수 있는 세상을 꿈꿉니다. 즉, WebAssembly 모듈을 로컬 개발 환경에서 시작해 미션 크리티컬한 멀티 클라우드 환경까지 그대로 실행할 수 있습니다.
NGINX Unit 1.31 출시를 통해, 이러한 비전을 실현하게 되어 매우 기쁩니다. NGINX Unit은 범용 웹 애플리케이션 서버로서 애플리케이션 코드를 TLS, 정적 파일, 요청 라우팅과 같은 기타 필수 기능과 함께 실행합니다. 또한 NGINX Unit은 이 모든 기능을 제공하면서 7가지 프로그래밍 언어 런타임은 물론 이제 WebAssembly에서도 일관된 개발자 경험을 제공합니다.
NGINX Unit에 WebAssembly를 추가하는 것은 여러 측면에서 타당합니다:
- HTTP의 요청-응답 패턴은 WebAssembly 샌드박스의 입력/출력(I/O) 바이트 스트림과 자연스럽게 잘 맞습니다.
- 개발자는 런타임 성능을 저하시키지 않으면서도 고급 언어의 높은 생산성을 누릴 수 있습니다.
- NGINX Unit의 요청 라우터를 사용하면 여러 WebAssembly 모듈로 구성된 복잡한 애플리케이션을 손쉽게 구축할 수 있습니다.
- WebAssembly은 시작 시간이 빠르므로 단일 마이크로서비스와 함수를 배포하는 데는 물론, 모든 기능을 갖춘 애플리케이션을 배포하는 데도 적합합니다.
- 범용적인 이식성과 크로스 플랫폼 호환성 덕분에 복잡한 빌드 파이프라인 없이도 로컬에서 개발할 수 있습니다.
- NGINX Unit은 이미 애플리케이션별 격리 기능을 제공하며, WebAssembly 샌드박스를 통해 신뢰할 수 없는 코드를 더욱 안전하게 실행할 수 있습니다.
참고: 이 글을 작성하는 현재, WebAssembly 모듈은 기술 프리뷰 단계입니다. 자세한 내용은 아래를 참조하세요.
NGINX Unit WebAssembly 모듈은 어떻게 작동하나요?
NGINX Unit의 아키텍처는 네트워킹 프로토콜과 애플리케이션 런타임을 분리합니다. unitd: router 프로세스는 수신되는 HTTP 요청을 처리하며, 필요한 경우 TLS 계층도 담당합니다. 이 요청을 어떻게 처리할지 결정한 후에는 ‘HTTP 컨텍스트’(URI, 헤더 및 본문)가 애플리케이션 런타임으로 전달됩니다.
많은 프로그래밍 언어에는 애플리케이션 코드에 HTTP 컨텍스트를 제공하는 방식과 개발자가 URI, 헤더 및 본문에 액세스하는 방식에 대한 명확한 사양이 있습니다. NGINX Unit은 NGINX Unit의 라우터와 애플리케이션 런타임 사이의 인터페이스 계층을 구현하는 여러 언어 모듈을 제공합니다.
NGINX Unit용 WebAssembly 언어 모듈은 WebAssembly 런타임과 라우터 프로세스 사이에 이와 유사한 인터페이스 계층을 제공합니다. WebAssembly 샌드박스의 선형 메모리는 현재 요청의 HTTP 컨텍스트로 초기화되며, 완성된 응답은 클라이언트로 전송될 수 있도록 라우터에 다시 전달됩니다.
샌드박스 실행 환경은 Wasmtime 런타임에서 제공합니다. 아래 다이어그램은 클라이언트에서 라우터를 거쳐 Wasmtime이 실행하는 WebAssembly 모듈로 전달되는 HTTP 요청의 흐름을 보여 줍니다.
NGINX Unit에서 WebAssembly 모듈 실행하기
WebAssembly 모듈을 실행하도록 NGINX Unit을 구성하는 것은 다른 언어의 경우와 마찬가지로 간단합니다. 아래 구성 예시에는 다음 속성을 가진 helloworld 애플리케이션이 있습니다:
type은 이 애플리케이션에 로드할 언어 모듈을 정의합니다module은 컴파일된 WebAssembly 바이트코드를 가리킵니다access는 애플리케이션이 샌드박스 외부의 리소스에 접근할 수 있도록 지원하는 Wasmtime 런타임 기능입니다request_handler,malloc_handler, 그리고free_handler는 HTTP 컨텍스트를 Wasmtime으로 전달하는 SDK 함수와 관련이 있습니다(이에 대해서는 다음 섹션에서 자세히 설명합니다).
{
"applications":{
"helloworld":{
"type":"wasm",
"module":"/path/to/wasm_module.wasm",
"access":{
"filesystem":[
"/tmp",
"/var/tmp"
]
},
"request_handler":"luw_request_handler",
"malloc_handler":"luw_malloc_handler",
"free_handler":"luw_free_handler"
}
}
}WebAssembly 샌드박스 내부에서 HTTP 컨텍스트 찾기
앞서 언급했듯이 NGINX Unit의 WebAssembly 언어 모듈은 현재 요청의 HTTP 컨텍스트로 WebAssembly 실행 샌드박스를 초기화합니다. 많은 프로그래밍 언어 런타임은 HTTP 메타데이터에 직접 접근할 수 있는 네이티브 기능을 제공하지만, WebAssembly에는 이와 같은 표준이 없습니다.
궁극적으로는 WASI-HTTP 표준이 이러한 요구를 충족할 것으로 기대하지만, 그때까지는 Rust 및 C용 소프트웨어 개발 키트(SDK)를 제공합니다. Unit-Wasm SDK를 사용하면 WebAssembly로 컴파일되어 NGINX Unit에서 실행되는 웹 애플리케이션과 API를 손쉽게 작성할 수 있습니다. WebAssembly 사용 방법 가이드에서 개발 환경과 빌드 단계를 살펴볼 수 있습니다.
WebAssembly을 범용 런타임으로 활용할 수 있는 잠재력을 실현하려는 비전과 의지에도 불구하고, 이 SDK로 빌드한 애플리케이션은 NGINX Unit에서만 실행됩니다. 이러한 이유로 WebAssembly 지원을 기술 프리뷰로 도입하며, 가능한 한 빨리 WASI-HTTP 지원으로 대체할 예정입니다.
기술 프리뷰 사용해 보기
Technology Preview는 웹 애플리케이션을 실행할 수 있는 경량 서버를 제공하는 동시에 서버 측 WebAssembly의 잠재력을 보여주기 위해 마련되었습니다. 부담 없이 직접 사용해 보고 다양한 실험을 해 보신 후 피드백을 보내 주세요. 여러분의 의견은 NGINX 커뮤니티 Slack 또는 NGINX Unit GitHub 리포지토리를 통해 들려주시기 바랍니다.
시작하려면 NGINX Unit을 설치한 후 WebAssembly 사용 방법 가이드로 이동하세요.
작성자 소개

관련 블로그 게시물
시청하기: KubeCon North America 2023에서의 NGINX Gateway Fabric
이 영상에서는 KubeCon의 NGINX 부스를 찾아가, 저희가 공개한 Kubernetes Gateway API 구현을 살펴봅니다.
F5 NGINX로 대규모 WAF 플릿을 확인하고 관리하는 2가지 방법
앱 보안을 강화하는 두 가지 방법을 소개합니다. NGINX Management Suite를 통해 WAF 운영에 대한 가시성을 높이고, NGINX App Protect WAF를 활용해 코드형 보안을 구현하는 것입니다.
Ingress 컨트롤러 선택 가이드, 4부: NGINX Ingress Controller 옵션
개발 주체, 개발 철학, 프로덕션 환경 준비도, 보안 및 지원을 기준으로 어떤 NGINX Ingress 컨트롤러가 가장 적합한지 알아보세요.
진화하는 공격 환경에 NGINX App Protect Denial of Service가 적응하는 방법
NGINX App Protect Denial of Service(DoS)가 계층 7 DoS 공격을 방어하기 위해 완화 방법을 실시간으로 조정하는 방식을 설명합니다. 정상적인 사용자 행동과 서버 상태에 대한 모델을 생성하여 공격을 나타내는 이상 징후를 감지하고 맞춤형 완화 시그니처를 적용할 수 있습니다.
NGINX Instance Manager를 활용한 대규모 구성 업데이트 및 인증서 관리
NGINX Instance Manager 버전 1.0에는 두 가지 새로운 기능이 도입되었습니다. NGINX 인스턴스에 태그와 사용자 역할을 지정하면 전체 그룹에 구성을 한 번에 적용할 수 있습니다. 인증서 검사는 만료 예정인 인증서를 감지하여 서비스 중단을 방지할 수 있도록 인증서를 교체할 수 있게 해줍니다.
Netflix가 자사 CDN의 핵심으로 NGINX를 선택한 이유
Netflix가 글로벌 콘텐츠 전송 네트워크인 Open Connect의 스트리밍 미디어 기술로 NGINX를 선택한 이유를 NGINX 개발자 Gleb Smirnoff에게서 알아보세요.