Node.js 17에서 OpenSSL 3.0 에러 대응하기

문제 상황

사내 대시보드 프로젝트를 Node.js 14에서 17로 업그레이드하는 작업을 진행했다. 빌드 과정에서 다음 에러가 발생했다.

Error: error:0308010C:digital envelope routines::unsupported
    at new Hash (node:internal/crypto/hash:67:19)

Webpack 4를 사용하는 프로젝트였는데, Node.js 17부터 OpenSSL 3.0이 적용되면서 기존 해시 알고리즘(MD4)이 지원 중단됐기 때문이었다.

해결 방법

당장 Webpack 5로 마이그레이션하기는 일정상 어려워, 임시로 두 가지 방법을 적용했다.

1. NODE_OPTIONS 환경변수 설정

export NODE_OPTIONS=--openssl-legacy-provider

package.json의 scripts를 수정했다.

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

2. .nvmrc로 버전 고정

팀원들과의 환경 통일을 위해 당분간 Node.js 16 LTS를 사용하기로 했다.

echo "16.13.2" > .nvmrc

근본적인 해결책

Webpack 5로 업그레이드하는 것이 정석이다. Webpack 5는 기본적으로 OpenSSL 3.0과 호환되는 해시 알고리즘을 사용한다. Q1 안에 마이그레이션 일정을 잡아야겠다.

레거시 프로젝트를 관리하다 보면 이런 breaking change에 자주 마주치게 된다. 의존성 업데이트를 미루지 말아야 한다는 교훈을 또 얻었다.

Node.js 17에서 OpenSSL 3.0 에러 대응하기