피드로 돌아가기
Node.js 11.9.0 (Current)
Node.js BlogNode.js Blog
DevOps

Node.js 11.9.0이 OpenSSL 1.1.1a로 업그레이드하면서 다중 플랫폼 빌드 호환성 확보

Node.js 11.9.0 (Current)

2019년 1월 30일6advanced

Context

Node.js는 여러 플랫폼(AIX, macOS, Windows, s390)에서 OpenSSL 1.1.1a를 지원해야 했으나, 각 플랫폼별 어셈블러 호환성, gyp 빌드 설정, AVX2 최적화 등이 불일치했다.

Technical Solution

  • OpenSSL 소스를 1.1.1a로 업그레이드: Sam Roberts가 주도하여 기본 소스 코드 교체 수행
  • AIX 플랫폼용 비GNU 어셈블러 지원: Shigeki Ohtsu가 non-GNU assembler 호환성 패치 적용
  • s390 아키텍처 어셈블리 규칙 추가: s390 ISA 특화 어셈블리 빌드 규칙 신규 작성
  • OpenSSL 1.1.1 전용 AVX2 구성 파일 추가: CPU 확장 명령어 활용을 위한 아키텍처별 설정 분리
  • macOS 및 Windows 빌드 수정: 플랫폼별 gyp/gypi 파일 수정 및 빌드 스크립트 조정
  • Python 3 호환성 강화: compress_json 및 configure.py를 Python 3로 변환하여 빌드 도구 체인 현대화
  • DNS IDNA 2008 표준 적용: 비ASCII 호스트명 인코딩 시 IDNA 2008 표준 채택

Impact

OpenSSL 1.1.1a는 API/ABI 호환성을 1.1.0j과 유지하므로 기존 코드의 재컴파일 없이 업그레이드 가능하다. 다만 OpenSSL이 TLS 1.3을 지원하더라도 Node.js 11.9.0은 TLS 1.3을 아직 미지원한다.

Key Takeaway

OpenSSL 메이저 의존성 업그레이드 시 단순 소스 교체가 아니라 각 지원 플랫폼의 어셈블러, 빌드 시스템, 최적화 설정을 개별적으로 검증·수정하는 세밀한 작업이 필수이며, 이는 바이너리 호환성과 보안 패치 적용 속도를 동시에 확보하는 전략이다.


멀티플랫폼 Node.js/C++ 바인딩을 관리하는 팀에서 OpenSSL 같은 네이티브 의존성을 업그레이드할 때, 각 아키텍처(x86_64, s390, ARM 등)와 OS(Linux, macOS, Windows, AIX)에 대해 어셈블리 규칙과 gyp 빌드 설정을 사전에 검증하고 CI/CD에서 플랫폼별 크로스 컴파일 테스트를 추가하면 프로덕션 배포 후 예상 밖의 호환성 문제를 줄일 수 있다.

원문 읽기