React2Shell과 React Server Components 보안 대응
이 글은 2025년 12월 11일 기준 React Server Components(RSC) 취약점 대응 절차를 정리한 글입니다. 특정 패치 번호를 그대로 복사하기보다, 프로젝트의 현재 버전과 공식 권고 버전을 함께 확인하는 것이 중요합니다.중요: RSC 취약점은 애플리케이션 설정만으로 우회할 수 없습니다. 영향을 받는 경우 공식 권고 버전으로 업그레이드해야 합니다.
영향 범위와 후속 공지
CVE-2025-55182(React2Shell)는 RSC 프로토콜의 원격 코드 실행 위험으로 알려졌습니다. 패치 분석 과정에서 CVE-2025-55183(소스 코드 노출)과 CVE-2025-55184(서비스 거부)도 확인되었습니다.CVE-2025-55184의 최초 수정은 완전하지 않았고, 완전한 서비스 거부 수정은 CVE-2025-67779으로 다시 공지되었습니다. 따라서 과거의 최소 패치 번호만 믿지 말고, Next.js 공식 보안 공지의 최신 권고를 확인해야 합니다.Next.js Security Update: December 11, 2025대응 절차
- 잠금 파일 기준으로 Next.js, React, React DOM의 실제 설치 버전을 확인합니다.
- 공식 점검 도구와 보안 공지로 영향을 확인한 뒤 권고 버전으로 올립니다.
- 업데이트 뒤에는 lint, 타입 검사, 빌드와 핵심 사용자 흐름을 모두 검증합니다.
pnpm why next react react-dom
pnpm outdated next react react-dom
# Next.js 공식 점검 도구가 제시하는 권고 버전을 확인하고 반영합니다.
npx fix-react2shell-next
# 잠금 파일까지 반영한 뒤 회귀를 확인합니다.
pnpm lint:web
pnpm type:check:web
pnpm build:webServer Action 방어선
의존성 패치는 필수지만, Server Action 자체도 공개 HTTP 입력 경계처럼 다뤄야 합니다. 각 Action에서 인증과 인가를 다시 확인하고, 입력을 서버에서 검증하며, 필요한 데이터만 응답으로 반환하세요."use server";
export const updateProfile = async (formData: FormData) => {
const user = await getCurrentUser();
if (!user) throw new Error("Unauthorized");
const input = profileSchema.parse({
displayName: formData.get("displayName"),
});
return profileService.update(user.id, input);
};