Featured image of post Next.js v16.2.6 — 13개 보안 권고를 한 릴리스에 묶은 긴급 패치

Next.js v16.2.6 — 13개 보안 권고를 한 릴리스에 묶은 긴급 패치

Next.js v16.2.6이 한 번에 닫은 13개 GHSA 권고를 Bypass DoS XSS SSRF Cache poisoning 다섯 카테고리로 정리한 디지스트

개요

vercel/next.js가 2026-05-07 v16.2.6 릴리스에서 13개 보안 권고를 한꺼번에 닫았다. High 7건 / Moderate 4건 / Low 2건. 현장 한 줄 평이 가장 정확하다 — “패치 내용 보니 안 하면 큰일 날 거 같습니다 / 엄청 크리티컬해요”. 특히 App RouterMiddleware/Proxy가 얽힌 인증·인가 우회 권고가 3건, WebSocket SSRF 1건, 캐시 오염 권고가 3건 — 표면이 다양해서 단일 버그가 아니라 공통 패턴이 드러난다.

1. Middleware/Proxy bypass × 3 — 가장 위험한 묶음

Middleware/Proxy는 라우트 진입 전 인증·인가·리다이렉트를 처리하는 곳이다. 이 레이어를 우회할 수 있다면 인증 자체가 무의미해진다. v16.2.6은 서로 다른 표면 3곳에서 우회 경로를 한꺼번에 닫았다.

세 표면(App Router segment / dynamic route / Pages Router i18n)에서 동시 발견됐다는 점이 메시지다. 단일 버그가 아니라 라우팅 모델 전반의 공통 패턴 — 미들웨어 매칭 로직과 실제 라우팅이 같은 경로를 다르게 해석하는 클래스의 결함이다. 게다가 26hh-7cqf-hhc6은 이전 패치의 incomplete fix를 같은 릴리스에 묶어 닫았다 — 외부에 불완전 패치가 노출되는 시간을 최소화한 점은 칭찬할 만하다.

2. SSRF — WebSocket upgrade

WebSocket upgrade 핸들링에서 Server-Side Request Forgery가 가능했다. 공격자가 서버를 통해 내부 네트워크 스캔, metadata endpoint 호출, 보호받는 내부 API 호출까지 시도할 수 있다는 뜻이다. Realtime/스트리밍 기능을 쓰는 앱은 직격탄.

3. 캐시 오염 × 3

React Server Components 응답이 CDN/Edge에서 캐싱되는 게 일반적인 만큼, 캐시가 한 번 오염되면 임의 사용자에게 악성 응답이 노출된다. 공격자가 직접 트리거 가능한 경로가 두 개. Severity가 Moderate/Low로 표시됐지만, Edge 캐시 토폴로지에 따라 실제 영향이 등급보다 클 수 있다.

4. XSS × 2

CSP nonce는 XSS를 막기 위한 마지막 방어선인데 거기 자체에 결함이 있었다는 게 핵심. beforeInteractive는 hydration 전에 실행되는 가장 위험한 위치라 untrusted input이 들어오면 손쓸 방법이 거의 없다.

5. DoS × 3

세 권고 모두 외부에서 비교적 적은 비용으로 트리거 가능한 종류라 High/Moderate가 붙었다. Cache Components는 커넥션 고갈, Image API는 변환 비용을 통해 자원을 소진하는 패턴이다.

즉시 해야 할 것

npm install next@16.2.6
yarn add next@16.2.6
pnpm add next@16.2.6
bun add next@16.2.6

App Router + Middleware로 인증·인가를 처리하는 앱은 즉시 업그레이드. Bypass 권고 3건이 합쳐지면 인증 자체가 의미 없어지는 시나리오가 있다. 업그레이드 전에 WAF/CDN 레이어에서 임시로 segment-prefetch 패턴과 의심스러운 ? query 파라미터를 차단하는 것도 고려.

인사이트

Triage 우선순위는 명확하다 — Bypass 3건 + SSRF 1건 + Cache poisoning 3건이 같은 릴리스에 묶였다는 사실 자체가 가장 큰 시그널이다. Middleware 우회가 세 다른 표면에서 동시 발견된 건 단일 버그가 아니라 App Router의 라우팅 모델과 Middleware 매칭 로직이 같은 경로를 다르게 해석하는 클래스의 결함이라는 뜻이다. Next.js 16이 비교적 신버전이라는 점을 감안해도, 한 릴리스에 13건이 묶이는 건 흔치 않다. Vercel 팀이 incomplete-fix follow-up을 같은 릴리스로 묶어 외부 노출 시간을 최소화한 점은 책임감 있는 disclosure의 좋은 사례. 현장 반응 “엄청 크리티컬해요” 가 정확하고, upgrade triage에서 highest priority로 다뤄야 한다. 더 큰 그림으로 보면, 이번 릴리스는 App Router의 라우팅 모델 자체에 대한 fuzz/감사가 더 필요했다는 신호다 — 미들웨어 매칭 로직과 라우팅이 분리돼 있는 한 같은 클래스의 결함은 또 나올 가능성이 높다.

참고

Release

High severity advisories

Moderate / Low advisories

Next.js docs

Hugo로 만듦
JimmyStack 테마 사용 중