TRENDSHIFT · 2026.06.11

maigret 딥다이브
— 사용자명 하나로 3,000개 사이트를 동시에 훑는 OSINT 엔진의 설계

maigret"사용자명(username) 하나만" 입력하면, 3,000개 이상의 웹사이트에 그 이름의 계정이 있는지를 비동기로 동시 점검하고, 발견한 프로필 페이지에서 정보를 긁어 한 편의 보고서(HTML·PDF·CSV·JSON·그래프)로 묶어 주는 파이썬 OSINT 도구다. 유명한 선배 sherlock의 정신적 후계자이면서, 사이트 시그니처 DB·오탐(false positive) 처리·재귀 검색·자동 DB 업데이트까지 갖춰 한 단계 더 나아갔다. (저장소: soxoj/maigret · Python 3.10+ · MIT 라이선스 · GitHub 스타 31k+ · 누적 1,369 커밋)

이 문서는 "OSINT 도구의 아키텍처에서 무엇을 배울 수 있는가"에 초점을 둔 방어·교육용 해설이다. 특정 실존 인물을 추적·신상털이하는 운영 지침이 아니며, 본문 끝과 §7에 법적·윤리적 사용 주의를 명시한다.
목차
  1. 프로젝트 한줄 요약
  2. 왜 주목받는가
  3. 기술 스택 전체 지도
  4. 아키텍처 심화 분석
  5. 디렉토리 구조 해부
  6. 학습 포인트 (기술별)
  7. 시스템 / 환경 요구사항
  8. 직접 해볼 수 있는 실습 과제
  9. 관련 기술 심화 학습 로드맵
  10. 핵심 키워드 사전
  11. 참고 링크

1프로젝트 한줄 요약

이 레포가 무엇을 하는 물건인가.

핵심 메시지

"사람이 사이트를 하나씩 열어 확인하던 일을,
3,000개 사이트에 대해 비동기로 한꺼번에 자동화한 것."

당신이 어떤 닉네임 johndoe가 트위터·깃허브·레딧 등에 있는지 알고 싶다면, 보통은 각 사이트를 직접 열어 site.com/johndoe를 쳐 봐야 한다. maigret은 이 "URL 조립 → 요청 → 페이지가 '있다/없다'를 판정" 과정을 사이트마다 어떻게 판정해야 하는지를 적은 거대한 JSON DBasyncio 기반 동시 실행 엔진으로 자동화한다.

핵심은 단순한 "URL을 1초마다 두드리기"가 아니다. 사이트마다 "계정이 없을 때 어떻게 반응하는가"가 전부 달라서(404를 주거나, 200에 '없음' 문구를 주거나, 다른 URL로 리다이렉트하거나), maigret은 그 사이트별 시그니처를 데이터로 들고 있다.

maigret사용자명 열거(username enumeration) 계열의 OSINT 도구다. API 키가 전혀 필요 없고, 매 실행마다 GitHub에서 최신 사이트 DB를 자동으로 받아(24시간마다 1회) 쓰며, 오프라인이면 내장 DB로 폴백한다. 발견한 사용자명을 씨앗 삼아 재귀 검색까지 수행하고, 결과를 PDF·HTML·CSV·JSON(ndjson)·XMind·D3 그래프로 내보낸다. 기본 실행은 트래픽 상위 500개 사이트만 점검하고, -a를 붙이면 전체를 훑는다.

용어
OSINT (Open-Source Intelligence)
공개된(공개 웹·SNS·등록부 등) 정보만으로 분석을 수행하는 정보 수집 분야. maigret은 그중 "같은 닉네임이 여러 플랫폼에 재사용되는 경향"을 이용한다. 이 기법은 보안 평가·계정 탈취 대응·자기 디지털 발자국 점검에 쓰이며, 동시에 오남용 위험이 커 법적·윤리적 경계가 핵심인 영역이다.
용어
사용자명 열거 (username enumeration)
"이 사이트에 이 사용자명이 존재하는가?"를 외부에서 판정하는 기법. 사이트가 존재 여부에 따라 다른 응답(HTTP 코드·본문 문구·리다이렉트)을 주는 차이를 이용한다. maigret의 심장부가 바로 이 판정 로직을 사이트별로 데이터화한 것이다.

2왜 주목받는가

트렌딩 이유 · sherlock 등 경쟁 대비 장점.

