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

문제 상황

회사 프로젝트를 Node.js 16에서 17로 업그레이드하는 작업을 진행했다. 로컬에서는 문제없이 동작했지만, CI/CD 파이프라인에서 빌드가 실패했다.

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

Node.js 17부터 OpenSSL 3.0이 적용되면서 일부 레거시 암호화 알고리즘이 기본적으로 비활성화되었다. 우리 프로젝트의 Webpack 4에서 사용하던 MD4 해시 알고리즘이 문제였다.

임시 해결

당장 빌드를 통과시키기 위해 --openssl-legacy-provider 플래그를 사용했다.

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

근본 해결

Webpack 설정에서 해시 알고리즘을 명시적으로 변경했다.

// webpack.config.js
module.exports = {
  output: {
    hashFunction: 'xxhash64'
  }
};

또는 Webpack 5로 업그레이드하는 방법도 있었지만, 당장은 리스크가 커서 보류했다. Webpack 5는 이미 OpenSSL 3.0을 지원한다.

결론

Node.js 메이저 버전 업그레이드 시 OpenSSL 버전 변경사항을 미리 확인해야 한다는 교훈을 얻었다. 레거시 플래그는 임시방편일 뿐이고, 빌드 도구 업그레이드나 설정 변경이 장기적으로는 더 안전하다.

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