동의 감사: 누군가 '동의'를 클릭하기 전에 무엇이 실행되나요?
이 스킬의 배경 (Dr. Erin Toussaint Jacques, IG 릴, 2026년 10월): 바이브 코딩된 앱은 방문자가 '동의'를 클릭하기 전에 추적 픽셀이 실행되는지 아무도 확인하지 않기 때문에 소송에 걸리기 쉬운 방법입니다. 픽셀은 Meta, Google 등에서 사용자가 사이트에서 하는 작업을 추적하는 작은 코드 조각입니다. 캘리포니아 도청법(CIPA)에 따라, 동의 전에 시작되는 추적은 도청으로 간주될 수 있으며, 위반 시 최대 $5,000의 법정 손해배상이 발생할 수 있으며, 픽셀 소송은 현재 수천 건에 달합니다. 배너를 두는 것과 허가를 기다리는 것은 완전히 다른 두 가지입니다. 소송을 당한 많은 사이트에는 배너가 있었습니다. 추적은 페이지가 열리자마자 로드되었습니다.
따라서 이 감사는 하나의 질문에 증거를 가지고 답합니다: 신규 방문 시, 어떤 클릭도 하기 전에, 무엇이 로드되고 무엇이 전송되며, 누구에게 전송되나요?
이것은 엔지니어링 감사이며 법적 조언이 아닙니다. 누군가에게 "적법하다"고 말하지 마십시오. 발견된 사항, 수정된 사항, 확인되지 않은 사항, 그리고 광고를 운영하거나 캘리포니아 또는 EU에 판매하는 경우 변호사가 검토해야 한다고 말하십시오.
기본값: 읽기 전용
이 스킬에서 아무것도 변경하지 마십시오: 편집, 게시, 데이터베이스 또는 인증 변경, 새 서비스, 약관 동의. 수정은 소유자가 동의한 후 consent-gate의 역할입니다.
1단계: 코드 인벤토리
코드가 로컬에 있거나(Lovable 프로젝트의 GitHub 클론) 다음 스캐너를 실행하십시오:
python3 ~/.claude/skills/consent-audit/scripts/scan_trackers.py /path/to/app
스캐너는 발견한 모든 트래커, 픽셀, 분석, 리플레이, 임베드 및 타사 스크립트 서명을 파일과 줄 번호별로 나열하고, 이메일 또는 사용자 ID를 전송하는 것으로 보이는 줄을 표시하며, 근처에 동의 확인이 나타나는지 여부를 알려줍니다. "근처에 동의 확인" 메모는 단서일 뿐 증거는 아닙니다. 각 히트 주변의 코드를 읽어 다음을 확인하십시오:
- 시작 위치.
index.html<head>,main.tsx,App.tsx,_app/layout또는 공급자는 모든 페이지의 모든 방문자에 대해 실행됨을 의미합니다. - 게이트 조건. 스크립트 태그,
import또는init()가 저장된 명시적 옵트인 후에만 실행됩니까?gtag('config')가 이미 실행된 상태에서 숨겨지는 배너는 게이트가 아닙니다. - 전송하는 내용.
identify(email),setUser({ email }), Meta 고급 매칭(em,ph),?쿼리 문자열 또는#프래그먼트가 포함된 전체 URL(선물 코드, 재설정 토큰, 검색 텍스트), 양식 필드. - 서버 측 전달. Conversions API,
/api/track, Meta/Google/Segment에 게시하는 엣지 함수. 이들은 동일한 선택을 존중해야 합니다.
로컬 코드가 없는 경우(브라우저에서만 접근할 수 있는 Lovable 프로젝트), 해당 프로젝트 채팅 내 references/prompts.md의 감사 전용 프롬프트를 사용한 다음 2단계로 보고서를 확인하십시오.
2단계: 라이브 사이트 확인 (배너가 속일 수 없는 부분)
코드는 누락으로 인해 거짓말을 할 수 있습니다(태그 관리자, 호스팅 추가 기능, CMS 스니펫). 항상 쿠키가 없는 새 브라우저 탭에서 게시된 URL을 확인하십시오:
- 새 비공개 컨텍스트에서 사이트를 엽니다(Claude의 내장 브라우저에서: 스토리지를 지운 후 새 탭 또는 이전에 방문한 적이 없는 사이트). 아무것도 클릭하지 마십시오.
- 네트워크 요청을 읽습니다(
read_network_requests). 클릭 전에 광고, 분석 또는 리플레이 도메인에 대한 요청이 있으면 발견 사항입니다: 도메인, URL 경로, 식별자(fbp,_ga,cid,uid,em,ttp)를 포함하는지 여부를 나열하십시오. javascript_tool을 통해 쿠키와 스토리지를 읽습니다:document.cookie,Object.keys(localStorage)._ga,_fbp,_gcl_au,_ttp,_hj*,ph_*,ajs_*,_clck또는_uetsid를 기록하십시오.- 거부를 클릭하거나(거부 옵션이 없으면 배너를 닫습니다). 두 페이지 더 탐색하십시오. 새로 실행되는 것은 모두 발견 사항입니다.
- 새 컨텍스트에서 동의를 클릭하십시오. 트래커가 이제 로드되는지 확인하여 게이트가 단순히 고장난 것이 아님을 확인하십시오.
- 테스트 계정이 있으면 로그인하십시오(실제 고객 계정은 절대 안 됩니다). 이메일이나 사용자 ID가 트래커 요청에 포함되어 나가는지 확인하십시오.
3단계: 호스팅 및 플랫폼 설정 확인
호스트에 의해 주입된 트래커는 앱의 코드에 나타나지 않습니다:
- Lovable: 프로젝트 → 설정 → 방문자 분석(Visitor analytics). 기본적으로 켜져 있습니다. 모든 프로젝트(새 프로젝트 포함)에서 끄거나 게이트하십시오.
- Vercel (Web Analytics / Speed Insights), Netlify (Analytics), Cloudflare (Web Analytics, Zaraz), Framer/Webflow/Wix/Squarespace (사이트 설정 → 사용자 정의 코드 / 분석 / 픽셀), EzyCourse / Systeme / Kajabi (추적 코드 필드, Facebook Pixel 필드).
- 태그 관리자: GTM 컨테이너를 열고 모든 태그와 트리거를 나열하십시오. 동의 조건 없이 "모든 페이지"는 동의 전에 실행됨을 의미합니다.
4단계: 분류 및 보고
모든 항목을 분류하십시오:
| 클래스 | 예시 | 규칙 |
|---|---|---|
| 필수 | 로그인 세션, CSRF, 장바구니, 결제 페이지의 Stripe, 사기/봇 검사, 저장된 UI 환경설정 | 동의 없이 실행 가능. 이들만으로는 배너가 필요 없음. |
| 기능적 임베드 | 지도 페이지의 Mapbox, YouTube/Vimeo 플레이어, Calendly, 채팅 위젯 | 사용되는 곳에서만 로드. 클릭 투 로드 또는 개인정보 보호 모드(youtube-nocookie) 선호. |
| 선택적 | 광고 픽셀, GA/GTM, PostHog, Hotjar, Clarity, HeyCatch, 세션 리플레이, 리타겟팅 | 방문자가 해당 카테고리에 옵트인할 때까지 로드, 가져오기 또는 초기화되어서는 안 됨. |
보고서 형식 (간결하고 증거 기반으로 유지):
동의 감사: <앱> (<url>), <날짜>
클릭 전: 선택적 트래커 <N>개 실행됨 -> 통과 / 실패
| 공급업체 | 시작 위치 (파일:줄 또는 호스트 설정) | 동의 전에 실행됨? | ID/URL 데이터 전송? | 클래스 | 최소 수정 사항 |
필수 서비스 (동의 없이 OK): ...
개인정보 고지: 있음/없음, 푸터에서 연결됨? 정확한 공급업체 목록?
선택 철회: 지속적인 "개인정보 선택" 링크가 있습니까?
Global Privacy Control 준수: 예/아니오/테스트되지 않음
게시 시 함께 릴리스될 게시되지 않은 변경 사항: ...
확인되지 않음: ...
법적 조언이 아닙니다. 광고를 운영하거나, 캘리포니아/유럽 방문자에게 서비스를 제공하거나, 비디오 페이지에 픽셀을 배치하는 경우 변호사가 검토하도록 하십시오.
그런 다음 consent-gate를 제공하여 수정 사항을 적용하십시오. 트래커가 가치를 창출하지 못한다면 게이팅보다 제거를 권장하십시오: 어떤 트래커도 가장 저렴한 규정 준수는 아닙니다(실제 감사에서는 사용하지 않는 분석 도구를 제거하는 것이 전체 수정 사항인 경우가 많았습니다).
실제 감사에서 얻은 주의 사항
- 앱의 진입 파일(
src/main.tsx)에서 시작된 분석은 모든 방문자의 모든 페이지에서 동의 확인 없이 실행되었으며, 로그인 코드는 로그인할 때마다 로그인한 고객의 이메일과 사용자 ID를 분석 도구로 전송했습니다. 도구가 쿼리 문자열을 제거할 수 없어 완전히 제거되었습니다. - **Lovable의 방문자 분석(Visitor analytics)**은 기본적으로 켜져 있으며 호스트에 의해 주입됩니다. 코드에 나타나지 않습니다.
- 게시는 모든 게시되지 않은 변경 사항을 릴리스합니다. 개인정보 수정 사항을 게시하기 전에 함께 출시될 이전의 게시되지 않은 변경 사항(로그인 도우미, 종속성 업데이트, 결제 수정)을 나열하고 소유자의 승인을 받으십시오.
- 분석을 끄는 것은 데이터 캡처를 끄는 것과 같지 않습니다. 앱 자체 데이터베이스(학생 작업, 진행 상황, 메시지)는 1자 데이터이며 별개입니다. 소유자가 걱정하기 때문에 명시적으로 말하십시오.
- 비디오 페이지 + Meta 픽셀은 또 다른 연방 위험(Video Privacy Protection Act)을 추가합니다. 수업 비디오가 있는 코스 사이트는 해당 페이지의 모든 픽셀을 우선 순위로 처리해야 합니다.