layout.tsx에 다음과 같은 로직을 구현되어 있었다.
처음에는 이 로직을 layout.tsx가 아닌, middleware.ts로 옮기면 더 깔끔하지 않을까? 라는 생각이 들었다.
middleware는 페이지 진입 전에 실행되고, 라우팅도 서버 측에서 바로 처리할 수 있기 때문이다.
하지만 막상 옮기려다 보니,
생각보다 고려해야 할 점이 많다는 걸 깨달았다.
이 글은 그런 시행착오를 겪으며 직접 정리한
Next.js middleware.ts를 사용할 때 꼭 알아둬야 할 실전 주의사항들에 대한 내용이다.
fetch, DB 쿼리 등)는 지양req.cookies, req.nextUrl.pathname, 헤더 등 요청 메타데이터 기반 로직만 쓰는 걸 권장📌 예외: Supabase.getUser()처럼 내부 쿠키 파싱 기반이면 OK
matcher 설정으로 성능 최적화export const config = { matcher: [...] }로 적용 범위 제한export const config = {
matcher: ['/dashboard/:path*', '/admin/:path*'], // 필요한 경로만!
}
NextResponse.redirect()는 클라이언트 이동처럼 부드럽지 않음👉 UX적 전환이 중요하면 클라이언트 쪽에서 처리하는 것도 고려
req.cookies.get('access_token')은 요청에 포함된 쿠키만 읽을 수 있음HttpOnly, SameSite, Path 설정 잘못되면 middleware에서 접근 못 함👉 특히 개발 중에는 localhost와 실제 배포 주소의 쿠키 동작 차이도 체크해야 함
router.push()로 이동 시 CSR이면 middleware가 아예 실행 안 될 수도 있음 (이미 prefetch된 경우 → 서버 요청 없음)해결책: router.refresh() 추가하거나, 중요한 보안 로직은 middleware 대신 서버에서 처리
layout.tsx, page.tsx, API route 등으로 분산참고사항
Next.js 16부터는 proxy.ts가 middleware.ts를 대체합니다.