Next.js 미들웨어를 활용한 봇 트래픽 탐지 및 차단 가이드
2025-03-01 17:18:24Next.js 미들웨어를 활용한 봇 트래픽 탐지 개요
인터넷 트래픽의 상당 부분은 자동화된 봇에 의해 생성됩니다. 이러한 봇 중에는 Googlebot과 같은 유용한 봇들도 있지만, 스크래퍼와 같이 해로운 봇들도 존재합니다. 이 글에서는 Next.js 미들웨어를 활용하여 봇 트래픽을 탐지하고 차단하는 방법을 알아보겠습니다.
봇 탐지의 중요성
봇 탐지의 주요 목적은 웹사이트의 보안을 높이고, 서버 부하를 줄이며, 분석 데이터의 정확성을 보장하는 것입니다. 여러분의 웹사이트가 이러한 봇을 얼마나 잘 탐지하고 차단할 수 있는지에 따라 그 성과는 크게 달라질 수 있습니다. Next.js 미들웨어는 요청이 처리되기 전에 실행되므로 봇 탐지 구현에 이상적입니다.
Next.js의 미들웨어란?
Next.js의 미들웨어는 요청을 완료하기 전에 코드를 실행할 수 있는 기능을 제공합니다. 글로벌로 적용할 수도 있으며, 특정 경로에 대해서는 설정을 수정할 수도 있습니다. Vercel이나 Netlify 같은 플랫폼과도 잘 호환됩니다.
Next.js 미들웨어 작동 방식
미들웨어 파일은 프로젝트 루트에 middleware.ts 또는 middleware.js로 작성해야 합니다. 모든 라우트에 자동으로 적용되며, NextResponse를 사용하여 요청을 수정하고 리다이렉션할 수 있습니다.
간단한 미들웨어 구현
봇 탐지를 추가하기 전에 먼저 기본적인 미들웨어 구현을 통해 요청을 터미널에 로깅하는 방법을 살펴보겠습니다.
import { NextResponse } from "next/server";
const EXCLUDED_PATHS = ["/_next/", "/static/"];
const EXCLUDED_EXTENSIONS = [".svg", ".js", ".css", ".ico", ".png", ".jpg", ".jpeg", ".gif", ".webp", ".woff2"];
export function middleware(req: Request) {
const url = new URL(req.url);
if (EXCLUDED_PATHS.some(path => url.pathname.startsWith(path)) || EXCLUDED_EXTENSIONS.some(ext => url.pathname.endsWith(ext))) {
return NextResponse.next();
}
console.log(`Request received: ${req.url}`);
return NextResponse.next();
}
이제 npm run dev를 실행하여 Next.js 애플리케이션을 시작하고, 브라우저에 localhost:3000을 방문하여 터미널 로그를 확인합시다.
미들웨어에 봇 탐지 기능 확장
봇 트래픽을 탐지하려면, 위 코드에 사용자 에이전트를 확인하는 기능을 추가하면 됩니다.
import { NextResponse } from "next/server";
const EXCLUDED_PATHS = ["/_next/", "/static/"];
const EXCLUDED_EXTENSIONS = [".svg", ".js", ".css", ".ico", ".png", ".jpg", ".jpeg", ".gif", ".webp", ".woff2"];
const BOT_PATTERNS = [/bot/i, /crawler/i, /spider/i, /curl/i, /wget/i];
export function middleware(req: Request) {
const url = new URL(req.url);
const userAgent = req.headers.get("user-agent") || "";
if (EXCLUDED_PATHS.some(path => url.pathname.startsWith(path)) || EXCLUDED_EXTENSIONS.some(ext => url.pathname.endsWith(ext))) {
return NextResponse.next();
}
if (BOT_PATTERNS.some(pattern => pattern.test(userAgent))) {
console.log(`Bot detected! (${userAgent}) - Redirecting to /bot-detected.`);
return NextResponse.redirect(new URL("/bot-detected", req.url));
}
console.log(`Request received: ${req.url} | User-Agent: ${userAgent}`);
return NextResponse.next();
}
미들웨어 테스트
봇 탐지 미들웨어가 잘 작동하는지 테스트하기 위해 다음 명령어를 실행해봅시다.
curl -i -A "Googlebot" http://localhost:3000
정상적으로 구현되었다면 다음과 같은 응답이 터미널에 나타납니다.
HTTP/1.1 307 Temporary Redirect
location: /bot-detected
...
/bot-detected
일반적인 봇 탐지 기법 리뷰
사용자 에이전트 헤더 확인
봇 탐지를 위한 기본적인 방법으로, 많은 봇들이 실제 사용자의 에이전트와 유사하게 설정될 수 있어 최적의 방법은 아닙니다.
IP 주소 필터링
효과적인 방법으로 프로덕션 환경에서도 적용 가능합니다. 단, 수동으로 IP 주소를 관리할 수 없으므로 외부 API를 이용해야 합니다.
서드 파티 봇 탐지 API
안전하게 봇을 탐지하기 위해, BotD, DataDome 같은 서비스가 좋습니다. 이들은 무료는 아니지만, 프로덕션 환경에 적합한 수준의 보안을 제공합니다.
결론
봇은 웹사이트에 컨텐츠 스크래핑과 스팸, 보안 위험 및 성능 저하를 일으킬 수 있습니다. 기본적인 봇 탐지를 시작점으로 삼고, 필요에 따라 강력한 서드 파티 서비스를 활용해 봇의 위협으로부터 웹사이트를 보호합시다.