username OSINT 도구의 원조는 sherlock이다. maigret이 꾸준히 스타를 모으는 이유는, sherlock이 멈춘 지점에서 "실전에서 진짜 골치 아픈 부분"을 풀었기 때문이다. 첫째 압도적 사이트 수(3,000+)와 자동 갱신 DB, 둘째 오탐을 줄이는 정교한 판정·에러 시그니처, 셋째 프로필에서 추가 정보를 긁어 재귀로 파고드는 능력, 넷째 다양한 리포트 포맷과 웹 UI다.

비교 항목sherlock (원조)maigret
점검 사이트 수약 400개대3,000+(기본 상위 500, -a로 전체)
사이트 DB 갱신레포 업데이트에 의존실행 시 GitHub에서 자동 갱신(24h, 오프라인 폴백)
판정 방식주로 상태코드 / 문구상태코드·문구·리다이렉트 + 에러 시그니처로 오탐 억제
정보 추출"있다/없다"만프로필에서 ID·이름·링크 추출(socid_extractor)
재귀 검색없음발견한 username·ID로 꼬리 물기 검색
리포트txt / csvHTML·PDF·CSV·JSON·XMind·D3 그래프 + 웹 UI
차단 우회제한적프록시·Tor·I2P·FlareSolverr 연동(Cloudflare)
기존 방식의 한계
"단순 무차별 요청"의 두 가지 함정 — 오탐과 차단

모든 사이트에 똑같이 "404면 없음, 200이면 있음"을 적용하면 망한다. 어떤 사이트는 없는 계정에도 200을 주면서 본문에만 'not found'를 넣고, 어떤 곳은 존재하는 계정을 다른 URL로 리다이렉트하며, 또 어떤 곳은 점검 자체를 WAF·CAPTCHA·Cloudflare로 막는다. 단순 도구는 이 차이를 무시해 거짓 양성(false positive)을 쏟아내고, 곧 IP가 차단된다.

maigret의 해결
"판정 로직을 코드가 아니라 데이터로" + 동시성 제어

maigret은 사이트별 판정 규칙을 data.json 시그니처 DB로 외부화했다. 새 사이트 추가가 코드 수정이 아니라 데이터 한 줄 추가로 끝나고, 커뮤니티가 규칙을 손쉽게 기여한다. 거기에 asyncio 큐 + 세마포어로 동시성을 조절하고, 공급자(사이트) 응답에 맞춰 타임아웃·재시도·프록시를 다뤄 차단을 줄인다. "넓게, 그러나 정확하게"가 설계 철학이다.

3기술 스택 전체 지도

백엔드(엔진)·프론트엔드(리포트/웹UI)·인프라 각각.

① 핵심 엔진 (백엔드) — 비동기 네트워크 I/O

maigret은 100% 파이썬이며(코드의 79%), 사이트 점검은 본질적으로 I/O 바운드(네트워크 대기가 대부분) 작업이라 asyncio + aiohttp로 짜였다. CPU가 아니라 "수천 개의 HTTP 요청을 동시에 기다리는" 문제이기 때문이다.

요소역할
Python 3.10+전체 언어. 타입힌트·async/await 적극 사용.
asyncio동시성 런타임. 큐·세마포어·wait_for 타임아웃·as_completed.
aiohttp비동기 HTTP 클라이언트. ClientSession·TCPConnector로 커넥션 풀 관리.
aiodns비동기 DNS 해석. 수천 호스트 조회를 막히지 않게.
python-socksSOCKS/HTTP 프록시 — Tor·I2P·일반 프록시 라우팅.
socid_extractor같은 저자(soxoj)의 자매 라이브러리. 프로필 페이지/HTML에서 실명·ID·타 계정 링크 추출.
alive-progress터미널 진행 막대(수천 작업의 완료율 표시).

② 리포트 & 프론트엔드

요소역할
Jinja 템플릿HTML 리포트 생성(코드의 18%가 HTML — 리포트 템플릿).
PDF 백엔드pip install 'maigret[pdf]' 선택 설치. 시스템 그래픽 라이브러리 필요.
D3.js 그래프--graph — 발견 계정 간 관계를 인터랙티브 노드 그래프로.
XMind / CSV / JSON마인드맵·표·기계 판독용(ndjson·simple) 내보내기.
웹 UI (Flask류)maigret --web 5000 — 브라우저에서 검색·그래프·리포트 다운로드.

