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 버전 변경사항을 미리 확인해야 한다는 교훈을 얻었다. 레거시 플래그는 임시방편일 뿐이고, 빌드 도구 업그레이드나 설정 변경이 장기적으로는 더 안전하다.