본문으로 건너뛰기
개발 머꼬
개발 노트Next.js
hohyeon.dev20

Next.js middleware.ts가 배포 후 조용히 안 먹힌 이유

  • #Auth
  • #Engineering Note
  • #Migration
  • #Next.js

문제 발생

Next.js를 최신 버전으로 올린 뒤, 기존에 잘 동작하던 인증 리다이렉트 로직(middleware.ts)이 배포 후 더 이상 실행되지 않는 것처럼 보였습니다.

원인 분석

Next.js는 middleware.ts를 deprecated하고 proxy.ts(export default function proxy(...))로 이름을 바꿨습니다. 파일이 여전히 middleware.ts로 남아 있으면, 버전에 따라 경고만 뜨고 동작은 하거나, 완전히 인식되지 않는 상태가 될 수 있습니다 — 정확한 동작은 실제 설치된 Next.js 버전의 마이그레이션 가이드를 확인해야 합니다.

단순히 파일명만 바꾼다고 끝나는 것도 아닙니다. 실제로 자주 놓치는 것은 다음과 같습니다.

  1. matcher 설정 누락: 파일을 옮기면서 기존 config.matcher 배열을 그대로 옮기지 않으면, 원래 보호하려던 라우트가 더 이상 이 로직을 거치지 않게 됩니다.
  2. request.url/request.nextUrl을 신뢰하는 문제: 로컬 개발 서버가 이 값을 서버 바인드 주소로 정규화하는 경우가 있어, 실제 요청 Host와 다르게 나올 수 있습니다. 리다이렉트 목적지를 만들 때 raw Host 헤더 기반의 별도 유틸리티를 쓰는 것이 안전합니다.
  3. 이건 인가(authorization)가 아니라는 점: middleware/proxy는 페이지가 실제로 렌더링되기 전의 최적화된 리다이렉트 계층이지, 진짜 권한 검증 계층이 아닙니다. 여기서만 인증을 확인하고 페이지 자체에서 세션을 다시 검증하지 않으면, matcher 설정 실수나 라우트 이동 한 번으로 보호가 조용히 빠질 수 있습니다.

해결 방안

  1. middleware.tsproxy.ts로 옮기고 export default function middlewareexport default function proxy로 바꿉니다.
  2. config.matcher 배열이 원래 보호하려던 모든 경로를 그대로 포함하는지 하나씩 확인합니다.
  3. proxy/middleware의 리다이렉트는 UX 최적화로만 취급하고, 실제 인가는 보호 대상 페이지 자신이 세션을 다시 검증하도록 이중으로 구현합니다.
  4. 로컬 개발에서 커스텀 도메인(서브도메인 등)을 쓴다면 next.config.tsallowedDevOrigins 설정이 필요한지도 함께 확인합니다.

공식 문서

이 영역은 Next.js 메이저 버전마다 API가 바뀌는 경우가 많으므로 반드시 현재 설치된 버전의 공식 문서를 우선 확인합니다.

마지막 수정

좋아요북마크

댓글0

아직 댓글이 없어요. 첫 의견을 편하게 남겨 보세요.