③ 인프라 · 배포 · 데이터

요소역할
패키징pyproject.toml + Poetry(poetry.lock). PyPI 배포(pip install maigret).
Docker두 이미지: soxoj/maigret:latest(CLI)·soxoj/maigret:web(웹UI). 멀티스테이지 빌드.
WindowsPyInstaller로 maigret_standalone.exe 단일 실행 파일.
사이트 DBmaigret/resources/data.json — 3,000+ 사이트 시그니처. 실행 시 GitHub에서 자동 갱신.
차단 우회FlareSolverr(별도 도커) 연동 → Cloudflare JS 챌린지 해결(실험적).
AI 요약--ai — 결과를 OpenAI 호환 API로 보내 중립적 조사 요약 생성(선택).
용어
I/O 바운드 (I/O-bound)
작업 시간의 대부분을 CPU 계산이 아니라 외부 응답 대기(네트워크·디스크)에 쓰는 작업. 이런 문제는 스레드/프로세스를 늘리기보다 asyncio처럼 "기다리는 동안 다른 일을 하는" 협력적 동시성이 훨씬 효율적이다. maigret이 수천 사이트를 빠르게 훑는 비결.

4아키텍처 심화 분석

사용자명 → 비동기 점검 → 판정 → 리포트, 그리고 오탐 처리.

전체 흐름 한눈에

입력은 사용자명 1개. 엔진은 사이트 DB를 읽어 각 사이트마다 점검 작업(coroutine)을 만들고, 이걸 큐에 넣어 일정 수의 워커가 동시에 처리한다. 각 작업은 URL을 조립해 HTTP 요청을 던지고, 응답을 사이트별 판정 규칙에 통과시켜 CLAIMED/AVAILABLE/UNKNOWN/ILLEGAL 중 하나로 분류한다. CLAIMED면 프로필을 긁어 추가 ID를 뽑고, 그게 새 검색의 씨앗이 된다(재귀). 마지막에 리포터가 모아 보고서를 만든다.

사용자명 1개 (예: "johndoe") │ ┌───────────────▼────────────────┐ │ 사이트 DB 로드 (data.json) │ │ GitHub 자동 갱신 24h / 오프라인 폴백 │ │ 태그·랭크로 점검 대상 필터(-a/--tags) │ └───────────────┬────────────────┘ │ 사이트마다 점검 코루틴 1개 생성 ══════════ asyncio 동시 실행 엔진 ══════════ 작업 큐(asyncio.Queue) · 워커 N개(in_parallel) 각 작업: asyncio.wait_for(코루틴, timeout) ═══════════════════╤══════════════════════════ │ (각 워커가 1사이트씩) ┌──────────────┬──────┴──────┬──────────────┐ ▼ ▼ ▼ ▼ URL 조립 aiohttp 응답 수신 [판정 게이트] site.url.format GET/HEAD 요청 status/본문/URL ──┐ ({username}) (재시도·프록시) │ ▼ ┌───────────────── 사이트별 판정 규칙 ──────────────────┐ │ checkType = status_code → HTTP 200=있음 / 404=없음 │ │ checkType = message → 본문에 absenceStrs 있으면 없음 │ │ presenseStrs 있으면 있음 │ │ checkType = response_url → 리다이렉트 최종 URL로 판정 │ │ errors{} 매칭 → CAPTCHA/차단/레이트리밋이면 UNKNOWN │ └──────────────────────────┬───────────────────────────┘ ▼ CLAIMED · AVAILABLE · UNKNOWN · ILLEGAL │ ├─ CLAIMED → socid_extractor로 프로필에서 │ 실명·ID·타 계정 링크 추출 │ │ │ ▼ 새 username/ID = 다음 검색 씨앗 └──────────── 재귀 검색 (꼬리 물기) ──────────┐ │ (수렴할 때까지 반복) ─────────┘ │ ┌───────────────▼────────────────┐ │ 리포터: 결과 집계 + 내보내기 │ │ HTML · PDF · CSV · JSON · XMind │ │ D3 그래프 · (선택) --ai 요약 │ └─────────────────────────────────┘

판정 4상태 — 거짓 양성을 거르는 핵심

