Node.js 16에서 17로 마이그레이션하며 겪은 OpenSSL 3.0 이슈

문제 상황

프로젝트의 Node.js 버전을 16에서 17로 올리는 작업을 진행했다. 로컬에서는 문제없이 동작했지만, CI/CD 파이프라인에서 webpack 빌드가 실패했다.

Error: error:0308010C:digital envelope routines::unsupported

원인 분석

Node.js 17부터 OpenSSL 3.0이 적용되면서 MD4와 같은 레거시 해싱 알고리즘 지원이 중단되었다. 우리 프로젝트에서 사용 중인 webpack 4는 내부적으로 MD4를 사용하고 있었고, 이것이 문제였다.

webpack 5로 마이그레이션하는 것이 근본적인 해결책이지만, 당장은 일정상 어려웠다.

해결 방법

1. 환경변수 설정 (임시 방편)

export NODE_OPTIONS=--openssl-legacy-provider

package.json 스크립트에 추가했다.

{
  "scripts": {
    "build": "NODE_OPTIONS=--openssl-legacy-provider webpack --mode production"
  }
}

2. CI 환경 설정

GitHub Actions의 경우:

- name: Build
  run: npm run build
  env:
    NODE_OPTIONS: --openssl-legacy-provider

향후 계획

임시 방편이므로 2분기 내에 webpack 5 마이그레이션을 진행할 예정이다. OpenSSL 3.0은 보안 개선이 주 목적이므로, 레거시 옵션에 계속 의존하는 것은 바람직하지 않다.

참고

  • Node.js 17 릴리즈 노트에 OpenSSL 3.0 변경사항이 명시되어 있었다
  • webpack 5.54.0+부터는 이 문제가 없음
  • CRA 4를 사용 중이라면 CRA 5 업그레이드도 고려해볼 만하다
Node.js 16에서 17로 마이그레이션하며 겪은 OpenSSL 3.0 이슈