Step 170. OSINT 입문 — 소셜미디어 수집과 디지털 발자국
Level 2 — 보안 입문과 공격 스킬 기초 | 난이도 ★★☆☆☆ | 예상 소요 시간 2시간 30분
전제: Step 73(HTTP)의 웹 기초, Step 48(정규표현식)의 패턴 감각. 파이썬으로 파일을 읽을 수 있다.
- 준비물: 파이썬 3, 메모장, 여러분 자신의 아이디 목록(수집 대상은 오직 본인입니다).
- ⚠️ 이 챕터의 실습은 내 랩·합법 플랫폼 전용입니다. 허가 없는 시스템에 적용하면 범죄입니다.
- 윤리 고지: OSINT의 대상은 오직 여러분 자신입니다. 다른 사람을 조사하면 스토킹이 될 수 있고, 공개 정보라도 수집 목적과 방식에 따라 법에 걸립니다.
OSINT(Open Source Intelligence, 공개 출처 정보)는 "뚫지 않고도 알아내는 기술"입니다. 로그인 한 번 없이, 검색과 공개 페이지만으로 한 사람의 관심사·지역·활동 시간대가 그려집니다. 비밀은 사람들이 사이트마다 같은 아이디를 쓴다는 습관입니다 — 아이디 하나로 수십 개 사이트의 계정을 찾아내고, 조각을 이으면 신상에 가까운 그림이 나옵니다. 오늘은 이 기법의 원리를 배우되, 대상은 철저히 여러분 자신입니다. 내 정보가 얼마나 노출됐는지 아는 것이 프라이버시 방어의 시작입니다.
1. 학습 목표
이 챕터를 끝내면 다음을 할 수 있습니다:
- OSINT의 정의와 합법의 경계(공개 정보·목적·동의)를 설명한다
- 사용자명 상관관계(username correlation)의 원리를 시뮬레이션으로 보여 준다
- 검색 연산자(따옴표,
site:,filetype:)의 용도를 구분한다 - 파일 메타데이터가 왜 정보 노출 경로인지 실측으로 확인한다
- 자기 디지털 발자국 지도와 노출 축소 계획을 작성한다
2. 배경 지식 — 오늘의 도구와 개념
오늘의 도구 한눈에 보기
| 구분 | 내용 |
|---|---|
| 언어·환경 | 파이썬 3 (표준 라이브러리), 웹 브라우저(검색 연산자 연습용) |
| 오늘의 도구 | os.stat()(메타데이터), 검색 연산자, sherlock(개념 소개) |
| 필요한 개념 | OSINT, 사용자명 상관관계, 디지털 발자국, 메타데이터, 오탐(false positive) |
| 오늘의 산출물 | 내-발자국-지도.md + 노출 축소 계획 3가지 |
2-1. OSINT의 세 가지 수집 원칙
공격자든 방어자든 OSINT의 규칙은 같습니다.
① 공개된 것만 본다 — 로그인을 뚫거나, 비공개 설정을 우회하지 않는다
② 기록을 남긴다 — 언제, 어디서, 무엇을 봤는지 출처를 적는다
③ 목적을 갖는다 — "궁금해서"가 아니라 "무엇을 확인하려는가"가 먼저다
"공개돼 있으니까 아무거나 해도 된다"가 아닙니다. 공개 정보의 수집도 목적과 대상에 따라 법이 갈립니다. 그래서 이 챕터의 대상은 본인 한 명입니다 — 본인 조사는 목적도 방어(노출 축소)로 명확합니다.
2-2. 사용자명 상관관계 — 하나의 아이디, 수십 개의 얼굴
사람은 기억할 수 있는 아이디가 몇 개 없어서, 사이트가 바뀌어도 같은 아이디를 쓰는 경우가 많습니다. 수집가의 입장에서 아이디는 여러 사이트를 잇는 실입니다. 한 사이트에서 아이디를 얻으면, 다른 사이트에 같은 아이디가 있는지 확인해 프로필들을 한 사람으로 묶습니다.
이 과정을 자동화한 도구가 sherlock입니다 — 아이디 하나를 넣으면 수백 개 사이트의 프로필 주소 규칙에 대입해 존재 여부를 확인합니다. 원리는 단순합니다: 사이트마다 사이트주소/아이디 형태의 프로필 URL이 있고, 그 페이지가 존재하는지(HTTP 200인지) 물어볼 뿐입니다. 오늘은 외부 접속 없이 이 원리를 로컬 시뮬레이션으로 체험합니다.
2-3. 디지털 발자국 — 의도하지 않은 흔적
디지털 발자국(digital footprint)은 온라인 활동이 남긴 흔적의 총합입니다. 두 종류로 나눕니다.
- 능동적 발자국: 직접 올린 글, 사진, 프로필 소개
- 수동적 발자국: 의도하지 않게 남는 것 — 사진의 촬영 위치, 파일의 작성자 이름, 검색에 걸리는 옛 글
수동적 발자국의 대표가 메타데이터(metadata)입니다 — "데이터에 딸린 데이터". 사진 파일의 촬영 시각·기종·GPS 좌표(Exif), 문서 파일의 작성자·수정 시각 같은 것들입니다. 본문은 지웠는데 메타데이터가 남아 신원이 드러난 사건이 실제로 여러 번 있었습니다.
2-4. 검색 연산자 — 검색창을 조사 도구로
검색 엔진은 단순한 키워드 상자가 아닙니다. 연산자를 쓰면 수집 도구가 됩니다.
| 연산자 | 뜻 | 예 |
|---|---|---|
"정확한 문구" |
이 문자열 그대로만 | "my_nick_2024" |
site:도메인 |
그 사이트 안에서만 | site:github.com my_nick |
filetype:확장자 |
그 형식 파일만 | 김민서 filetype:pdf |
-단어 |
그 단어 제외 | my_nick -쇼핑 |
이 연산자들로 자기 이름·아이디를 검색해 보는 것이 오늘의 핵심 활동입니다. 무엇이 걸리는지가 곧 "남이 보는 나"입니다.
3. 따라 하기
3-1. 메타데이터 직접 보기 — 파일이 말해 주는 것
본문 말고 파일에 딸린 정보를 파이썬으로 읽어 봅니다.
입력:
import os, datetime
p = "note.txt"
with open(p, "w", encoding="utf-8") as f:
f.write("오늘의 실습 노트\n")
st = os.stat(p)
print("파일 크기:", st.st_size, "바이트")
print("수정 시각:", datetime.datetime.fromtimestamp(st.st_mtime))
print("생성 시각:", datetime.datetime.fromtimestamp(st.st_ctime), "(Windows 기준)")
출력 (2026-09-09 실측):
파일 크기: 25 바이트
수정 시각: 2026-09-09 16:50:38.790924
생성 시각: 2026-09-09 16:50:38.790924 (Windows 기준)
읽는 법: 내용은 한 줄인데 파일은 이미 세 가지를 말해 줍니다 — 언제 만들어졌고, 언제 고쳐졌고, 얼마나 큰지. 사진이라면 여기에 촬영 기종과 GPS 좌표(Exif)까지 붙습니다. 문서를 온라인에 올릴 때 메타데이터까지 같이 올라간다는 것 — 이것이 수동적 발자국의 실체입니다.
왜 하는가: "지우면 끝"이 아니라 "딸린 정보까지 관리해야 끝"이라는 감각을 몸에 배게 하는 실험입니다.
3-2. 사용자명 상관관계 시뮬레이션
sherlock의 원리를 외부 접속 없이 체험합니다. 가상의 사이트 등록부(전부 가공 데이터)에서 아이디 하나를 찾아 봅니다.
입력:
registry = {
"devhub.example": ["minseo_dev", "bluefox"],
"photo.site.example":["bluefox", "camera_jin"],
"game.pizza.example":["minseo_dev", "bluefox", "nightowl"],
"music.note.example":["bluefox7"], # 비슷하지만 다른 아이디
}
target = "bluefox"
hits = [site for site, users in registry.items() if target in users]
print("아이디 상관 조회:", target)
for h in hits:
print(" 발견:", h)
print("유사 아이디 주의:", [u for us in registry.values() for u in us
if u.startswith(target) and u != target])
출력 (2026-09-09 실측):
아이디 상관 조회: bluefox
발견: devhub.example
발견: photo.site.example
발견: game.pizza.example
유사 아이디 주의: ['bluefox7']
읽는 법: 아이디 하나로 세 사이트가 연결됐습니다. 실제 수집에서는 이렇게 묶인 프로필들에서 관심사(사진, 게임)와 활동 패턴이 읽힙니다. 그리고 마지막 줄이 중요합니다 — bluefox7은 비슷하지만 다른 사람일 수 있습니다. 자동 수집 도구의 결과는 반드시 눈으로 확인해야 합니다.
3-3. sherlock은 이렇게 생겼다 — 화면 예시
실제 sherlock은 수백 개 사이트에 같은 확인을 자동으로 합니다. 외부 조회가 필요하므로 화면 예시로 모양만 익힙니다.
화면 예시 (sherlock 아이디 실행 결과의 모양):
[*] Checking username bluefox on:
[+] GitHub: https://github.com/bluefox
[+] Reddit: https://www.reddit.com/user/bluefox
[-] Instagram: Not found!
[+] Steam: https://steamcommunity.com/id/bluefox
...
[*] Search completed with 47 results
읽는 법: [+]는 "그 주소의 페이지가 존재한다"는 뜻일 뿐, 그 사람의 계정이라는 뜻이 아닙니다. 다른 사람이 먼저 선점했을 수 있고(3-2의 bluefox7 문제), 사이트가 존재 여부를 속이는 경우(오탐)도 있습니다. 도구의 출력은 "확인 후보 목록"이지 "결론"이 아닙니다 — 반드시 하나씩 방문해 프로필 사진·활동이 일치하는지 대조합니다.
3-4. 검색 연산자로 자기 조사 — 화면 예시
브라우저 검색창에서 직접 해 보는 활동입니다. 본인 아이디와 이름으로 아래를 검색하고, 걸린 결과를 기록하세요.
"내아이디" ← 따옴표로 감싸 정확히 그 아이디만
site:github.com 내아이디 ← 특정 사이트 안의 흔적
내이름 filetype:pdf ← 공개 문서에 실명이 실렸는지
내아이디 -쇼핑 ← 노이즈 제외
화면 예시 (검색 결과 기록의 모양):
검색어: "bluefox"
- 5년 전 커뮤니티 글 3건 (닉네임·관심사 노출)
- 깃허브 저장소 1개 (이메일 주소가 커밋에 노출)
검색어: 본명 filetype:pdf
- 학교 행사 명단 PDF 1건 (실명·소속 노출)
읽는 법: 걸린 결과 하나하나가 "남이 알 수 있는 것"입니다. 특히 깃허브 커밋의 이메일, 옛 커뮤니티 글, 명단 PDF는 본인이 잊고 있어도 검색엔진은 기억합니다. 예시의 이름·사이트는 가공 데이터이며, 여러분의 결과는 실제 검색으로 직접 채우는 것이 미션입니다.
3-5. 발자국 지도 그리기
수집한 것을 한 장의 문서로 엮습니다. 틀은 이렇습니다.
# 내 디지털 발자국 지도 (작성일: ____)
### 노출된 것
| 항목 | 어디서 | 누가 볼 수 있나 | 위험도 |
|------|--------|----------------|--------|
| (예) 아이디-실명 연결 | 커뮤니티 글 | 전원 | 높음 |
### 노출 축소 계획
1. (예) 옛 커뮤니티 계정 삭제 또는 닉네임 변경
2. (예) 사이트별 아이디 분리 — 하나로 묶이지 않게
3. (예) 공개 문서의 실명 노출 건은 게시자에게 삭제 요청
읽는 법: 위험도의 기준은 "이 조각이 다른 조각과 이어지는가"입니다. 아이디 하나는 약하지만, 아이디 + 실명 + 지역이 이어지면 신상 그림이 됩니다. 축소 계획은 "이어지는 실을 끊는" 방향으로 씁니다.
4. 미션과 연습문제
미션 — 내 발자국 지도 1부 + 축소 조치 실행
- 3-4의 검색 연산자 네 가지를 본인 아이디·이름으로 실제 검색하고 결과를 기록합니다
- 3-5의 틀로
내-발자국-지도.md를 작성합니다 — 노출 항목 최소 3개 - 노출 축소 계획 중 하나는 오늘 실행합니다 (비공개 전환, 옛 글 삭제 등)
- 각 노출 항목에 "어디서 발견했는가"의 출처(검색어)를 반드시 답니다
- 다른 사람의 정보가 화면에 보이더라도 기록하지 않습니다 — 대상은 본인뿐입니다
연습문제
문제 1. OSINT에서 "공개 정보"만 본다는 원칙이 왜 법적 경계와 연결되는지 설명해 보세요.
문제 2. sherlock의 [+]가 "그 사람의 계정"을 뜻하지 않는 이유를 두 가지 들어 보세요.
문제 3. 능동적 발자국과 수동적 발자국의 차이를 메타데이터 예로 설명해 보세요.
문제 4. 노출 축소 계획이 "조각을 지우는 것"보다 "조각을 잇는 실을 끊는 것" 중심이어야 하는 이유를 말해 보세요.
5. 모범 답안과 완료 기준
미션 모범 답안
완성된 지도의 한 단락 예시입니다 (내용은 가공 예시 — 여러분의 실제 검색 결과로 채우세요):
### 노출된 것
| 항목 | 어디서 | 누가 볼 수 있나 | 위험도 |
|------|--------|----------------|--------|
| 아이디로 깃허브 계정 특정 | "내아이디" 검색 | 전원 | 중간 |
| 커밋에 개인 이메일 노출 | site:github.com 내아이디 | 전원 | 높음 |
| 5년 전 커뮤니티 글에 지역 힌트 | "내아이디" | 전원 | 중간 |
### 노출 축소 계획
1. 깃허브 커밋 이메일을 noreply 주소로 변경 — 오늘 실행함
2. 커뮤니티 계정 비공개 전환 — 이번 주 내
3. 앞으로 사이트별 아이디를 분리해 사용
검증하는 법: ① 모든 항목에 출처(검색어)가 있는가. ② 계획 중 하나를 실제로 실행했는가. ③ 타인 정보가 기록에 없는가. ④ 지도를 읽는 제3자가 "이 사람이 무엇을 왜 지우려는지" 이해할 수 있는가. 전부 ‘예’이면 완성입니다.
연습문제 해답
문제 1 해답. 법은 정보의 성격뿐 아니라 수집의 목적과 방식을 봅니다. 공개 정보라도 특정인을 추적할 목적으로 반복 수집하면 스토킹이 될 수 있고, 비공개 설정을 우회하는 순간 그 정보는 더는 "공개"가 아닙니다. 그래서 OSINT의 첫 규칙은 대상·목적·방식의 합법성 확인이고, 이 챕터는 그 경계를 안전하게 배우려고 대상을 본인으로 한정합니다.
문제 2 해답. 첫째, 같은 아이디를 다른 사람이 먼저 쓰고 있을 수 있습니다 — 아이디는 전 세계에 하나뿐이 아닙니다 (3-2의 bluefox7 참조). 둘째, 사이트의 응답 방식 때문에 존재하지 않는데도 존재한다고 나오는 오탐이 있습니다 — 도구는 "페이지가 열렸다"를 볼 뿐입니다. 그래서 도구 출력은 확인 후보이며, 방문 대조까지가 수집입니다.
문제 3 해답. 능동적 발자국은 올리는 행위 자체로 남는 것 — 글, 사진, 소개글입니다. 수동적 발자국은 의도와 무관하게 딸려 오는 것입니다. 사진을 올리는 것은 능동이지만, 그 사진 파일의 Exif에 촬영 위치·기종·시각이 붙어 오는 것은 수동입니다. 3-1에서 확인했듯 파일은 본문 외의 정보를 이미 말하고 있습니다.
문제 4 해답. 조각 하나하나는 무해한 경우가 많아 다 지우기도 어렵고 지울 필요도 없습니다. 위험은 조각이 이어져 신상 그림이 될 때 생깁니다. 같은 아이디가 그 연결고리이므로, 아이디를 분리하고 아이디-실명 연결을 끊는 것이 적은 노력으로 그림 형성을 막는 방법입니다. 방어도 공격과 반대로 생각하면 됩니다 — 공격자가 "잇는" 것을 방어자는 "끊습니다".
완료 기준 체크리스트
- [ ] OSINT의 세 수집 원칙을 말할 수 있다
- [ ]
os.stat()으로 파일 메타데이터를 읽었다 - [ ] 사용자명 상관관계 시뮬레이션을 실행했다
- [ ] 검색 연산자 4종의 용도를 구분할 수 있다
- [ ] sherlock 출력의
[+]가 후보라는 점을 이해한다 - [ ] 본인 대상 발자국 지도를 완성했다
- [ ] 노출 축소 조치를 하나 이상 실행했다
6. 흔한 실수와 해결
벽 1. FileNotFoundError가 난다
증상 (2026-09-09 실측, 없는 파일을 os.stat()한 경우):
FileNotFoundError: [WinError 2] 지정된 파일을 찾을 수 없습니다: 'nofile.txt'
원인: 파일을 만들기 전에 읽었거나, 이름이 틀렸습니다.
해결: 3-1처럼 먼저 with open(p, "w")로 파일을 만들고 읽으세요. 파일명은 타이핑하지 말고 복사하는 습관이 오탈자를 막습니다.
벽 2. sherlock 결과가 전부 [+]로 나온다는 이야기를 듣는다
증상: 아이디를 넣었는데 존재할 리 없는 사이트까지 발견 표시가 됩니다.
원인: 사이트가 없는 아이디에도 "가입하세요" 페이지를 200으로 보여 주는 경우, 도구는 존재로 오판합니다 — 오탐입니다.
해결: 도구를 의심하고 사람이 확인하세요. 출력의 각 줄을 직접 방문해 프로필 내용이 대상과 일치하는지 대조하는 것까지가 수집입니다.
벽 3. 검색이 0건이라 "노출이 없다"고 결론 내린다
증상: "내아이디" 검색이 텅 빈 화면입니다.
원인: 검색엔진이 모르는 것과 존재하지 않는 것은 다릅니다 — 비공개 그룹, 검색 차단 사이트는 안 잡힙니다.
해결: "검색에 안 걸렸다"까지만 쓰세요. 그리고 연산자를 바꿔(따옴표 해제, site: 지정) 다른 각도에서 다시 봅니다. 각도가 늘수록 그림이 정확해집니다.
벽 4. 지도를 쓰다가 남의 정보를 적고 있다
증상: 같은 아이디를 쓰는 다른 사람의 프로필을 기록하고 있습니다.
원인: 3-2의 유사 아이디 문제입니다 — 아이디가 같아도 사람은 다를 수 있습니다.
해결: 즉시 지우세요. 이 챕터의 대상은 본인뿐이며, 타인의 정보는 수집하지도 기록하지도 않습니다. 이 규칙 하나가 취미와 범죄를 가릅니다.
벽 5. 축소 계획이 "전부 삭제"로 끝난다
증상: 계획이 "모든 계정 삭제" 한 줄입니다.
원인: 우선순위가 없는 계획은 실행되지 않습니다.
해결: 3-5처럼 위험도를 매기고 "이어지는 실"부터 끊으세요. 깃허브 이메일 하나 바꾸는 것처럼 오늘 실행 가능한 것부터 — 작은 실행 하나가 큰 계획 열 개보다 낫습니다.
7. 정리
오늘의 개념
| 개념 | 한 줄 설명 |
|---|---|
| OSINT | 공개 출처 정보만으로 그림을 그리는 조사 기법 |
| 수집 원칙 | 공개된 것만 · 기록을 남김 · 목적이 먼저 |
| 사용자명 상관관계 | 같은 아이디로 여러 사이트의 계정을 잇는 기법 |
| 디지털 발자국 | 온라인 활동의 흔적 — 능동(올린 것) + 수동(딸려 온 것) |
| 메타데이터 | 데이터에 딸린 데이터 — Exif, 작성자, 시각 |
| 오탐(false positive) | 없는데 있다고 나오는 도구의 오판 — 방문 확인으로 걸러냄 |
| sherlock | 아이디 하나를 수백 사이트에 대조하는 대표 수집 도구 |
오늘의 명령어·도구
| 도구 | 하는 일 |
|---|---|
os.stat("파일") |
크기·시각 등 파일 메타데이터 읽기 |
datetime.fromtimestamp() |
타임스탬프를 사람 시간으로 변환 |
"아이디" (따옴표) |
정확히 그 문자열만 검색 |
site:도메인 키워드 |
특정 사이트 안에서만 검색 |
filetype:pdf 키워드 |
공개 문서 파일만 검색 |
sherlock 아이디 |
(개념 체험) 다중 사이트 계정 존재 확인 |
명령어보다 중요한 감각
오늘 여러분은 공격자의 눈으로 자기 자신을 봤습니다. 무섭게도, 필요한 것은 검색창과 규칙 몇 개뿐이었습니다. 이 관점 전환이 이 챕터의 선물입니다 — 방어는 "남이 나를 어떻게 보는가"를 아는 데서 시작합니다. 그리고 같은 이유로, 이 기술의 방아쇠는 기술이 아니라 윤리에 있습니다. 대상을 본인으로 한정한 오늘의 규칙을 평생 규칙으로 가져가세요. 실력은 조사하는 능력이고, 품격은 조사하지 않기로 선택하는 능력입니다.
전부 체크되면 Step 170 완료입니다. 사이드바의 체크박스를 눌러 진도를 저장하세요.