결론부터 한 문단으로
상업용 VPN 하나만으로는 ‘익명’과 거리가 멉니다. 진정한 추적 방지는 시스템 엔지니어링의 문제입니다 — IP 계층에서는 WebRTC / IPv6 / DNS 유출을 막아야 하고, DNS 리졸버는 VPN 출구와 같은 국가여야 하며, 브라우저 핑거프린트는 ‘평범해 보여야’ 하고(핑거프린트 방지 확장 프로그램을 잔뜩 설치한 상태가 아니어야 함), TLS / TCP 핑거프린트는 TUN 모드로 VPN 서버 자체의 네트워크 스택이 처리하게 해야 합니다. 또한 로그를 남기지 않고 프라이버시 친화적인 관할권에 있는 VPN 제공업체를 골라야 하며, 브라우저의 여러 계정은 엄격히 분리해야 합니다. 아래에서 8가지 측면을 하나씩 자세히 살펴봅니다.
들어가며: VPN이 ‘만능 면죄부’가 아닌 이유
흔히 이렇게 생각합니다. NordVPN / Surfshark / 직접 구축한 WireGuard를 설치해 출구 IP만 바꾸면 ‘이제 아무도 내가 누군지 알 수 없다’고요. 이는 2010년대의 사고방식입니다. 추적 기술은 이미 오래전에 ‘IP 계층’을 넘어섰습니다:
- ‘VPN을 사용 중’이라는 사실을 알아내는 것은 위험 관리 시스템의 기본 기능입니다(IP가 VPN 제공업체의 ASN에 속하는지 확인 — 주요 상업용 VPN의 데이터센터 대역은 거의 모두 이미 표시되어 있습니다)
- ‘이전에 쓰던 실제 IP’를 식별하는 데는 IP 계층만으로 충분합니다 — WebRTC / IPv6 / DNS 유출 / CDN 원본 서버 우회 — 그리고 한 번만 실수해도 쿠키로 영구히 표시됩니다
- ‘정확히 어떤 사람인지’를 식별하는 데는 IP가 전혀 필요 없습니다 — 브라우저 핑거프린트, 행동 패턴, 계정 간 연관에 의존합니다
- 극단적인 경우 법적 공조(소환장 / 국경 간 수사)를 통해 VPN 제공업체가 로그를 넘기게 할 수 있습니다
다시 말해, 추적은 하나의 취약점이 아니라 N개 측면의 교집합으로 이루어집니다 — 사용자는 모든 측면을 막아야 하지만, 추적하는 쪽은 그중 하나만 성공해도 충분합니다. 그래서 ‘완전한 익명’은 공학적으로 거의 불가능하지만, ‘연관성을 크게 낮추는 것’은 가능합니다. 이 글은 그 방법을 설명합니다.
① IP 계층 유출 — 실제 IP가 그대로 노출됨
가장 고전적이고 가장 흔한 경우입니다. VPN은 브라우저의 HTTP / TCP 트래픽만 처리하지만, 다음 경로는 VPN을 완전히 우회해 집의 공인 IP를 상대방에게 그대로 넘길 수 있습니다:
1.1 WebRTC 유출
브라우저에 내장된 WebRTC(영상 통화용)는 STUN 프로토콜로 자신이 보는 공인 IP를 능동적으로 알아내며, JavaScript는 이 값을 바로 읽을 수 있습니다. HTTP / SOCKS 프록시는 TCP만 가로채지만, STUN은 UDP를 사용하므로 프록시를 완전히 우회해 집의 네트워크 어댑터로 나가며 실제 IP를 노출합니다.
HTTP/SOCKS 프록시 + 브라우저 → WebRTC UDP가 집 네트워크 어댑터로 바로 나감 → 실제 IP 노출방어: TUN 모드 VPN(Mihomo / Clash Premium / WireGuard TUN / Tailscale)을 사용해 가상 네트워크 어댑터에서 모든 TCP+UDP 트래픽을 처리하게 하세요. 브라우저 전용 프록시만 쓴다면 WebRTC를 없애는 대신 정책으로 제한하세요: Chrome / Edge는 기업 정책 WebRtcIPHandling = disable_non_proxied_udp, Brave는 ‘Disable Non-Proxied UDP’ 활성화, Firefox는 about:config → media.peerconnection.ice.proxy_only_if_behind_proxy = true.
직접 테스트: 저희 /leak 유출 탐지로 WebRTC STUN이 반환한 공인 IP가 HTTP 출구와 일치하는지 확인하세요.
1.2 IPv6 듀얼 스택 유출
VPN은 IPv4만 프록시하는데 집 인터넷에는 IPv6도 있다면, 브라우저는 IPv6로 먼저 나가므로 VPN을 전혀 거치지 않습니다. China Telecom 가정용 인터넷 사용자에게 매우 흔한 취약점입니다.
방어: IPv4와 IPv6를 모두 프록시하는 VPN을 쓰거나, 시스템 / 브라우저 수준에서 IPv6를 비활성화하세요. Windows에서는 레지스트리를 수정하고, macOS에서는 networksetup을 사용합니다.
1.3 DNS 유출 (별도로 다룸, ② DNS 계층 참고)
1.4 CDN 원본 서버 우회
사이트가 Cloudflare 같은 CDN을 쓰면 실제로 접속하는 곳은 CDN 엣지 노드 IP입니다 — 하지만 공격자가 사이트의 실제 원본 서버 IP를 알아내면 CDN을 우회해 직접 접속할 수 있습니다. 추적하는 쪽에도 반대로 똑같이 적용됩니다. 접속한 CDN 노드는 중국에 있는데 같은 세션의 어떤 정적 리소스를 (CDN이 처리하지 않아) 원본 서버에서 직접 가져온다면, 실제 IP가 원본 서버의 접속 로그에 남습니다.
방어: 이런 예외적인 경우는 주로 대상 사이트 자체의 설정이 얼마나 엄격한지에 달려 있으며, 사용자 쪽에서 할 수 있는 일은 제한적입니다.
② DNS 계층 유출 — 조회한 도메인이 신원을 드러냄
IP 트래픽은 VPN을 거치지만 DNS 질의는 여전히 로컬 ISP를 통할 수 있습니다. 유출되는 방식은 두 가지입니다:
2.1 리졸버 국가 불일치
VPN 출구는 네덜란드인데, 시스템이 DNS 질의를 보낼 때 스텁 리졸버는 집 인터넷 업체가 설정한 DNS(China Telecom)를 사용합니다. 권한 있는 네임서버가 질의를 받으면 출발지 IP가 China Telecom으로 보이므로, 방문하는 모든 도메인의 운영자에게 실제 위치가 드러납니다.
2.2 ECS 서브넷 유출
공용 재귀 리졸버(Google의 8.8.8.8은 EDNS 클라이언트 서브넷이 기본으로 켜져 있음)는 실제 /24 서브넷 정보를 ‘위치 기반 CDN 라우팅’을 위해 대상 권한 있는 서버로 전달합니다. 하지만 그 순간 서브넷이 원격의 권한 있는 서버에 공개됩니다 — 리졸버의 출구 IP보다 더 정밀하게, 사는 동네의 서브넷까지 특정됩니다.
브라우저 → 시스템 DNS → 8.8.8.8 → 권한 있는 NS (리졸버 IP = Google로 보임) + ECS = 집의 /24 서브넷방어:
- VPN 클라이언트에서 사용자 지정 DNS를 강제로 설정하세요 — VPN 제공업체 자체 DNS 사용 (NordVPN / Mullvad / ProtonVPN 모두 제공)
- DNS 질의가 터널 밖으로 유출되지 않게 하세요 — 그러면 리졸버가 실제 IP를 보게 되고, 웹 트래픽과 맞지 않아 즉시 드러납니다. 1.1.1.1 / 8.8.8.8은 애니캐스트이므로 질의가 터널을 거치기만 하면 VPN 출구 근처에 도달해 아무것도 드러내지 않습니다. 진짜 문제는 시스템이 터널을 우회해 이들에 직접 연결하는 경우입니다
- 공용 재귀 리졸버를 쓰기로 했다면 최소한 VPN 출구와 같은 국가에 있는지 확인하세요
- DoH(DNS-over-HTTPS)로 DNS 질의를 강제로 암호화해 ISP의 중간자 감청을 막으세요
직접 테스트: 저희 /leak DNS 유출 탐지 도구는 자체 권한 있는 네임서버를 운영하며, 브라우저의 질의를 실제로 저희 서버로 라우팅해 리졸버 IP와 ECS 서브넷을 보여 줍니다. 자세한 원리는 공용 DNS 리졸버 완벽 가이드를 참고하세요.
③ TLS 핑거프린트(ja3 / ja4) — 클라이언트는 누구인가
HTTPS 핸드셰이크 중 클라이언트는 서버에 ClientHello 패킷을 보내며, 여기에는 지원하는 TLS 버전, 암호 스위트, 확장, 타원 곡선 등이 나열됩니다. 이 필드들의 정확한 순서와 내용은 클라이언트마다 모두 다르며 (Chrome 124 vs Firefox 123 vs curl vs Python requests), 이를 조합해 만든 핑거프린트가 업계에서 ja3 / ja4라고 부르는 값입니다.
사이트는 모든 방문자의 ja3 / ja4 핑거프린트를 기록해 User-Agent와 비교할 수 있습니다. UA는 Chrome 124라고 주장하는데 ja3 핑거프린트가 Python requests와 일치한다면 봇이나 스크립트 트래픽입니다. 이는 Cloudflare, Akamai 같은 봇 차단 서비스가 쓰는 핵심 신호 중 하나이기도 합니다.
| 클라이언트 | 대표적인 ja3 핑거프린트 특징 |
|---|---|
| Chrome 124+ | TLS 1.3 + GREASE + 전체 확장 목록 |
| Firefox 123+ | TLS 1.3 + 다른 확장 순서, GREASE 없음 |
| curl 8.x | 확장이 적음, GREASE 없음 |
| Python requests | 눈에 띄게 단순한 핑거프린트 |
| Go net/http | 독특한 암호 스위트 순서 |
방어:
- 항상 실제 주류 브라우저 (Chrome / Firefox / Edge)를 사용하세요 — Selenium / Puppeteer를 그대로 실행하지 마세요. 이들의 ja3 핑거프린트는 매우 두드러집니다
- 자동화가 필요하면 undetected-chromedriver / Playwright + curl-impersonate를 사용하세요
- ‘핑거프린트 방지’ 브라우저 확장 프로그램을 설치하지 마세요 — 오히려 ja3가 일반 Chrome보다 더 독특해져, 추적 방지 도구를 쓰고 있다고 스스로 표시하는 셈입니다
④ HTTP / 브라우저 핑거프린트 — Canvas / WebGL / 글꼴 / 시간대
애플리케이션 계층에서 노출되는 핑거프린트는 더 풍부하고 막기도 더 어렵습니다:
| 항목 | 수집 방법 | 고유성 |
|---|---|---|
| Canvas 핑거프린트 | JS로 텍스트를 그린 뒤 렌더링 결과를 해시 | 매우 높음 (GPU + 글꼴 렌더링 차이) |
| WebGL 핑거프린트 | GPU 제조사 / 렌더러 조회 | 매우 높음 |
| AudioContext 핑거프린트 | JS로 오디오를 생성해 반환값 읽기 | 높음 |
| 설치된 글꼴 | JS로 렌더링 가능한 글꼴 탐색 | 높음 |
| 화면 해상도 + 색 심도 | window.screen | 중간 |
| 시간대 | Intl.DateTimeFormat().resolvedOptions().timeZone | 중간 (단, IP와 대조하면 매우 강력함) |
| 언어 (Accept-Language) | HTTP header | 중간 |
| 클라이언트 힌트 (Sec-CH-UA-*) | HTTP header (Chrome) | 중간 |
핵심 함정: 시간대 / 언어 / 글꼴이 VPN 출구 국가와 일치하지 않는 것은 ‘VPN을 쓰고 있다’는 매우 강력한 신호입니다. VPN으로 미국에 접속했는데 브라우저 시간대는 여전히 Asia/Shanghai이고 언어는 zh-CN이라면 한눈에 드러납니다.
방어:
- “평범해 보이기” — 브라우저에 안티 핑거프린트 확장 프로그램을 설치하지 마세요. 그 자체가 비정상으로 보입니다. 일반 사용자의 평범한 Chrome 핑거프린트가 가장 좋은 위장입니다.
- 용도 분리: 실제 신원에는 기본 브라우저를, 프라이버시가 중요한 활동에는 별도의 브라우저 프로필 / VM / Tails / Whonix를 사용하세요
- VPN 출구 국가, 시스템 시간대, 브라우저 언어를 모두 일치시키세요 — 최소한 ‘중국 사용자가 미국 VPN을 거치고 있다’는 결정적인 신호가 유출되지 않게 하세요
- Tor 브라우저는 바로 이런 목적으로 설계되었습니다 — 모든 사용자가 똑같아 보이는 대신 성능을 희생합니다
직접 해 보기: 저희 /fingerprint 브라우저 핑거프린트 검사 도구로 자신의 14가지 핑거프린트 항목이 얼마나 고유한지 확인해 보세요.
⑤ TCP/IP 계층 핑거프린트 — Initial Window / TTL / MTU
애플리케이션 계층에 도달하기도 전에 네트워크 계층에 이미 핑거프린트가 존재합니다. 운영체제마다 TCP/IP 스택 구현이 조금씩 다릅니다:
- 초기 TTL: Windows는 기본 128, Linux 64, macOS 64, iOS 64
- TCP 초기 윈도 크기 (Initial Window Size): Windows는 64KB, Linux는 14600, macOS는 65535
- TCP 옵션 순서: OS마다 MSS / SACK / Timestamp 옵션을 보내는 순서가 다릅니다
- MTU: 일반 가정용 인터넷은 1500, PPPoE는 1492, VPN 터널은 보통 1380-1450
p0f 도구(패시브 OS 핑거프린트 식별)는 바로 이 필드들을 이용해, 프로브 패킷을 하나도 보내지 않고 피어의 운영체제를 판별합니다. 사이트는 이 정보를 수집해 사용자가 내세운 UA와 비교할 수 있습니다 — UA는 Mac Safari라고 하는데 TTL이 128이고 Initial Window가 Windows 값과 일치한다면, 실제로는 Windows에서 Mac UA로 위장하고 있는 것입니다.
MTU도 ‘VPN을 쓰고 있다’는 사실을 유출할 수 있습니다 — VPN 터널은 보통 MTU가 1500 미만이라 트래픽이 일반 가정용 인터넷과 눈에 띄게 다르기 때문입니다.
방어:
- TUN 모드 VPN 사용: VPN 서버의 자체 스택이 처리를 넘겨받으므로, 사이트가 보는 TCP/IP 핑거프린트는 클라이언트가 아니라 VPN 서버의 것입니다
- OpenVPN / WireGuard는 기본적으로 TUN 모드이지만 HTTP/SOCKS 프록시는 그렇지 않습니다 — 이것이 핵심 차이입니다
- ‘VPN처럼 보이지 않게’ 하려고 터널 MTU를 1500까지 억지로 올리지 마세요 — 터널 캡슐화 자체가 수십 바이트를 차지하므로, 너무 높이면 패킷 단편화나 PMTUD 블랙홀이 생깁니다(큰 패킷이 멈추고 페이지가 반쯤만 로드됨). 클라이언트 기본값(WireGuard 1420, OpenVPN 자동)을 유지하세요
⑥ 행동 패턴 분석 — 트래픽 시간 + 입력 습관
방어하기 가장 어려운 차원입니다. 이 방식은 기술적인 핑거프린트에 전혀 의존하지 않고, 전적으로 머신러닝에 기반하기 때문입니다:
- 접속 시간 분포: 매일 온라인에 접속하는 시간대가 여러 계정에서 일치하면 동일 인물로 판단됩니다
- 마우스 궤적 / 스크롤 속도 / 키 입력 리듬: 사람마다 고유하며, 은행 / 사기 방지 시스템이 수집합니다
- 세션 지속 시간 / 페이지 이동 패턴: 브라우징 습관은 사람마다 고유합니다
- 텍스트 입력 특징: 타이핑 오류율, 단어 선택 습관, 문법
방어:
- 계정 간 사용 시간대를 엄격히 분리하세요 — ‘A 계정 + B 계정’에 동시에 로그인하지 말고 몇 시간씩 간격을 두세요
- 정말로 익명성이 필요할 때는 기기를 바꾸세요 (노트북에서 휴대폰 / 태블릿으로)
- 완벽하게 방어하는 것은 불가능하지만, 연관 짓기를 상당히 어렵게 만들 수는 있습니다
⑦ VPN 제공업체 로그 + 사법 관할권
이것은 VPN의 원죄입니다. VPN 제공업체가 로그를 남기지 않는다고 믿겠지만, 현실은 다음과 같습니다:
- 상업용 VPN 업체는 인수될 수 있습니다 (Avast가 NortonLifeLock에 인수된 뒤 개인정보 처리방침이 바뀌었습니다)
- 업체가 몰래 로그를 수집할 수 있습니다 (2017년 PureVPN은 이전까지 ‘no-log’라고 주장했음에도 FBI에 사용자 로그를 제공했습니다)
- 법원 소환장으로 협조를 강제할 수 있습니다 — 미국 / 영국 / 캐나다 / 호주 / 뉴질랜드(Five Eyes)는 모두 국제 공조 수사에 응합니다
- Nine Eyes = Five Eyes + 덴마크 / 프랑스 / 네덜란드 / 노르웨이
- Fourteen Eyes = Nine Eyes + 독일 / 벨기에 / 이탈리아 / 스페인 / 스웨덴
선택 기준:
| VPN | 사법 관할권 | 제3자 감사 | 평가 |
|---|---|---|---|
| Mullvad | 스웨덴 (14 Eyes) | 있음 (Cure53 / Assured) | 이메일 불필요, 결제 정보 연관 없음, 현금 결제 가능 |
| ProtonVPN | 스위스 (중립국) | 있음 (Mozilla) | 스위스 법의 보호를 받지만 이메일 가입이 필요함 |
| IVPN | 지브롤터 (영국령) | 있음 | Mullvad와 비슷하며 XMR 결제 가능 |
| ExpressVPN | 영국령 버진아일랜드 (BVI) | 있음 (PWC) | 2021년 Kape에 인수된 뒤 신뢰도 하락 |
| NordVPN | 파나마 | 있음 (PWC / Deloitte) | 2018년 서버 침해 사고 이후 아키텍처를 재구성 |
| Surfshark | 네덜란드 (9 Eyes) | 있음 | NordVPN과 같은 모회사이며 관할권이 Nine Eyes 안에 있음 |
VPN을 직접 구축하면 통제력은 높아지지만, VPS 업체(Vultr / Hetzner / DigitalOcean)도 자체 로그를 보관하며 수사에 협조할 수 있습니다. 진정한 익명성을 얻으려면 현금 / 암호화폐로 VPS를 구매하고 가짜 신원으로 가입해야 하며, 이는 상당한 공수가 드는 작업입니다.
⑧ 계정 간 연관 — 같은 쿠키 / 핑거프린트를 쓰는 여러 계정
A 계정으로 로그인하면 브라우저에 쿠키 / localStorage / 캐시가 저장됩니다. 같은 브라우저에서 B 계정으로 전환하면 사이트는 동일 인물이라는 것을 바로 알아챕니다.
- 같은 핑거프린트 + 짧은 시간 안에 여러 계정 로그인 = 계정 간 연관
- 사이트 간 쿠키 추적 (다만 최신 브라우저들은 이를 제한하기 시작했습니다)
- 여러 사이트의 활동을 연결하는 서드파티 추적 스크립트 (Google Analytics / Facebook Pixel)
방어:
- Firefox의 Multi-Account Containers 확장 프로그램: 계정마다 쿠키 / 저장 공간이 분리됩니다
- Chrome 다중 프로필 설정 (오른쪽 위 프로필 아이콘 → 사용자 추가)
- 극단적인 방법: 계정마다 별도의 가상 머신에서 실행하고, VM마다 서로 다른 VPN 출구를 사용합니다
방어 전략 요약표
| 차원 | 노출 방식 | 대응 방법 | 탐지 도구 |
|---|---|---|---|
| IP | WebRTC / IPv6 / DNS / CDN 오리진 우회 | TUN 모드 + WebRTC 비활성화 + IPv6 비활성화 | /leak |
| DNS | 다른 국가의 리졸버 / ECS 서브넷 노출 | VPN 자체 DNS + DoH | /leak |
| TLS 핑거프린트 | ja3 / ja4로 클라이언트 노출 | 실제 주류 브라우저 사용, 안티 핑거프린트 도구 설치 금지 | 외부 도구 (browserleaks) |
| HTTP 핑거프린트 | Canvas/WebGL/글꼴/시간대 | 시간대 / 언어 / 글꼴을 VPN 출구와 일치 | /fingerprint |
| TCP/IP 계층 | TTL / Window / MTU | TUN 모드, VPN 서버 스택이 대신 처리 | 외부 도구 (browserleaks tcp) |
| 행동 패턴 | 접속 시간 / 마우스 / 입력 습관 | 계정 간 사용 시간 분산 + 기기 교체 | 없음 |
| VPN 로그 | 업체에 소환장 발부 | no-log + 프라이버시 친화적 관할권 선택 | 업체의 감사 리포트 확인 |
| 계정 간 | 같은 쿠키 / 같은 핑거프린트 | Multi-Account Containers / VM 격리 | /headers |
현실적인 조언: 실제로 얼마나 익명이어야 합니까?
방어를 얼마나 깊게 할지 정하기 전에 먼저 실제로 누가 나를 추적하는지 파악하세요:
- 광고주 + 데이터 브로커 (낮은 강도): uBlock Origin + 서드파티 쿠키 차단 + 일반 VPN이면 대부분의 일상적인 상황에 충분합니다
- 사기 방지 위험 관리 (중간 강도): 위 항목 + VPN DNS 일관성 + 시간대 / 언어 일치 + 브라우저 프로필 분리
- 경쟁 업체 / 웹 크롤러 (중상 강도): 위 항목 + TUN 모드 + 실제 브라우저 (Selenium 흔적 없음) + 남은 쿠키 정리
- 정부 / 국제 수사 (최고 강도): 위의 모든 것은 기본일 뿐입니다. Tor / Whonix / Tails / 현금으로 구매한 VPS + XMR + 완전히 격리된 기기가 필요합니다
대부분의 사람에게 필요한 것은 1~2단계뿐입니다. 3단계 이상은 전문가의 영역입니다. 실제로 필요하지 않은 익명성 때문에 일상 사용을 번거롭게 만들지 마세요.
더 읽을거리
- browserleaks.com — 종합 핑거프린트 테스트WebRTC / Canvas / WebGL / TCP / ja3를 한곳에서 검사
- amiunique.org — 브라우저 핑거프린트 고유성INRIA 데이터베이스에서 내 핑거프린트가 얼마나 고유한지 확인
- salesforce/ja3 — TLS 핑거프린트의 작동 원리
- privacytools.io — 추적 방지 도구 총정리
- Tor Project — 궁극의 익명 네트워크