"Life is Full of Possibilities" - Soul, 2020

IT (프론트엔드)

[Next.js] Sentry 해킹 알림을 통해 개선된 CD 전략 (feat. Next.js 보안 이슈)

m2ndy 2025. 12. 28. 22:53

 

Sentry에서 해킹 알림이 뜨다

 

 

지난 어느 날, Next.js와 React의 critical 레벨의 보안 이슈가 발생했습니다.

 

https://github.com/vercel/next.js/security/advisories/GHSA-9qr9-h5gf-34mp

 

RCE in React Server Components

A vulnerability affects certain React packages<sup>1</sup> for versions 19.0.0, 19.1.0, 19.1.1, and 19.2.0 and frameworks that use the affected packages, including Next.js 15.x and 16.x using the A...

github.com

 

https://www.cve.org/CVERecord?id=CVE-2025-55182

 

https://www.cve.org/CVERecord?id=CVE-2025-55182

 

www.cve.org

 

 

 

크루위키 서비스는 Next.js 15.5.1 버전, App Router를 사용 중이었고 취약성이 발견되어 업데이트를 해야 하는 대상이었습니다.

곧바로 Next.js 버전을 업데이트하였지만 서버에 접근하려는 시도들이 지속적으로 발생했습니다.

 

 

 

 

Sentry와 연동한 Discord에서 알림이 매일 울렸습니다.

 

 

 

Sentry Trace를 분석한 결과 해커들이 Command Injection으로 셀 명령어를 주입한 것으로 파악되었습니다. 다행히 타임아웃으로 공격은 실패했습니다.

 

Next.js 버전을 올린 뒤에도 이러한 해킹 시도들이 계속 발생해서 함께 발표된 React 취약점에도 대응하기로 했습니다.

하지만..! 알고보니 Next.js 새로운 버전을 반영한 코드가 배포되지 않았습니다. React 업데이트 후 잘 배포되었는지 확인하기 위해 data-version 속성을 html에 추가했지만 dev 서버에서 확인되지 않으면서 발견되었습니다.

 

 

 

 

프리티어의 적은 메모리 용량으로 인한 배포 실패

 

 

기존에는 develop 혹은 main 브랜치에 PR이 머지되면 자동으로 EC2에서 배포가 일어나는 전략이었습니다. Github Actions에서 SSH로 EC2에 접속해 다음 스크립트를 실행합니다.

 

git pull

yarn install

yarn build

 

문제가 되는 지점을 파악하기 위해 EC2에서 스크립트를 수작업으로 실행했고, 빌드 시 Javascript Heap out of memory 에러가 발생하는 것을 발견했습니다. 빌드 과정에서 순간적으로 많은 메모리가 필요한데 램이 부족한 경우 이 에러가 발생하게 됩니다.

 

그렇지만 프리티어의 부족한 램 메모리를 늘리기 위해 이미 스왑 메모리 1GB를 가져와 사용하고 있었고 스토리지 공간 15GB도 99% 사용 중이었습니다.

 

팀원들과 논의했을 때 단순히 램 메모리를 늘리는 방법은 추후 서비스 크기가 커졌을 때 동일한 이슈를 겪을 것이라 판단했습니다. 그래서 CD 전략을 변경하기로 결정했습니다.

 

 

 

 

 

빌드를 Github Actions에서 실행하기

 

 

따라서 Github Actions (이하 GA)에서 빌드 후 결과물을 EC2로 전송하는 전략으로 변경했습니다.

 

GA에서 yarn build를 거쳐 생성된 .next 디렉토리를 잘 압축해 EC2로 전달합니다.

 

EC2에서는 압축을 해제하고 원격지의 코드와 동기화하는 작업을 수행합니다.

- 빌드 시 .next 디렉토리 이외에도 node_modules, .env, static 파일들, next.config.ts가 함께 필요하기 때문입니다.

 

yarn install을 통해 node_modules를 세팅한 뒤 pm2를 재시작하여 빌드 결과물을 서버에 반영합니다.

 

 

 

 

 

후속작업으로는 빌드 성공/실패 여부를 알림 받거나 version 정보를 CI 단계에서 추가하는 작업이 있을 것 같습니다.

 

 

 

 

 

 

감사합니다.