본문 바로가기
개발적인

Node OpenSSL 3.0 문제를 겪어보셨나요?

by klm hyeon woo 2023. 7. 17.

목차

· 회사 업무 중 처음 보는 에러를 마주하다.

· OpenSSL.. Hash.. 이게 도대체 뭐에요?

· OpenSSL이 뭐에요?

· OpenSSL 문제를 겪었을 때


회사 업무 중 처음 보는 에러를 마주하다.

회사 업무에서는 주로 바닐라 자바스크립트를 이용해 개발을 진행하지만, 평소 사이드 프로젝트에서는 신기술을 사용하는 것이 너무 재밌어 리액트 경험을 살려 리액트 관련 업무를 진행하게 되었다. 아무래도 현재 매출액의 코어 부분을 담당하는 부분의 일부분을 담당하니 비록 최신 코드는 아니지만, 클래스 컴포넌트로 이루어진 코드를 받게 되었다.

 

클래스 컴포넌트에서 함수형 컴포넌트로 변환 과정을 진행하고, 보통 현직 프로젝트에서는 CRA를 통한 프로젝트 생성보다는 Webpack을 이용해 번들 사이즈를 줄이려고 하기 때문에 마찬가지로 회사 프로젝트 또한 Webpack으로 구성이 되어있었다. 진행하고 있는 프로젝트가 현재 다양한 기업사에 판매되는 제품이다보니 기업사에서 원하는 기능이 있거나, 개선되어야할 사항을 종종 받곤하는데 그 중 하나가 Node 버전에 따른 리액트 프로젝트 샘플 실행이 안된다는 것이었다.

 

리액트의 경우, 프로젝트에 쓰이는 모듈만 설치를 하면 보통 정상적으로 실행이 되지만 처음 이런 이슈를 받곤 했을 때 상당히 의아했다. 그리고 프로젝트에서 사용되고 있는 Node 16 버전에서 Node 18 버전으로 업그레이드를 진행시켜 프로젝트를 실행 시켜보았다.

OpenSSL.. Hash.. 이게 도대체 뭐에요?

무슨 암호화 관련 에러가 발생을 했는데, 현재 프로젝트에서 사용되고 있는 Webpack과 관련된 오류들이 다양하게 발생했다. Node 16 버전에서는 안정적으로 실행되던 프로젝트들이 Node 18 버전에서는 잘 안 돌아간다는게 의아했지만 이러한 오류를 해결하고, 이해를 해야하기 때문에 관련 에러에 따른 구글링을 진행하였다.

 

일부 관련 비슷한 예시를 보여주자면, 에러 메세지는 다음과 같다.

Error: error:0308010C:digital envelope routines::unsupported
    at new Hash (node:internal/crypto/hash:71:19)
    at Object.createHash (node:crypto:133:10)
    at module.exports (/Users/joeun/Desktop/01-starting-project/node_modules/webpack/lib/util/createHash.js:135:53)
    at NormalModule._initBuildHash (/Users/joeun/Desktop/01-starting-project/node_modules/webpack/lib/NormalModule.js:417:16)
    at /Users/joeun/Desktop/01-starting-project/node_modules/webpack/lib/NormalModule.js:452:10
    at /Users/joeun/Desktop/01-starting-project/node_modules/webpack/lib/NormalModule.js:323:13
    at /Users/joeun/Desktop/01-starting-project/node_modules/loader-runner/lib/LoaderRunner.js:367:11
    at /Users/joeun/Desktop/01-starting-project/node_modules/loader-runner/lib/LoaderRunner.js:233:18
    at context.callback (/Users/joeun/Desktop/01-starting-project/node_modules/loader-runner/lib/LoaderRunner.js:111:13)
    at /Users/joeun/Desktop/01-starting-project/node_modules/babel-loader/lib/index.js:59:103 {
  opensslErrorStack: [ 'error:03000086:digital envelope routines::initialization error' ],
  library: 'digital envelope routines',
  reason: 'unsupported',
  code: 'ERR_OSSL_EVP_UNSUPPORTED'
}