maigret의 신뢰성은 "있다/없다"를 이분법이 아니라 4상태로 본다는 데서 나온다. 소스의 MaigretCheckStatus 열거형이 바로 그것이다.

상태 (열거형)의미
CLAIMED계정이 존재(탐지됨). 프로필 추출·재귀의 대상.
AVAILABLE계정 없음(미탐지). 사용 가능한 이름.
UNKNOWN에러로 판정 불가 — 차단·CAPTCHA·타임아웃·DNS 실패 등. "없음"으로 오판하지 않고 따로 표시.
ILLEGAL이 사이트 규칙상 허용되지 않는 사용자명(애초에 점검 불가).
용어 · 사이트 시그니처 DB 스키마
checkType / presenseStrs / absenceStrs / errors
data.json의 각 사이트는 "어떻게 판정하는가"를 필드로 갖는다. checkType은 판정 방식(상태코드·본문문구·리다이렉트URL), presenseStrs는 "계정이 있을 때만 나타나는 문구", absenceStrs는 "없을 때 나타나는 문구", errors는 "이 문구가 보이면 차단/에러다(=UNKNOWN)"를 매핑한 사전이다. 즉 판정 로직이 코드가 아니라 데이터다.
사이트 시그니처 예시 (data.json 구조)
"ExampleSite": {
  "urlMain": "https://example.com/",
  "url": "https://example.com/{username}",
  "checkType": "message",
  "presenseStrs": ["\"profile\":", "data-user-id"],
  "absenceStrs": ["User not found", "page-404"],
  "errors": { "Captcha required": "CAPTCHA detected",
              "Rate limit": "Too many requests" },
  "tags": ["us", "social"],
  "usernameClaimed": "blue",      // 자가검증용: 실제 존재 계정
  "usernameUnclaimed": "noonewouldeverusethis8675"
}

{username} 자리에 입력을 끼워 URL을 만들고, checkType대로 판정한다. usernameClaimed/usernameUnclaimed--self-check가 "이 규칙이 아직 살아 있는가"를 실제 사이트로 검증할 때 쓰는 알려진 정답쌍이다.

핵심 설계 패턴

패턴maigret에서의 구현
데이터 주도 설계판정 로직을 data.json으로 외부화. 새 사이트 = 데이터 추가(코드 무수정).
큐 기반 워커 풀asyncio.Queue + N개 워커. in_parallel로 동시성 상한 조절.
작업별 타임아웃asyncio.wait_for(task, timeout) — 느린 사이트가 전체를 막지 못하게.
생성기 스트리밍큐 실행기가 결과를 yield로 흘려보내, 끝나는 대로 즉시 처리.
에러 분류DNS 실패·연결거부·차단을 구분(error_detection.py). "병렬 줄여라" vs "DNS 확인해라" 다른 조언.
공유 엔진(engine)같은 플랫폼을 쓰는 사이트군은 공통 engine 템플릿으로 규칙 재사용.
재귀 + 추출CLAIMED → socid_extractor로 ID/링크 추출 → 새 씨앗 → 재검색.
비유 — 오탐 처리

maigret을 "3,000명의 안내원에게 동시에 전화 거는 콜센터 관리자"로 생각하자. 어떤 안내원(사이트)은 "그런 분 없습니다"라고 또박또박 말하고(404), 어떤 안내원은 "있긴 한데요…"라며 말끝을 흐리고(200+본문문구), 어떤 안내원은 통화 중이거나 "지금 바쁘니 나중에"라고 끊는다(차단·CAPTCHA). 단순 도구는 "끊겼으니 없는 거네"로 오판한다. maigret은 "끊김(UNKNOWN)"과 "없음(AVAILABLE)"을 절대 같게 취급하지 않는다 — 이것이 오탐을 줄이는 핵심이다.

5디렉토리 구조 해부

핵심 패키지 maigret/ 안에 엔진·DB·리포트가 모두 있다.

