Next.js 16 CVE (16.1.7 해결)

곽태욱·2026년 3월 20일

Next.js 16 CVE (16.1.7 해결)

1. HTTP 요청 밀수 (Request Smuggling in rewrites)

프록시와 백엔드 서버 간에 데이터(청크)의 끝을 인식하는 방식이 달라, 공격자가 정상 요청 속에 악의적인 두 번째 요청을 숨겨 보낼 수 있음

즉, 게이트(프록시)와 목적지(백엔드)의 의사소통 오류를 악용해, 정상적인 요청 안에 나쁜 명령을 몰래 숨겨 통과시킬 수 있음

2. 무제한 버퍼링으로 인한 서비스 거부 (Unbounded postponed resume buffering DoS)

next-resume 헤더가 포함된 요청의 크기를 서버가 제대로 제한하지 않아, 악의적으로 거대한 데이터를 보내면 서버의 메모리가 고갈되어 다운될 수 있음

즉, 서버가 받아들일 수 있는 데이터의 한계를 정해두지 않으면, 공격자가 쓰레기 데이터를 무한정 쏟아부어 정상적인 서비스를 마비시킬 수 있음

3. 'null' 출처를 이용한 보안 검사 우회 (null origin bypasses Server Actions CSRF)

보안 검사 시 origin: null(샌드박스 환경 등)을 명시적인 출처로 보지 않고 '누락됨'으로 잘못 처리하여, 악의적인 사이트에서 사용자 권한을 도용해 서버에 명령을 내릴 수 있음

즉, 예상치 못한 '비어있는(null)' 정보를 보냈을 때 방어 시스템이 헷갈려 보안 검사를 건너뛰게 만듦

Next.js 배운 점

  • Next.js Server Action을 Cloudflare 에 캐시한 페이지와 묶으면 배포 후 Failed to find Server Action 같은 문제가 날 수 있음. 기존에 캐시된 페이지의 빌드 ID와 새로 배포된 페이지의 빌드 ID가 일치하지 않아 Server action ID가 일치하지 않기 때문에.
  • 해결책
    • 페이지 단위 Cloudflare 캐싱을 해제하기
    • 배포 후 기존 인스턴스를 일정 시간 동안 유지하기
    • Next.js Server Action 을 사용하지 않고 별도의 백엔드 서버 두기

Cloudflare 배운 점

  • URL 뿐만 아니라 요청의 Origin 헤더도 캐시 키에 포함됨
  • 응답의 Vary 헤더 값에 따라 캐시 버킷?이 분리됨
profile
이유와 방법을 알려주는 메모장 겸 블로그 (Frontend, AI, 경제, 책)

0개의 댓글