| name | bdev-copyguard |
| description | 웹사이트가 스크래핑·복제(클론)당하기 쉬운지 감사(audit)하고, 비용을 높이는 하드닝·클론 탐지·소유권 입증(DMCA) 방안을 처방하는 스킬. URL 하나 또는 로컬 코드베이스를 받아 9개 영역(자산 핫링크·봇/스크래핑 방어·AI 크롤러 옵트아웃·콘텐츠 카나리/지문·이미지 워터마크·복사 마찰·코드 노출·임베드/프레이밍·**노출 데이터 엔드포인트/API 인증**)을 점검해 0~100 점수와 우선순위 처방을 낸다. 요청 시(fix 모드) 진단에서 끝내지 않고 **로컬 코드베이스에 보호 구조를 직접 적용**(robots/ai.txt 생성·next.config CSP 헤더·레이아웃 카나리 토큰·DMCA 페이지·소스맵 off 등을 Edit/Write로). Claude Code·Codex에서 돌리면 감사→자동 하드닝까지. 트리거 — "사이트 복사 방지", "스크래핑 막아줘", "내 사이트 베끼지 못하게", "클론 방지 audit", "copy protect site", "anti-scrape", "DMCA", "콘텐츠 도용 막기". 주의 — 100% 차단은 불가능(브라우저 렌더=복사 가능)하며, 이 스킬은 "비용 상승 + 탐지 + 입증"을 목표로 한다. 우클릭 차단류는 보안이 아니라 마찰로만 다룬다. |
bdev-copyguard — 사이트 복사방어 감사기
철칙 (먼저 읽기)
- 완전 차단은 없다. 브라우저가 렌더한 것은 저장·복제될 수 있다. 목표는 불가능이 아니라 ① 복제 비용↑ ② 클론 탐지 ③ 소유권 입증(DMCA).
- 마찰 ≠ 보안. 우클릭/선택/복사 차단(JS·CSS)은 1초면 우회되고 UX·SEO·접근성을 해친다. "보안"으로 분류하지 말고 "약한 마찰"로만, 신중히 권한다.
- 정직하게 점수 매긴다. 없는 보호를 있다고 하지 않는다. 각 처방에 효과/한계를 같이 적는다.
Phase 1 — 스코프 & 모드 결정
스코프 (입력에서 하나):
- URL → 라이브 감사.
WebFetch로 HTML·헤더·robots.txt·ai.txt 분석.
- 로컬 코드베이스(현재 프로젝트) →
Read/Grep/Glob로 점검. → 이 경우 코드에 직접 적용까지 가능.
모드 (이게 핵심):
- audit (기본) — 진단 + 처방까지만(읽기 전용).
- fix (적용) — 사용자가 "고쳐줘·적용·하드닝 해줘·fix·apply" → Phase 4에서 코드베이스를 직접 수정(Edit/Write)해 보호 구조를 심는다.
한 줄 출력: bdev-copyguard — {url|repo} / {audit|fix} 모드
Phase 2 — 9개 영역 감사
references/audit-checklist.md의 각 항목을 점검하고 **상태(✅양호 / ⚠️부분 / ❌취약 / —해당없음)**와 근거를 기록한다.
- 자산 핫링크 보호 — 이미지/동영상이 외부 사이트에 그대로 임베드되는가? (referer 검사·서명 URL 여부)
- 봇/스크래핑 방어 — Cloudflare/WAF·Bot Fight·Turnstile/hCaptcha·rate limit 흔적, 서버 헤더.
- AI 크롤러 옵트아웃 — robots.txt / ai.txt에 GPTBot·CCBot·Google-Extended·ClaudeBot 차단 지시.
- 콘텐츠 카나리/지문 — 도용을 증명할 고유 표식(보이지 않는 문자열·hidden meta·고유 문구)이 있는가.
- 이미지 워터마크 — 가시/비가시 워터마크, EXIF 저작권.
- 복사 마찰 — user-select/contextmenu 처리 (있으면 효과·부작용 같이 평가).
- 코드 노출 — 프로덕션 소스맵 노출, 주석/내부 경로/관리자 흔적, 미들웨어 비밀.
- 임베드/프레이밍 & DMCA 준비도 —
X-Frame-Options/CSP frame-ancestors, 저작권 고지·DMCA 연락처·등록 여부.
- 노출 데이터 엔드포인트 / API 인증 (P0·최우선) — 페이지가 부르는
/api/*·GraphQL·_next/data를 무인증 직접 호출해 데이터가 나오는지(=UI는 게이트인데 API는 공개 = 스크래핑 #1 경로), 전체 덤프·과다 필드 노출. 인증 뒤 엔드포인트는 100% 차단 가능 — "지킬 데이터는 클라에 안 보내고 서버 인증 뒤에".
Phase 3 — 리포트
다음을 출력한다.
- 0~100 점수 (영역별 가중 합) + 한 줄 등급.
- 스코어카드 표: 영역 / 상태 / 근거 / 우선순위(P0~P2).
- 우선순위 처방 Top 5 — 각 처방에 무엇을·어떻게·효과·한계.
- 현실 경고: "완전 차단은 불가. 가장 큰 레버는 보통 ③AI 옵트아웃 + ④카나리 + ⑧DMCA 준비(탐지·입증)다."
Phase 4 — 하드닝 적용 (fix 모드: 코드에 직접 심기)
로컬 코드베이스 + fix 모드면, 처방하고 끝내지 말고 실제로 적용한다. 이 스킬의 진짜 가치다.
4-1. 스택 감지
Glob/Read로 판별: Next.js(next.config.*)·정적(public/index.html)·Apache(.htaccess)·Nginx·WordPress·Astro/Vite 등.
4-2. 적용 계획 제시 (먼저)
바꿀 파일 목록 + 각 변경 한 줄 설명을 표로 보여주고 승인을 받는다. 예:
| 파일 | 작업 | 내용 |
|---|
public/robots.txt | 생성/수정 | AI 크롤러 차단 |
public/ai.txt | 생성 | AI 사용정책 |
next.config.ts | 수정 | CSP frame-ancestors·X-Frame-Options 헤더 |
app/layout.tsx | 수정 | 카나리 토큰(zero-width) 주입 |
app/dmca/page.tsx | 생성 | DMCA·저작권 고지 페이지 |
4-3. 적용 (승인 후)
Write/Edit로 코드에 직접 반영한다. references/hardening-recipes.md의 스니펫을 스택에 맞게 변형:
- robots.txt / ai.txt →
public/(Next/정적) 등에 생성.
- CSP·X-Frame-Options → next.config
headers() 또는 정적 호스트 헤더 설정 파일에 추가(기존 헤더 보존).
- 카나리 토큰 → 공통 레이아웃/footer에 보이지 않는 고유 문자열 주입 + 그 토큰을 사용자에게 알려주고 모니터링 쿼리 제공.
- 소스맵 off → 빌드 설정(
productionBrowserSourceMaps:false 등).
- DMCA 페이지·저작권 footer → 페이지/컴포넌트 생성.
- 핫링크 차단(.htaccess/Nginx) → 코드 아님(서버 설정)이라 파일로 생성해 레포에 두고 "이 위치/패널에 적용하라" 안내(자동 배포·서버 변경 금지).
- 복사 마찰 JS/CSS → 사용자가 명시 요청할 때만, "보안 아님·SEO/접근성 저하" 경고와 함께 좁은 영역에만.
4-4. 변경 요약 + 다음 액션
무엇을 바꿨는지 요약하고, 코드로 못 푸는 것(Cloudflare WAF·캡차·저작권 등록·클론 모니터링 운영)은 별도 setup 체크리스트로 넘긴다.
안전장치: ① 계획 먼저·승인 후 적용 ② 기존 설정 덮어쓰지 말고 병합 ③ 서버(.htaccess/Nginx)·배포는 파일 생성/안내까지만, 실행·배포는 사용자. ④ 빌드·테스트는 사용자 확인.
비-목표
- 캡차 우회·실제 봇넷 방어 운영(인프라 영역, 이 스킬은 점검·처방까지).
- 법률 자문(DMCA 템플릿은 출발점일 뿐, 변호사 검토 권장).
- "100% 복사 불가" 약속 — 하지 않는다.