
브라우저 개인정보 유출 탐지기 — 8가지 탐지 모듈, 위험 점수 산정, 계정별 기록을 모두 브라우저 안에서 제공합니다.
브라우저 개인정보 유출 탐지기 — 8가지 탐지 모듈, 위험 점수 평가, 그리고 계정별 기록을 모두 브라우저 안에서 제공합니다.
Verdent로 제작 — 에이전트형 코딩 어시스턴트. 모든 탐지 모듈, 분석 대시보드, API 키 인증 흐름, 이중 언어 UI, 쿠버네티스 대응 Docker 이미지는 모두 Verdent가 주도한 페어 프로그래밍 세션에서 설계 및 구현되었습니다.
URL을 열고 모두 실행을 클릭하면 몇 초 안에 Leakish는 브라우저가
당신과 당신의 네트워크에 대해 무엇을 유출하는지 알려줍니다 — WebRTC, 핑거프린팅
API, DNS, 서버 측 프로브를 통해. 8개의 독립 모듈 각각은 타입화된
결과 + 위험 신호, 종합 점수(0–100), 그리고 등급(safe / warning / critical)
을 생성합니다.
로그인한 사용자는 스캔을 MySQL에 저장하고, 기록을 탐색하며, 분포 차트,
핑거프린트 해시 반복, IP / ASN 타임라인, 이상치 스캔, 쌍별 비교를 보여주는
분석 대시보드를 열 수 있습니다. 그 외의 모든 기능(탐지기 자체)은 계정 없이도
작동합니다 — 누구나 /app에 접속하여 스캔을 실행할 수 있습니다.
각 모듈은 단일 타입화된 DetectionModule<T> 인터페이스를 통해 등록되며
격리되어 실행됩니다 — 하나의 모듈에서 예외가 발생해도 다른 모듈에는 영향을
미치지 않습니다. 모듈별 활성화 상태는 버전 키와 함께 localStorage에 저장되어
새로고침 후에도 유지되며, 모두 실행 버튼은 활성화된 모듈 집합만 실행합니다.
/api/detect/network를 호출할 때, (c) DNS 모듈이
https://dns.google/resolve와 통신할 때만 관여합니다.leakish.locale
쿠키에 저장되며 <html lang>, 페이지 메타데이터, 모든 화면, 모든 API 오류
응답, 매직 링크 로그인 이메일을 제어합니다.det_… API 키를
발급할 수 있습니다(SHA-256으로 저장, 평문은 한 번만 표시). 모든
/api/detect/* 엔드포인트는 세션 쿠키 또는 Bearer 키를 허용하므로
CLI / CI 작업에서도 동일한 스캔을 저장할 수 있습니다./scans/analytics의 분석 대시보드 — 시간대 / 플랫폼 / 언어 / 화면 / WebGL /
ASN / 국가 / 글꼴 수 분포 차트, 종류별 위험 등급이 포함된 핑거프린트 해시
반복, IP / ASN 타임라인, 다축 이상치 탐지기, 0–100 유사도 점수의 쌍별 비교.lib/risk/assess.ts는 안정적인 ID(예:
webrtc.public-ip-leak)를 가진 타입화된 RiskSignal을 생성하고, 모듈별
요약과 단일 종합 점수를 제공합니다. 주입을 통해 로케일을 인식합니다.사전 요구 사항: Node 22+(로컬 개발에는 20+이면 충분), Yarn 1.x, 실행 중인 MySQL 인스턴스, (선택 사항) Google OAuth 클라이언트.
yarn install
cp env.example .env.local # fill in DATABASE_URL, NEXTAUTH_SECRET, IP_HASH_SALT at minimum
yarn prisma:generate
yarn db:push # provision tables on a fresh DB
yarn dev # http://localhost:3000
로그인이 동작하기 위한 최소 환경 변수:
DATABASE_URL — 예: mysql://root:[email protected]:3306/detectNEXTAUTH_SECRET — openssl rand -base64 32NEXTAUTH_URL — 개발 환경에서는 http://localhost:3000IP_HASH_SALT — openssl rand -base64 32선택 사항:
GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRET — Google 로그인용MAILGUN_API_KEY / MAILGUN_DOMAIN / EMAIL_FROM — 실제 매직 링크 전송용
(이 값이 없으면 링크가 개발 서버 콘솔에 출력됩니다)IPINFO_TOKEN — 네트워크 프로브에 ASN / VPN / 프록시 데이터를 추가하기 위한 토큰전체 주석 목록은 env.example을 참조하세요.
app/
├── (marketing)/ # / — Landing (server-resolved auth state + client UI)
├── app/ # /app — the detector page
├── login/ # /login
├── scans/ # /scans, /scans/[id], /scans/analytics
├── integrations/ # /integrations — API key management
├── api/
│ ├── auth/ # NextAuth route + apiKey-login + tests
│ ├── detect/
│ │ ├── analytics/ # aggregate + pairwise-diff
│ │ ├── network/ # server-side egress probe
│ │ ├── scans/ # save / list / get / delete
│ │ └── uniqueness/ # how many users share this fingerprint hash
│ ├── integration/keys # create / revoke / list API keys
│ └── health/ # liveness probe for k8s
├── opengraph-image.tsx # dynamic OG (per-locale)
├── apple-icon.tsx # dynamic apple-touch icon
├── icon.svg # shield gradient
└── layout.tsx # metadata + theme-init script + LocaleProvider
components/
├── modular-detector.tsx # top-level shell (header + module list + result/overview)
├── detector/ # module-list, result-panel, category filter, state hook
├── result-details/ # one detail view per module (typed switch)
├── overview/ # overview panel + diagnostics export
├── auth/ # AuthGateProvider, login dialog, login form
├── providers/ # SessionProvider wrapper
└── ui/ # shadcn-style primitives + theme/locale toggles
lib/
├── detection-modules/ # 8 module impls + ModuleManager + IP utils + tests
├── risk/ # assess.ts — RiskSignal/score aggregation
├── i18n/ # en.ts / zh.ts + Messages type + locale client/server
├── api/ # withDetectAuth wrapper, scan-payload Zod schema
├── client/ # browser-side scan-api (extractFingerprintInputs, saveScan, lookupUniqueness)
├── server/ # network-probe, IP-hash salt, fingerprint hashing, rate-limit, send-email, analytics
├── persistence/ # SSR-safe localStorage wrappers
├── env.ts # runtime env validation
├── logger.ts # dev-only diagnostic logger
└── prisma.ts # singleton client targeted at .prisma/detect-client
prisma/schema.prisma # User / Account / Session / DetectScan / ApiKey / DetectFingerprintHash
/app에서 모두 실행을 클릭합니다. 탐지기는
ModuleManager.runAllEnabledModules를 통해 활성화된 모듈을 순회합니다 —
각 모듈의 실패는 포착되어 격리되므로 다른 결과는 계속 표시됩니다.DetectionResult<T>(success | failure 태그와
모듈별 data 포함)를 반환합니다. 결과 패널은 타입 안전한 switch를 통해
모듈별 상세 컴포넌트를 렌더링합니다.lib/risk/assess.ts는 각 결과를 순회하며 안정적인 ID를 가진 RiskSignal을
생성하고 OverallAssessment(점수 + 등급 + 개수)를 산출합니다./api/detect/scans에
POST합니다. 서버는 Zod로 검증하고, 서버 관측 IP / ASN / VPN 플래그를
기록하기 위해 자체 네트워크 프로브를 실행하며, DetectScan 행과
DetectFingerprintHash 행을 작성합니다.단위 테스트는 대상 코드와 함께 __tests__/ 디렉터리에 있습니다:
yarn test # full suite
yarn test path/to/file # single file
yarn test -t "name pattern" # by test-name regex
주요 테스트:
lib/detection-modules/__tests__/ — IP 분류 + mDNS 추출, 모듈 매니저 등록 및
실패 격리, WebRTC 모듈용 모의 RTCPeerConnection, browser-fingerprint 모듈의
jsdom 형태 테스트, CDP/자동화 신호 생성.lib/server/__tests__/analytics.test.ts — 분포 버케팅, 반복 그룹화,
이상치 점수화, 쌍별 유사도 계산.app/api/detect/scans/__tests__ — POST 저장(검증, 속도 제한, 멱등성, 정리) +
GET 목록 + DELETE 단일.app/api/integration/keys/__tests__ — 모드 게이팅을 포함한 생성 / 폐기 / 목록
(API 키 세션은 다른 API 키를 발급할 수 없음).app/api/auth/__tests__ — apiKey-login 라우트 (CSRF, 형식 검사, 폐기 / 만료
처리, 마지막 사용 시각 갱신).Lint + 타입 검사:
yarn lint
npx tsc --noEmit
포함된 Dockerfile은 node:22-alpine에서 Next.js standalone 이미지를
생성합니다. 프로덕션 환경 변수는 Kubernetes Secret을 통해 주입됩니다 —
플레이스홀더 값이 빌드 시점에 포함되므로 런타임에 SKIP_ENV_VALIDATION이
필요 없습니다. prisma db push Job이 롤아웃 전에 스키마를 실행합니다.
전체 이미지 빌드 → 마이그레이션 → 롤아웃 파이프라인은
.github/workflows/deploy-tke.yml을 참조하세요.
이 오픈소스 빌드에는 페이월이 없습니다. 저장은 오직
lib/server/rate-limit.ts의 프로세스 내 사용자별 속도 제한기(시간당 10회 저장)에
의해서만 제어되며, 기록 보존에는 제한이 없습니다.
LICENSE를 참조하세요.
| ID | 모듈 | 검사 내용 |
|---|
network-probe | 네트워크 이그레스 프로브 | 서버가 관측한 공인 IP, ASN, 국가/지역/도시, VPN/프록시/Tor/호스팅 플래그, TLS/HTTP |
webrtc | WebRTC | STUN을 통한 공인 IPv4 + IPv6, RFC1918 유출, mDNS로 난독화된 .local 후보 |
browser-fingerprint | 브라우저 핑거프린트 | UA, 화면, 시간대, 플러그인, CPU 코어, 기기 메모리, 언어 목록, DNT, 쿠키 |
canvas-fingerprint | Canvas / WebGL | 2D + WebGL 렌더러/벤더 문자열, 텍스트 렌더링 특이점, 지원 이미지 형식 |
audio-fingerprint | 오디오 | AudioContext 샘플레이트, 채널, 지연 시간, 오실레이터 출력 해시 |
font-detection | 글꼴 | Canvas 너비 차이 감지를 통한 40개 이상의 명명된 글꼴 프로브 |
dns | DNS | DoH 연결 가능성, DNSSEC 신호, 리졸버 지리 정보, DNS 유출 휴리스틱 |
cdp-detection | 자동화 / 헤드리스 | navigator.webdriver, CDP 타이밍, Chromium 전용 API 표면, 포트 프로브 — 신뢰도 0–1 |
MessagesPOST /api/detect/scans는
Idempotency-Key 헤더를 허용하고, 사용자당 200개 스캔으로 제한하며,
저장을 시간당 10회로 속도 제한합니다.node:22-alpine 기반 멀티스테이지 빌드,
Next.js standalone 출력, .github/workflows/ 아래 워크플로를 통해
Kubernetes에 배포.| 경로 | 용도 |
|---|
/ | 마케팅 랜딩 (오로라 히어로, 기능 카드, FAQ, CTA) |
/app | 탐지기 — 모듈 목록 + 결과 패널 + 개요 |
/login | 독립형 로그인 페이지 (Google / 이메일 / API 키) |
/scans | 로그인한 사용자의 저장된 스캔 기록 |
/scans/[id] | 단일 저장 스캔 상세 |
/scans/analytics | 분포 / 반복 / 타임라인 / 이상치 / 비교 |
/integrations | det_… API 키 관리 (생성 / 폐기 / 사용 방법) |
/scans/[id]에서 볼 수 있으며, 분석 집계에 기여하고
고유성 조회에 반영됩니다.| 계층 | 구성 요소 |
|---|
| 프레임워크 | Next.js 14 (App Router, 전역 force-dynamic), React 18 |
| 언어 | TypeScript 5, 엄격 모드 |
| UI | Tailwind CSS 3, Radix 기반 shadcn/ui 프리미티브, Lucide 아이콘, Framer Motion |
| 인증 | NextAuth 4 (Google OAuth + 매직 링크 이메일) + Prisma 어댑터 |
| 데이터 | Prisma 6 → MySQL (.prisma/detect-client의 사용자 지정 클라이언트 출력) |
| 검증 | Zod |
| 테스트 | Jest 29 + ts-jest + jsdom |
| 빌드 / 배포 | 멀티스테이지 Dockerfile, Next.js standalone, Kubernetes 매니페스트 |