Node 버전을 기업사에 제공한 샘플 파일을 실행할 때, 개발환경과 동일한 Node 16 버전을 권장할 수 있지만 Node 17, 18을 사용하는 기업사의 경우 이에 따른 해결 방안을 제시해주어야한다.

 

해결책을 파악하기 전, 먼저 OpenSSL이 무엇인지부터 개념을 파악해야했다.

OpenSSL이란?

OpenSSL이란, 데이터 통신을 위한 SSL 프로토콜을 이용할 수 있는 오픈소스 라이브러리이다. 인터넷을 통해 클라이언트와 서버가 통신할 때 통신 내용을 안전하게 보호하는 방법으로 여기서 SSL(Secure Socket Layer)은 WWW(World Wide Web)와 웹 서버 간에 데이터를 안전하게 주고받기 위한 표준 프로토콜을 의미한다. 쉽게 설명을 한다면 http 통신을 안전하게 하기 위한 프로토콜로 만들어진 것이 SSL이며, 이것은 실제 https와 같은 표준 프로토콜에 적용된 기술이다. 

 

개념을 파악했지만, 간단하게 프로젝트를 실행하려고만 했는데 왜 이러한 문제가 발생했을까라는 의문이 들었다.

오류 메세지를 파악해보니, 프로젝트에 사용되고 있는 웹팩 4 버전이 Node 17부터 새롭게 적용된 스펙인 OpenSSL 3.0 규격에 만족하지 못하기 때문에 관련 오류가 발생하는 것이었다.

 

OpenSSL 문제를 겪었을 때

OpenSSL 문제를 겪을 경우에는 오류 메세지를 잘 읽어보는 것이 가장 바람직하다. 구글링을 통해 다른 오류 내용들도 확인을 했었는데, 다양한 오류 내용들이 많았다. 보통은 그 프로젝트가 작업된 환경에서의 Node LTS 버전으로 맞춰주는 것이 가장 빠른 해결방법이지만, 위의 웹팩 버전이 규격에 맞지 않는 것처럼 명확하게 나오는 경우에는 해당 모듈을 버전에 맞게 맞춰주는 것이 추후 프로젝트를 진행하는데 있어 바람직할 수 있다. 

 

내가 확인한 프로젝트에 환경은 LTS 16버전에서 작업이 되었지만, 현재 기준 (2023.07.16) 으로 Node LTS는 18버전까지 업데이트가 되었다. 현재 최신의 LTS에 강제로 맞춰주기 위해서는 아래 해결책을 통해 손쉽게 해결할 수 있다. 

 

package.json 파일에서 보통 스크립트로 프로젝트를 실행을 담당하는 코드에서 `--openssl-legacy-provider` 코드를 추가해주면서OpenSSL 3.0이 아닌, 이전 OpenSSL 규격으로 돌리는 옵션을 설정할 수 있다. (물론 해당 코드는 Node 17 버전 이상부터 동작한다)

  "scripts": {
    "start": "react-scripts start --openssl-legacy-provider",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },

만약 해당 프로젝트의 빌드를 진행하게된다면, 빌드 코드 뒤에도 해당 옵션을 추가해 설정을 해줄 수 있다. 오류가 발생했을 경우에, 해결을 하는 방법은 여러가지이다. 프로젝트 관리를 진행하면서, 프로젝트 관리자의 입맛에 맞게 설정할 수 있도록 진행을 하면 된다.


레퍼런스

 

create-react-app으로 만든 프로젝트의 start가 동작하지 않는 문제

문제 원인 : Node 17버전부터 적용되는 OpenSSL 3.0의 규격을 만족하지 못하는 모듈이 있다.

velog.io

 

[NodeJS] 17 버전 달라진 점

NodeJS 17 버전 달라진 점 # OpenSSL 3.0 17버전 부터 OpenSSL을 포함합니다. 관련 설정을 진행하지 않으면 서버 실행에 문제가 있을 수 있습니다. 17버전부터 "ERR_OSSL_EVP_UNSUPPORTED"에러를 만났다면, OpenSSL

moonscode.tistory.com

 

댓글