maigret/ ├── maigret/ ★ 핵심 패키지 (파이썬 소스, ≈7,000 LOC) │ ├── checking.py ★ 점검 엔진 본체 (≈1,644줄) — 사이트별 판정·요청·에러분류 │ ├── maigret.py 메인 오케스트레이션 (≈1,101줄) — 검색 흐름·재귀 조율 │ ├── sites.py ★ MaigretSite / MaigretDatabase (≈728줄) — DB 모델·로드 │ ├── report.py 리포트 생성 (≈726줄) — HTML/PDF/CSV/JSON/그래프 │ ├── submit.py 새 사이트 규칙 추가·자가검증(submit) 도우미 │ ├── executors.py ★ 비동기 실행기들 (큐·세마포어·진행막대) │ ├── result.py MaigretCheckResult / MaigretCheckStatus(4상태 열거형) │ ├── error_detection.py ErrorPageDetector — 에러/차단 페이지 식별 │ ├── errors.py CheckError 정의·에러 분류 테이블 │ ├── activation.py 토큰·쿠키가 필요한 사이트의 사전 활성화 │ ├── extractors.py socid_extractor 연동 (프로필 → ID/링크) │ ├── permutator.py --permute: 이름 조합 변형 생성 │ ├── db_updater.py 실행 시 GitHub에서 data.json 자동 갱신 │ ├── ai.py --ai: OpenAI 호환 API로 결과 요약 │ ├── notify.py 결과 출력·알림 포매팅 │ ├── settings.py settings.json 로드 (키·프록시·동시성 등) │ ├── types.py QueryOptions·QueryDraft 등 타입 │ ├── web/ 웹 UI (--web) — Flask류 + 템플릿 │ └── resources/ │ └── data.json ★★ 3,000+ 사이트 시그니처 DB (단일 진실원) ├── tests/ pytest 테스트 ├── utils/ │ └── update_site_data.py data.json → sites.md·메타데이터 재생성 ├── docs/ readthedocs 문서 ├── static/ 로고·예제 리포트(PDF/HTML 샘플) ├── Dockerfile 멀티스테이지(CLI / web 타깃) ├── pyproject.toml / poetry.lock Poetry 패키징 ├── sites.md 사람이 읽는 사이트 목록(자동 생성) ├── wizard.py 대화형 실행 마법사 └── README.md / TROUBLESHOOTING.md / CHANGELOG.md
읽는 순서 추천

result.py의 4상태 열거형으로 "무엇을 판정하나" 파악 → ② sites.py로 사이트 모델 구조 → ③ data.json 샘플 몇 개로 시그니처 실물 → ④ checking.py로 판정·요청·에러분류 → ⑤ executors.py로 동시성 패턴(큐·세마포어). 코드의 핵심 통찰은 거의 다 이 다섯 파일에 있다.

6학습 포인트 (기술별)

OSINT 도구 아키텍처에서 무엇을 배우나.

A. asyncio 동시성 — I/O 바운드의 정석

maigret은 "수천 개의 네트워크 요청을 어떻게 동시에, 그러나 폭주 없이 처리하나"의 살아 있는 교과서다. 핵심은 ① asyncio.Queue + 고정 워커 수로 동시성 상한을 두고, ② 작업마다 asyncio.wait_for(..., timeout)느린 사이트 격리, ③ as_completed/생성기로 끝나는 대로 스트리밍 처리. 무한정 gather로 다 던지면 커넥션 풀이 고갈되고 차단당한다 — 그래서 세마포어/큐로 조이는 것이 핵심.

실습: asyncio.Queue와 워커 5개로 "URL 리스트를 동시에 GET하되 동시 5개로 제한, 각 요청 3초 타임아웃"하는 40줄짜리 미니 크롤러를 직접 짜 보라. gather로만 짠 버전과 비교.

B. 데이터 주도 설계 — 로직을 데이터로 빼기

"사이트마다 다른 판정"을 if-else로 짰다면 3,000개 분기로 코드가 폭발했을 것이다. maigret은 그걸 data.json 스키마(checkType·presenseStrs·absenceStrs·errors)로 외부화했다. 덕분에 기여자가 코드를 몰라도 규칙을 추가하고, --self-check로 규칙의 생존을 자동 검증한다. "변하는 부분은 데이터로, 안 변하는 부분만 코드로"의 모범 사례다.

실습: 당신이 자주 쓰는 사이트 3곳의 "계정 있음/없음" 응답 차이를 직접 관찰해 maigret 스키마(checkType 등)로 시그니처 JSON을 적어 보라. 본인 계정으로만 확인할 것.

C. 견고한 판정 — 오탐과 "모름"의 분리

