Next.js/라우팅/Lesson 11
Middleware — 모든 요청 가로채서 인증·리다이렉트·헤더 조작
30분·theory
이 챕터
3/3
TypeScript
Middleware — 모든 요청 가로채서 인증·리다이렉트·헤더 조작
💡 왜 배워야 할까요? — 모든 페이지 컴포넌트에 if(!session) 안 적으려면
🎯
보호된 페이지마다 'session 없으면 로그인으로 보내기' 코드 — 미들웨어 한 곳에 두면 끝.
💼
Edge Runtime 에서 실행 → 페이지 컴포넌트 도달 전에 차단. 더 빠른 응답.
⚡
matcher config 로 정확히 어떤 경로에 적용할지 통제.
🔗
A/B 테스트, 국가별 리다이렉트, 봇 차단, 응답 헤더 추가 — 라우팅 직전에 필요한 모든 로직.
📈
Next.js 의 codemaster40 도 [`src/middleware.ts`](src/middleware.ts) 로 `/dashboard`·`/admin` 같은 보호 경로 처리.
🏢 실무에서는
이 프로젝트의 middleware.ts 가 정확히 그런 일을 합니다 — `/dashboard`·`/bookmark`·`/memo-notes` 같은 개인화 경로 진입 시 session 검증, 없으면 `/login?next=...` 로 리다이렉트. 페이지 컴포넌트는 'session 있다' 가정하고 작성하면 됨.
middleware.ts · matcher · NextResponse
1. 위치와 시그니처
- ▸Edge Runtime 에서 실행 (Node API 일부 제한).
- ▸matcher 에 적은 경로에만 작동.
2. matcher 패턴
3. 주요 동작 4가지
4. 실전 — 인증 미들웨어
5. 응답 쿠키·헤더 조작
6. Edge Runtime 제약
- ▸
fs·net·dns같은 Node-only 모듈 사용 불가. - ▸응답 시간 25ms 권장 (Vercel 기준).
- ▸무거운 DB 호출 X — 빠른 검증만.
💡 💡 Middleware 실전 5
1. matcher 에 음수 lookahead 패턴 — '제외' 표현
빈번한 자산 요청을 미들웨어가 안 건드리게.
2. Edge Runtime 제약 — 무거운 DB 호출 X
쿠키 검증·간단한 JWT 디코드 같은 빠른 작업만. 진짜 DB 쿼리는 페이지 컴포넌트에서.
3. NextResponse.next() 한 번에 헤더 두기
4. 응답 쿠키 설정
httpOnly + secure 가 기본. SameSite=Lax 도 권장.
5. 디버깅 — console.log 는 서버 로그
middleware 안 console.log 는 Vultr·Vercel 의 서버 로그에 찍힘. 브라우저 콘솔에는 안 보임.
⚡ 직접 실행해보기 — middleware 동작 시뮬레이션
각 요청 경로가 middleware 에서 어떻게 처리되는지 시뮬레이션.
✏️ JS 코드
📟 콘솔 출력
▶ 실행 버튼을 눌러보세요
⚠️ 브라우저 샌드박스에서 실행 — console.log()만 지원, alert/fetch 불가
확인 퀴즈
middleware.ts 의 matcher 설정으로 가능한 것은?
먼저 읽으면 좋은 개념: Layout vs Template — 상태 유지 vs 매번 마운트