JavaScript/Next.js

middleware 적용

크런키스틱 2023. 2. 17. 10:56
728x90

이번 포스트에서는 Next.js에서 middleware를 적용하는 방법을 알아본다.

 

1. 기본 사용

next.js 프로젝트의 root에 middleware.ts 파일을 생성한다.

// middleware.ts

import { NextRequest, NextResponse } from "next/server";

export const middleware = async (request: NextRequest) => {
	console.log("middleware 입니다")
};

 

2. matcher

특정 경로에서만 실행되게끔 필터링해주는 옵션이다.

export const config = {
	matcher: '/test/:path*'
}

배열을 통해 단일 경로 또는 여러 경로를 필터링 가능하다.

export const config = {
	matcher: ['/test/:path*', '/main/:path*']
}

 

3. 조건문

export function middleware(request: NextRequest) {
  if (request.nextUrl.pathname.startsWith('/test')) {
    return NextResponse.rewrite(new URL('/test2', request.url))
  }

  if (request.nextUrl.pathname.includes('/main')) {
    return NextResponse.rewrite(new URL('/main/about', request.url))
  }
}

 

4. 접속 제한

- Bot 제한

request.ua(user agent) 내부에 isBot이 담겨 있으며, boolean 표현되어, 접근대상이 봇이면 차단 가능하다.

import type { NextRequest, NextFetchEvent } from "next/server";
import { NextResponse } from "next/server";

export function middleware(request: NextRequest, event: NextFetchEvent) {
  if (req.ua?.isBot) {
    return new Response("bot 감지", { status: 403 });
  }
}

- 쿠키에 따른 제한

이 방법을 이용해 비로그인 유저를 제한이 가능하고, 다양한 조건들을 추가할 수 있다.

import type { NextRequest, NextFetchEvent } from "next/server";
import { NextResponse } from "next/server";

export function middleware(request: NextRequest, event: NextFetchEvent) {
  if (!request.url.includes("/signin") && !request.cookies.auth) {
    return NextResponse.rewrite(new URL("/signin", request.url));
  }
}

 


개인적인 느낌으로 Next.js에서 middleware를 적용시키는 방법은 편리했으나, 사용가능한 폭이 좀 적다는 생각이 들었다.

url, 쿠키, 헤더에 관한 컨트롤은 편리하지만, middleware 내에서 data fetching이 안되기 때문에 back-end 통신과 관련된 조건을 추가하기에는 무리가 있었다.

따라서, 본인은 middleware를 쿠키와 url 접속에 대한 조건식 추가하는 정도로만 이용했다.

728x90