가장 배울 점은 "확실치 않으면 '없음'이 아니라 '모름(UNKNOWN)'"이라는 자세다. 차단·타임아웃·CAPTCHA를 "없음"으로 뭉개면 결과가 거짓이 된다. errors{} 매핑과 error_detection.py가 이 경계를 코드로 강제한다. 이는 OSINT뿐 아니라 모든 외부 시스템 점검(헬스체크·모니터링)에 그대로 옮길 수 있는 원칙이다.

실습: B에서 만든 미니 크롤러에 "응답에 'captcha'·'rate limit'이 보이면 결과를 FOUND/NOT_FOUND가 아니라 UNKNOWN으로 표시" 로직을 추가하라.

D. 리포트 파이프라인 — 같은 데이터, 여러 포맷

하나의 결과 모델(MaigretCheckResult)에서 HTML·PDF·CSV·JSON·그래프가 갈라져 나온다. "데이터 모델과 표현(렌더링)의 분리" 패턴이다. report.py를 읽으면 같은 결과 객체를 각 포맷별 직렬화기에 통과시키는 구조가 보인다.

실습: 임의의 결과 dict 하나를 (1) CSV (2) JSON (3) 간단한 HTML 표로 동시에 내보내는 함수 3개를 쓰고, 모두 같은 데이터 모델만 받도록 설계하라.

7시스템 / 환경 요구사항

설치는 가볍지만, '사용 권한'이 가장 중요한 요구사항이다.

항목요구사항
런타임Python 3.10 이상. pip install maigret 한 줄.
네트워크인터넷(사이트 점검·DB 자동 갱신). 오프라인이면 내장 DB로 동작.
PDF 리포트선택: pip install 'maigret[pdf]' + 시스템 그래픽 라이브러리.
차단 우회(선택)Tor/I2P 데몬 또는 프록시; Cloudflare는 FlareSolverr 도커.
AI 요약(선택)OPENAI_API_KEY 또는 OpenAI 호환 엔드포인트.
배포 옵션Docker(soxoj/maigret)·Windows 단일 exe·Cloud Shell·Colab.
사용 권한(필수)본인 계정·동의를 받은 대상·인가된 평가 범위에 한해서만. 이것이 가장 중요한 "요구사항"이다.
법적 · 윤리적 사용 주의 (반드시 읽을 것)
이 도구는 "타인 신상털이 도구"가 아니다 — 책임 있는 보안 연구의 선

maigret의 공식 README도 못 박는다 — "For educational and lawful purposes only." 같은 닉네임이 여러 사이트에 존재한다는 사실이 곧 "동일인"을 뜻하지 않으며(동명이인·우연), 공개 정보라도 이를 결합해 특정 개인을 식별·추적하는 행위는 다수 국가에서 법으로 규제된다.

허용되는 사용: ① 본인의 디지털 발자국 점검(내 닉네임이 어디 노출됐나), ② 명시적 서면 동의·계약 범위가 있는 인가된 침투/OSINT 평가, ③ 위협 인텔리전스·계정 탈취 대응 등 정당한 보안 업무.

금지되는 사용: 동의 없는 특정 개인 추적·신상털이(doxxing)·스토킹·괴롭힘·차별. 한국 개인정보보호법, EU GDPR, 미국 CCPA 등 관할지 법률을 반드시 준수해야 하며, 위반 책임은 전적으로 사용자에게 있다(저자는 오남용에 책임지지 않음). 이 문서는 아키텍처 학습용이며, 실존 인물을 대상으로 한 운영 절차를 제공하지 않는다.

8직접 해볼 수 있는 실습 과제

난이도별 5단계 — 모두 본인 계정 / 허가된 대상으로만 안전하게.

과제 1 난이도 ★☆☆☆☆

내 디지털 발자국 점검 (자기 대상)

본인이 쓰는 닉네임으로 maigret 내닉네임 --html을 돌려, 내가 어디에 계정을 남겼는지 HTML 리포트로 확인한다. 잊고 있던 노출을 찾아 정리(비공개 전환·삭제)하는 것이 목적. 타인 닉네임은 입력하지 말 것.

과제 2 난이도 ★★☆☆☆

4상태 판정 직접 읽기

result.pyMaigretCheckStatuschecking.py의 판정 분기를 읽고, "왜 UNKNOWN을 AVAILABLE과 분리하는가"를 한 문단으로 설명해 본다. 그다음 본인 계정 점검 결과에서 UNKNOWN이 뜬 사이트를 골라 왜 모름인지(차단·타임아웃 등) 로그로 확인.

