- BOM 항목 추가/수정/삭제 시 섹션탭 즉시 반영 - 섹션 복제 시 UI 즉시 업데이트 (null vs undefined 이슈 해결) - 항목 수정 기능 추가 (useTemplateManagement) - 실시간 동기화 문서 추가 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
9.1 KiB
9.1 KiB
SEO 및 봇 차단 설정 문서
개요
이 문서는 멀티 테넌트 ERP 시스템의 SEO 설정 및 봇 차단 전략을 설명합니다. 폐쇄형 시스템의 특성상 검색 엔진 수집을 방지하면서도, 과도한 차단으로 인한 브라우저 경고를 피하는 균형 잡힌 접근 방식을 채택했습니다.
📋 구현 내용
1. robots.txt 설정 ✅
위치: /public/robots.txt
전략: 느슨한 차단 (Moderate Blocking)
주요 설정
# 허용된 경로 (Allow)
- / (홈페이지)
- /login (로그인 페이지)
- /about (회사 소개)
# 차단된 경로 (Disallow)
- /dashboard (대시보드)
- /admin (관리자 페이지)
- /api (API 엔드포인트)
- /tenant (테넌트 관리)
- /settings, /users, /reports, /analytics
- /inventory, /finance, /hr, /crm
- 기타 ERP 핵심 기능 경로
# 민감한 파일 형식 차단
- /*.json, /*.xml, /*.csv
- /*.xls, /*.xlsx
# Crawl-delay: 10초
크롬 경고 방지 전략
- 홈페이지(/) 허용: 완전 차단하지 않아 브라우저에서 악성 사이트로 분류되지 않음
- 공개 페이지 제공: /login, /about 등 일부 공개 경로 허용
- Crawl-delay 설정: 서버 부하 감소 및 정상적인 봇 동작 유도
2. Middleware 봇 차단 로직 ✅
위치: /src/middleware.ts
역할: 런타임에서 봇 요청을 감지하고 차단
핵심 기능
2.1 봇 패턴 감지
User-Agent 기반으로 다음 패턴을 감지:
- /bot/i, /crawler/i, /spider/i, /scraper/i
- /curl/i, /wget/i, /python-requests/i
- /axios/i (프로그래밍 방식 접근)
- /headless/i, /phantom/i, /selenium/i, /puppeteer/i, /playwright/i
- /go-http-client/i, /java/i, /okhttp/i
2.2 경로 보호 전략
보호된 경로 (Protected Paths):
/dashboard,/admin,/api/tenant,/settings,/users/reports,/analytics/inventory,/finance,/hr,/crm/employee,/customer,/supplier/orders,/invoices,/payroll
공개 경로 (Public Paths):
/,/login,/about,/contact/robots.txt,/sitemap.xml,/favicon.ico
2.3 차단 동작
봇이 보호된 경로에 접근 시:
HTTP 403 Forbidden
{
"error": "Access Denied",
"message": "Automated access to this resource is not permitted.",
"code": "BOT_ACCESS_DENIED"
}
2.4 보안 헤더 추가
모든 응답에 다음 헤더 추가:
X-Robots-Tag: noindex, nofollow, noarchive, nosnippet
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
Referrer-Policy: strict-origin-when-cross-origin
2.5 로깅
// 차단된 봇 로그
[Bot Blocked] {user-agent} attempted to access {pathname}
// 허용된 봇 로그 (공개 경로)
[Bot Allowed] {user-agent} accessed {pathname}
3. SEO 메타데이터 설정 ✅
위치: /src/app/layout.tsx
메타데이터 구성
metadata: {
title: {
default: "ERP System - Enterprise Resource Planning",
template: "%s | ERP System"
},
description: "Multi-tenant Enterprise Resource Planning System for SME businesses",
robots: {
index: false, // 검색 엔진 색인 방지
follow: false, // 링크 추적 방지
nocache: true, // 캐싱 방지
googleBot: {
index: false,
follow: false,
'max-video-preview': -1,
'max-image-preview': 'none',
'max-snippet': -1,
}
},
openGraph: {
type: 'website',
locale: 'ko_KR',
siteName: 'ERP System',
title: 'Enterprise Resource Planning System',
description: 'Multi-tenant ERP System for SME businesses',
},
other: {
'cache-control': 'no-cache, no-store, must-revalidate'
}
}
주요 특징
- noindex, nofollow: 검색 엔진 색인 및 링크 추적 차단
- nocache: 민감한 페이지 캐싱 방지
- Google Bot 세부 제어: 이미지, 비디오, 스니펫 미리보기 차단
- Cache-Control 헤더: 브라우저 및 프록시 캐싱 방지
- 다국어 지원: locale 설정 (ko_KR)
🎯 구현 전략 요약
| 구성 요소 | 목적 | 차단 강도 | 위치 |
|---|---|---|---|
robots.txt |
검색 엔진 크롤러 가이드 | 느슨함 (Moderate) | /public/robots.txt |
middleware.ts |
런타임 봇 감지 및 차단 | 강함 (Strong) | /src/middleware.ts |
layout.tsx |
HTML 메타 태그 설정 | 강함 (Strong) | /src/app/layout.tsx |
🔒 보안 수준
다층 방어 (Defense in Depth)
Layer 1: robots.txt
↓ 정상적인 검색 엔진 봇은 여기서 차단
Layer 2: Middleware Bot Detection
↓ 악의적인 봇 및 자동화 도구 차단
Layer 3: SEO Meta Tags
↓ HTML 레벨에서 색인 방지
Layer 4: Security Headers
↓ 추가 보안 헤더로 보호 강화
차단 vs 허용 균형
| 요소 | 설정 | 이유 |
|---|---|---|
| 홈페이지 (/) | ✅ 허용 | 크롬 경고 방지 |
| 로그인 (/login) | ✅ 허용 | 정상 접근 가능 |
| 대시보드 (/dashboard) | ❌ 차단 | ERP 핵심 기능 보호 |
| API (/api) | ❌ 차단 | 데이터 보호 |
| 정적 파일 (.svg, .png 등) | ✅ 허용 | 정상 웹사이트 기능 |
📊 동작 흐름
정상 사용자 (브라우저)
1. 사용자가 /dashboard 접근
2. middleware.ts: User-Agent 확인 → 정상 브라우저
3. X-Robots-Tag 헤더 추가
4. 정상 페이지 렌더링
5. HTML에 noindex 메타 태그 포함
검색 엔진 봇
1. Googlebot이 사이트 접근
2. robots.txt 확인 → /dashboard Disallow
3. Googlebot은 /dashboard 접근하지 않음
4. / (홈페이지)만 크롤링 → noindex 메타 태그 확인
5. 검색 결과에 포함하지 않음
악의적인 봇/스크래퍼
1. curl/python-requests로 /api/users 접근 시도
2. middleware.ts: User-Agent에서 'curl' 감지
3. isProtectedPath('/api/users') → true
4. HTTP 403 Forbidden 반환
5. 로그 기록: [Bot Blocked] curl/7.68.0 attempted to access /api/users
🧪 테스트 방법
1. robots.txt 확인
브라우저에서 접속:
http://localhost:3000/robots.txt
2. Middleware 테스트
정상 브라우저 접근:
curl -H "User-Agent: Mozilla/5.0" http://localhost:3000/dashboard
# 예상: 정상 페이지 반환 (인증 로직 없으면 접근 가능)
봇으로 접근:
curl http://localhost:3000/dashboard
# 예상: HTTP 403 Forbidden
# {"error":"Access Denied","message":"Automated access to this resource is not permitted.","code":"BOT_ACCESS_DENIED"}
공개 페이지 접근:
curl http://localhost:3000/
# 예상: 정상 페이지 반환 (X-Robots-Tag 헤더 포함)
3. 헤더 확인
curl -I http://localhost:3000/
# 확인 항목:
# X-Robots-Tag: noindex, nofollow
# X-Content-Type-Options: nosniff
# X-Frame-Options: DENY
4. SEO 메타 태그 확인
브라우저에서 페이지 소스 보기:
<meta name="robots" content="noindex, nofollow">
⚠️ 주의사항
크롬 경고 방지
-
완전 차단 금지: robots.txt에서 모든 경로를 차단하면 안 됨
# ❌ 절대 사용 금지 User-agent: * Disallow: / -
공개 페이지 유지: 최소한 홈페이지는 허용
-
HTTP 상태 코드: 403 사용 (404나 500은 피함)
-
정상 사용자 차단 방지: User-Agent 패턴 신중히 선택
로그 모니터링
- 차단된 봇 접근 시도를 모니터링하여 새로운 패턴 감지
- 정상 사용자가 차단되는 경우 BOT_PATTERNS 조정
- 로그 파일 위치: 콘솔 출력 (프로덕션에서는 로깅 서비스 연동 필요)
성능 고려사항
- Middleware는 모든 요청에 실행되므로 성능 영향 최소화
- 정규표현식 패턴 최적화 필요
- 필요시 Redis 등으로 IP 기반 rate limiting 추가 고려
🔄 향후 개선 사항
1. IP 기반 Rate Limiting
// 추가 예정: Redis를 활용한 rate limiting
import { Ratelimit } from "@upstash/ratelimit";
import { Redis } from "@upstash/redis";
2. 화이트리스트 관리
// 신뢰할 수 있는 IP나 User-Agent 화이트리스트
const WHITELISTED_IPS = ['123.45.67.89'];
const WHITELISTED_USER_AGENTS = ['MyCompanyMonitoringBot'];
3. 고급 봇 감지
// 행동 패턴 분석 (빠른 요청 속도, 비정상 경로 접근 등)
// Fingerprinting 기술 적용
4. 로깅 서비스 연동
// Sentry, LogRocket 등 APM 도구 연동
// 봇 공격 패턴 분석 및 알림
📝 변경 이력
| 날짜 | 버전 | 변경 내용 |
|---|---|---|
| 2025-11-06 | 1.0.0 | 초기 SEO 및 봇 차단 설정 구현 |