Node.js 17에서 OpenSSL 3.0 업그레이드로 인한 빌드 에러 해결
문제 상황
연말에 Node.js 17로 업그레이드를 진행했는데, 기존에 잘 동작하던 빌드 프로세스가 갑자기 실패하기 시작했다.
Error: error:0308010C:digital envelope routines::unsupported
at new Hash (node:internal/crypto/hash:67:19)
webpack 4를 사용하는 프로젝트에서 주로 발생했고, 특히 md4 해시 알고리즘을 사용하는 부분에서 에러가 났다.
원인 분석
Node.js 17부터 OpenSSL 1.1.1에서 3.0으로 업그레이드되면서 일부 레거시 알고리즘에 대한 지원이 기본적으로 비활성화되었다. webpack 4는 내부적으로 md4 해시를 사용하는데, 이것이 OpenSSL 3.0에서 안전하지 않은 알고리즘으로 분류되어 문제가 발생했다.
해결 방법
1. 임시 방편 - Legacy Provider 활성화
가장 빠른 해결책은 Node.js 실행 시 --openssl-legacy-provider 옵션을 추가하는 것이다.
{
"scripts": {
"build": "NODE_OPTIONS=--openssl-legacy-provider webpack",
"dev": "NODE_OPTIONS=--openssl-legacy-provider webpack serve"
}
}
2. 근본적 해결 - webpack 5 업그레이드
장기적으로는 webpack 5로 업그레이드하는 것이 맞다. webpack 5는 기본 해시 알고리즘을 md4에서 xxhash64로 변경했다.
// webpack.config.js
module.exports = {
output: {
hashFunction: 'xxhash64' // webpack 5의 기본값
}
};
3. Node 버전 고정
당장 업그레이드가 어렵다면 Node 16 LTS를 유지하는 것도 방법이다. .nvmrc로 버전을 명시해두었다.
16.13.1
결론
우리 팀은 일단 1번 방법으로 급한 불을 끄고, Q1에 webpack 5 마이그레이션을 계획했다. OpenSSL 3.0은 보안 강화를 위한 변경이므로, 레거시 provider에 의존하는 것은 임시방편으로만 사용해야 한다.
CI/CD 파이프라인에서도 Node 버전이 고정되어 있는지 확인이 필요했다. 팀원 로컬 환경마다 Node 버전이 달라서 혼란이 있었기 때문이다.