어떤 수업을 찾고 있나요?

예: PowerShell, 네트워크, XSS, Step 138

전체 커리큘럼 둘러보기 →

침투 실습

Step 170. OSINT 입문 — 소셜미디어 수집과 디지털 발자국

Step 170예상 실습 시간 · 2시간 30분

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부 + 축소 조치 실행

  1. 3-4의 검색 연산자 네 가지를 본인 아이디·이름으로 실제 검색하고 결과를 기록합니다
  2. 3-5의 틀로 내-발자국-지도.md를 작성합니다 — 노출 항목 최소 3개
  3. 노출 축소 계획 중 하나는 오늘 실행합니다 (비공개 전환, 옛 글 삭제 등)
  4. 각 노출 항목에 "어디서 발견했는가"의 출처(검색어)를 반드시 답니다
  5. 다른 사람의 정보가 화면에 보이더라도 기록하지 않습니다 — 대상은 본인뿐입니다

연습문제

문제 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 완료입니다.

한 단계 더 가까이

수업을 마쳤나요?

본문의 완료 기준을 확인한 뒤 직접 표시하세요.

화면이나 링크에 문제가 있나요? 알려주세요.
다음 수업