자바스크립트 컨테이너

컨테이너는 응용 프로그램과 그 실행 환경을 패키징하고 격리하는 데 사용되는 기술이다. 배포되는 서비스 소프트웨어의 운영체제 수준을 가상화하고, 응용 프로그램 및 시스템 종속성을 포함한 모든 것이 포함된 독립적인 환경을 제공한다.

이런 리눅스 컨테이너보다는 좀 더 높은 추상화 레벨이긴 하지만 유사한 형태의 격리환경은 브라우저의 JavaScript 환경이다. 그리고, 서버 소프트웨어를 위한 새로운 상위 레벨 컨테이너로서 JavaScript를 이용하는 방식이 떠오르고 있다.

JavaScript 컨테이너

JavaScript 컨테이너란 서버 소프트웨어 배포를 위한 새로운 상위 레벨 컨테이너로, 리눅스 컨테이너와는 다른 영역의 문제를 해결하기 위한 것이다. 이 컨테이너는 단순함, 브라우저와의 호환성, 웹어셈블리와의 연동 등의 특징을 가지고 있다.

보안

보안 측면에서 컨테이너는 독립된 메모리 공간을 가지고 있으며 한 컨테이너가 다른 컨테이너의 메모리 공간을 직접적으로 접근하는 것은 제한된다. 이것은 브라우저의 탭(Tab) 에서 제공하는 샌드박싱 (Sandboxing)을 제공하는 것과 비슷하다. 브라우저 샌드박싱은 웹 애플리케이션을 샌드박스내 격리된 환경에서 실행함으로서 악의적인 코드나 공격으로부터 웹 애플리케이션 및 사용자 시스템을 보호한다.

메모리 격리 (Memory Isolation)

모던 브라우저는 대부분 프로세스(Process) 단위로 브라우징 세션을 격리하는 샌드박스 환경을 제공한다. 브라우저의 윈도우나 탭은 이렇게 별도 프로세스가 할당된다. 이에 비해 JavaScript 런타임은 프로세스가 단위 아닌, JavaScript 엔진에서 제공하는 보안 매커니즘을 통해 격리 환경을 제공한다. 예를 들어 V8의 Isolation 기능은 JavaScript VM (Virtual Machine) 단위로 할당이 되어야하며, VM간 직접적인 메모리의 접근은 불가하다.

권한 모델 (Permission Model)

기존의 JavaScript 런타임은 사용자 자원 사용에 대한 특별한 제한을 두지 않았다. 실행 권한이란 것을 JavaScript 런타임에서 제어하는 복잡성 대신 사용자에게 런타임 실행환경을 안전하게 하는 책임을 넘긴 것이다. 따라서, SMACK(Simplified Mandatory Access Control Kernel) 통한 보안 통제를 하던지, Docker Container 와 같은 격리 환경을 만드는 것은 사용자의 책임이었다.

JavaScript 컨테이너는 자체적으로 권한 모델을 사용하여 애플리케이션의 요청 제한한다. 기본적으로 "최소 권한" 원칙을 따르는데, 각 구동을 위한 필요한 권한만을 부여하고, 다른 권한은 차단하는 것을 기본으로 한다. 예를 들어, File System이나 Network 기능을 액세스하기 위해서는 사용자의 명시적인 동의가 필요하다.

성능

서버리스 플랫폼 서비스들이 SaaS 의 경우 리눅스 컨테이너나 프로세스를 사용하여 실행 환경을 가동한다. 이는 자체 머신에서 JavaScript 런타임을 실행하는 것보다 가벼운 환경에서 코드를 실행하지 않는다. 서버리스 플랫폼은 프로세스를 확장하는 방식으로 환경 구성을 준비하기 때문에 Cold Start가 발생한다. 이런 경우 JavaScript 환경에서 제공하는 격리 환경을 이용하면 단일 프로세스가 여러개의 격리환경을 사용할 수 있다. 즉, Cold Start로 인한 지연을 줄이는 한편, 프로세스에 추가되는 메모리 리소스의 사용도 개선된다.

또한, 프로세스 기반으로 여러개의 서비스가 실행되어 있을시, 다양한 프로세스간에 전환에 필요한 시간이 걸리게된다. 예를 들어 한 프로세스에 필요한 메모리를 내보내고, 다른 프로세스를 위한 메모리를 로드하는 등의 컨텍스트 스위치(Context Switch)가 발생한다.이는 프로세스의 갯수에 비례해 오버헤드가 발생하는데, JavaScript내 격리 환경을 이용해 애플리케이션을 구성하면 프로세스간 전환에 따른 오버헤드를 없앨 수 있다.

단점

이러한 시스템은 임의의 컴파일된 코드를 실행할 수 없으며, Javascript나 WebAssembly가 지원하는 언어로 작성되어야한다.

References

Share