피드로 돌아가기
Node.js 20 is now available!
Node.js BlogNode.js Blog
Backend

Node.js 20 릴리스에서 Permission Model, 동기식 import.meta.resolve, 안정화된 test_runner, V8 11.3 업그레이드를 통해 보안·표준화·개발 편의성 강화

Node.js 20 is now available!

2023년 4월 18일9intermediate

Context

Node.js 애플리케이션은 파일 시스템, 자식 프로세스, 워커 스레드, 네이티브 애드온 등에 제한 없이 접근할 수 있어 보안 위험이 존재했다. ESM 로더 API가 안정화되지 않아 instrumentation vendor들이 표준화된 API 기반의 라이브러리 구축을 미루고 있었다. 테스트 러너가 여전히 실험 단계여서 프로덕션 환경의 채택이 제한적이었다.

Technical Solution

  • Permission Model 도입: --experimental-permission 플래그로 파일 시스템 읽기/쓰기, 자식 프로세스 생성, worker_threads 접근, 네이티브 애드온 사용을 각각 제한 가능
  • 세밀한 파일 시스템 접근 제어: --allow-fs-read, --allow-fs-write 플래그로 특정 경로, 와일드카드 패턴을 지정하여 접근 허용
  • Runtime 권한 확인 API 제공: process.permission.has() 메서드로 실행 중 특정 권한 부여 여부 확인 가능
  • ESM 로더 스레드 격리: --experimental-loader 로더를 메인 스레드와 분리된 전용 스레드에서 실행하여 스코프 격리 및 크로스 컨태미네이션 방지
  • import.meta.resolve() 동기식 반환: 브라우저 동작과의 정렬을 위해 import.meta.resolve()를 동기식으로 변경 (사용자 로더의 resolve 훅은 비동기 유지 가능)
  • test_runner 안정화: describe, it/test, 훅, mocking, watch 모드, 병렬 실행(node --test) 기능을 포함한 테스트 러너 모듈을 안정 단계로 마킹
  • V8 엔진 버전 업그레이드: Chromium 113 기반 V8 11.3로 업데이트하여 성능 개선 및 새로운 언어 기능 추가
  • ARM64 Windows 지원 확대: CI 시스템에서 ARM64 Windows를 Tier 2 지원 수준으로 승격하여 리그레션 방지 및 호환성 보장
  • WASI 명령줄 옵션 제거: WASI 활성화를 위한 명령줄 옵션 요구 제거하여 소비 편의성 향상
  • WASI 버전 관리 강화: new WASI() 호출 시 버전 옵션 추가 (Node.js 20.x에서는 필수, 기본값 없음)

Impact

아티클에 정량적 수치가 명시되지 않음.

Key Takeaway

Node.js 20은 권한 기반 보안 모델 도입, ESM 로더 API 안정화, 네이티브 테스트 러너의 프로덕션 단계 진입을 통해 엔터프라이즈급 보안 요구사항 충족과 표준 도구 생태계 성숙을 동시에 달성했다. 런타임 수준의 세밀한 접근 제어와 스레드 격리 아키텍처 패턴은 멀티테넌트·샌드박스 환경에서 참고할 만한 설계 원칙을 제시한다.


Node.js 기반 SaaS 플랫폼이나 사용자 제공 스크립트를 실행하는 서비스에서 Permission Model의 --allow-fs-read, --allow-fs-write 플래그를 경로 화이트리스트와 함께 적용하면 미승인 파일 접근 및 프로세스 생성 공격을 차단할 수 있다. instrumentation 또는 모니터링 라이브러리 개발 조직은 ESM 로더 API 안정화에 따라 import.meta.resolve() 동기식 반환과 로더 스레드 격리에 의존한 안정적인 후킹 메커니즘을 구축할 수 있다.

원문 읽기