과제 3 난이도 ★★★☆☆

사이트 시그니처 한 개 작성 + self-check

당신이 계정을 가진 사이트 하나에 대해 data.json 스키마(checkType·presenseStrs·absenceStrs·errors·usernameClaimed/Unclaimed)로 시그니처를 작성하고, --self-check로 규칙이 실제로 맞는지 검증한다. usernameClaimed는 본인 계정으로 둘 것.

과제 4 난이도 ★★★★☆

미니 username 체커 만들기 (안전 버전)

asyncio + aiohttp로, 당신이 직접 정의한 3~5개 사이트 시그니처에 대해서만 점검하는 50~80줄짜리 미니 maigret을 만든다. 큐+세마포어로 동시성 제한, 작업별 타임아웃, captcha/rate-limit 시 UNKNOWN 처리를 모두 넣는다. 점검 대상은 본인 계정 닉네임만.

과제 5 난이도 ★★★★★

라이브러리 임베드 + 결과 모델 분석

maigret을 파이썬 라이브러리로 import해(공식 library-usage 가이드 참조) 본인 닉네임에 대해 비동기 검색을 호출하고, 반환된 MaigretCheckResult 객체에서 status·query_time·ids_data를 직접 꺼내 본다. 그 데이터로 CSV·JSON·간단 HTML 표를 각각 내보내며 "데이터 모델 ↔ 표현 분리"를 체감한다.

9관련 기술 심화 학습 로드맵

6주 코스 — asyncio 기초부터 OSINT 도구 설계까지.

주차주제실습 · 참고
1주차asyncio / aiohttp 기초 — 코루틴·이벤트 루프·gather공식 asyncio 문서 · 미니 동시 크롤러(과제 4 전 단계)
2주차동시성 제어 — 큐·세마포어·타임아웃·백프레셔executors.py 정독 · 워커 풀 직접 구현
3주차데이터 주도 설계 — 로직을 스키마로 외부화data.json 스키마 분석 · sites.py 모델
4주차견고한 외부 점검 — 4상태 판정·에러 분류checking.py·error_detection.py · UNKNOWN 처리
5주차스크래핑·추출 윤리 — robots·레이트리밋·프록시·차단 대응socid_extractor · TROUBLESHOOTING.md · 법규 학습
6주차리포트 파이프라인 — 모델/표현 분리, 다포맷 내보내기report.py · D3 그래프 · 미니 리포터 구현

10핵심 키워드 사전

본문·소스에 나온 용어 빠른 참조.

용어의미
OSINT공개 출처 정보 수집·분석. maigret은 username 재사용 단서를 활용.
username enumeration"이 사이트에 이 사용자명이 존재하는가"를 외부에서 판정하는 기법.
data.json (사이트 DB)3,000+ 사이트의 판정 시그니처 모음. maigret의 단일 진실원.
checkType판정 방식: status_code·message(본문 문구)·response_url(리다이렉트).
presenseStrs / absenceStrs계정이 있을 때 / 없을 때만 페이지에 나타나는 표식 문자열.
errors{}"이 문구가 보이면 차단/에러(UNKNOWN)"를 매핑한 사전.
MaigretCheckStatus판정 4상태: CLAIMED·AVAILABLE·UNKNOWN·ILLEGAL.
UNKNOWN차단·CAPTCHA·타임아웃 등으로 판정 불가. "없음"과 절대 구분.
asyncio / aiohttp비동기 동시성 런타임 / 비동기 HTTP 클라이언트. I/O 바운드의 정석.
in_parallel동시 워커 수(동시성 상한). 너무 크면 차단·풀 고갈 위험.
self-checkusernameClaimed/Unclaimed 정답쌍으로 사이트 규칙 생존을 자동 검증.
재귀 검색 (recursive)발견 계정에서 추출한 새 username·ID로 다시 검색하는 꼬리 물기.
socid_extractor프로필/HTML에서 실명·ID·타 계정 링크를 뽑는 자매 라이브러리.
FlareSolverrCloudflare JS 챌린지를 실제 브라우저로 풀어 주는 별도 도커 서비스.
sherlockusername OSINT의 원조 도구. maigret의 정신적 전신.

11참고 링크