Website · 셸 지문 — 제작 흔적을 축으로 쓰는 법

robots · 헤더 순서 · style · TXT · 이미지 인코더 — 각 축이 무엇이고 왜 축이 되는가 · 실측 모수 = 홀드아웃 창 호스트 3,108개 / 응답 2,987건 (2026-09-01)
이 문서는 Website · Image — 필드 인벤토리와 추론 지도의 자매편이다. 그 문서는 도메인 지문(RDAP·urlscan 에서 오는 17필드 — registrar certIssuer ip asn …)을 다룬다. 이 문서는 그 문서 §7 「지금 안 뽑는데 뽑을 수 있는 것」에 후보로만 올라 있던 축들과, §8 「image — 현황과 제안」이 「가설이며 실측 근거가 하나도 없다」고 적어둔 이미지 축이 실제로 검정된 결과를 담는다.
목차 1. 왜 이 넷이 축이 되나 — 상품 축과 제작 축 2. 축 인벤토리 — 각 축이 무엇이고 무엇을 추론하나 2.1 실제 값 — 상위 지문은 대부분 플랫폼 기본값이다 2.2 축의 성격 — 무엇에 흔들리나 3. 실측 — 묶임률 38% → 39% 4. 축이 되지 못한 것 — 상품 축 4종의 실패 5. 저장 형태 — 버전을 달지 않으면 조용히 깨진다 6. 미결 · 다음
🔴 2026-09-01 재검토 — 아래 §2.1 을 먼저 읽을 것
실제 값을 넣어보니 상위 지문이 대부분 플랫폼 기본값이었다. 「검정됨」으로 적은 §3 의 묶임률 39% 와 §1 의 S024 사례는 이 오염을 걷어내기 전 수치다. 재집계 전까지 그대로 인용하지 말 것.

1. 왜 이 넷이 축이 되나 — 상품 축과 제작 축

운영자가 «산» 것은 축이 되지 못하고, 운영자가 «만든» 것만 축이 된다. 이 한 줄이 이번 검정의 결론이고, 축을 새로 고를 때의 기준이다.

구분무엇인가예왜 그런가검정 결과
상품 축시중에서 사서 쓰는 것. 누구나 같은 것을 고를 수 있다 registrar · certIssuer · server · 도메인 나이 선택지가 좁아 배경 점유가 높다. registrar 1068 하나가 홀드아웃의 16.4% 전부 실패
제작 축사이트를 만들 때 딸려 나오는 흔적. 고르는 것이 아니라 도구가 남긴다 robots 해시 · 헤더 순서 · style 해시 · TXT 형식 · 이미지 인코더 어떤 빌더든 고객 사이트에 같은 껍데기를 심는다. 값이 저절로 뭉치고, 빌더 이름을 미리 알 필요가 없다 묶임률 39%
🔴 무효 — 이 사례는 Cloudflare 기본값이었다
아래 4호스트의 IP 172.67.* 104.21.* 는 전부 Cloudflare 대역이다. IP 가 다른 게 아니라 같은 CDN 의 다른 엣지 노드였고, robots 해시가 같은 것도 Cloudflare 가 심는 기본 파일이기 때문이다(§2.1). 원문 서술은 기록으로 남긴다 —

결정적 사례 — IP 로는 원리상 못 찾는 군집
실측에서 호스트 수 = IP 수인 군집 12개가 나왔다. 인프라를 전혀 나눠 쓰지 않으면서 만드는 방식만 같은 경우다.
호스트robots 해시IP
deadairsol.prod53d5a75c141172.67.181.163
rollheadsol.prod53d5a75c141104.21.69.211
boxboy.prod53d5a75c141104.21.89.46
voidwizard.prod53d5a75c141172.67.185.231
원 실험 문서가 같은 것을 이렇게 적었다 — 「IP 수가 호스트 수와 같은 군집이 가장 믿을 만하다. 인프라를 전혀 나눠 쓰지 않으면서 이미지 만드는 방식만 같다는 뜻이라, 우연으로 설명하기 어렵다」
즉 이 축들에서 IP 가 다 다른 것은 약점이 아니라 강점이다.

2. 축 인벤토리 — 각 축이 무엇이고 무엇을 추론하나

채움% = 홀드아웃 응답 2,987건 중 값이 실제로 온 비율. 등급은 website-image 와 같은 체계를 쓴다.

「원본 내용」과 「저장 값」은 다르다. robots 와 style 은 원본이 길어서(1,000자 이상) md5 앞 12자로 줄여 저장한다 — 우리가 알고 싶은 것은 「무엇이 적혀 있나」가 아니라 「이 사이트와 저 사이트가 같은가」뿐이기 때문이다. hdr·txt·이미지 는 원본이 짧아 값을 그대로 저장한다.

🔴 그런데 해시만 저장하면 나중에 눈으로 검증할 수 없다. 실제로 d53d5a75c141 96호스트를 「같은 도구로 만든 군집」이라 며칠 믿었는데, 내용을 직접 받아보니 Cloudflare 기본 파일이었다(§2.1). 원본 앞부분을 함께 남겨야 한다 — §5 참조.

robots — 크롤러 안내 파일 · 채움 46.2% · immutable · 등급 C 군집용

/robots.txt 는 「어느 경로를 긁어도 되는가」를 크롤러에게 알리는 평문 파일이다(RFC 9309). 강제가 아니라 권고이고 없어도 정상이다. 빌더가 템플릿으로 자동 생성하고 운영자가 거의 안 고쳐서 지문이 된다 — 고 봤으나 실제로는 CDN 기본값이 대부분이었다.

원본 내용 (주석 제외)저장 값호스트예
User-agent: *
Content-Signal: search=yes,ai-train=no,use=reference
Allow: /
User-agent: Amazonbot …(21줄)
d53d5a75c14196 deadairsol.pro
nebraskaexaminer.com 🔴
User-agent: Googlebot
Allow: /
User-agent: Bingbot
Allow: / …
871166c9f7c9103 knowyourrmeme.com
usms.live
User-agent: *
Allow: / — 2줄. 가장 흔한 최소형
c28e573a1f3649 xbotrewards.com
koranews.org
User-agent: *
Allow: /
LLM-Policy: /llms.txt
Sitemap: /sitemap.xml
3e4171c83c4615 dogmode.xyz
tryblessed.com
🔴 내용이 전부 주석 → 정규화 후 0줄 d41d8cd98f00
빈 문자열의 md5
103 foboterminal.com
서로 무관한 103개

hdr — 헤더 이름 순서 · 채움 90.4% · mutable · 등급 C 군집용

헤더의 값이 아니라 이름이 나온 순서다. 같은 서버·프레임워크면 순서가 같다 — TLS 의 JA3 지문과 같은 발상. 해시하지 않고 값 그대로 저장한다. ⚠️ 실제로는 호스팅 이름이 헤더에 그대로 박혀 있다.

저장 값 (= 원본)호스트예정체
access-control-allow-origin|age|cache-control|content-disposition|content-type|date|etag|last-modified|server|strict-transport-security|x-vercel-cache|x-vercel-id|connection|transfer-encoding 331svmscope.vercel.app🔴 Vercel
cache-control|content-length|content-type|date|server|strict-transport-security|x-vercel-error|x-vercel-id|connection 213gustacio.site🔴 Vercel 오류 페이지
access-control-allow-origin|age|…|x-nextjs-prerender|x-nextjs-stale-time|x-vercel-cache|x-vercel-id|… 175rentapi.org🔴 Next.js on Vercel
date|content-type|transfer-encoding|connection|cf-cache-status|cache-control|… 76foboterminal.com🔴 Cloudflare
상위 3개만 719호스트(24%) 이고 전부 x-vercel-* 를 포함한다. 이 축이 잡는 것은 운영자가 아니라 호스팅이다.

style — 인라인 CSS 해시 · 채움 31.9% · immutable · 등급 C 군집용

<head> 안 <style> 내용만 본다. 외부 CSS 파일은 URL 만 봐도 같은지 알 수 있어 지문이 필요 없다. 빌더가 밀어넣는 리셋 CSS 가 고객마다 동일해서 지문이 된다 — 고 봤으나 공용 테마도 같이 묶인다.

원본 내용 (앞부분)저장 값호스트예
*{box-sizing:border-box;margin:0;padding:0}html{line-height:1.15;-webkit-text-size-adjust:100%;color:#313131;font-family:system-ui…
1,197자 · 두 호스트 완전 동일
1ceb4de319a762 nebraskaexaminer.com
cornishstuff.com 🔴 둘 다 일반 뉴스
body { background-color: #f5f5f5; margin-top: 8%; color: #5d5d5d; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Robo…
1,072자
625c33d3105321 gigagaga.top
ansemup.pro

txt — DNS TXT 형식 · 채움 49.0% · mutable · 등급 C 군집용

DNS 의 TXT 레코드를 값이 아니라 종류로 축약한다. 값을 그대로 쓰면 인증 토큰이 전부 달라 아무것도 안 묶인다. 해시하지 않고 값 그대로 저장한다.

저장 값호스트원본이 무엇이었나
none1,523 (51%)TXT 레코드 자체가 없다 — 절반이 같은 값이라 묶는 데 못 쓴다
spf687v=spf1 include:… ~all — 메일 발신 정책만
other,spf,verify286위 + google-site-verification=… 같은 소유 확인
spf,verify233〃
verify180소유 확인만

ns — DNS 네임서버 · 채움 100% · immutable · 등급 B 사용가능 신규

도메인을 사면 「이 도메인 질문은 어느 서버에게 물어봐라」를 지정한다. 그게 NS 레코드다. 기본값은 등록대행사 것이고, Cloudflare·Vercel 을 쓰면 그쪽으로 바꾼다. 해시하지 않고 값 그대로 저장한다. r3 스캔이 이미 751/751 받아놨다.

Cloudflare 는 계정마다 고정된 NS 쌍을 준다 — 사람 이름이 붙은 그것이고, 그 계정에 넣은 모든 도메인이 같은 쌍을 받는다. 즉 이 값은 「Cloudflare 를 쓴다」가 아니라 「누구의 Cloudflare 계정인가」다. IP·hdr 축이 160호스트를 전부 「Cloudflare」로 뭉뚱그린 그 구간을 NS 가 유일하게 가른다.
저장 값 (= 원본)호스트무엇을 뜻하나
arushi.ns.cloudflare.com, giancarlo.ns.cloudflare.com14 같은 Cloudflare 계정 14개 도메인
dalary.ns.cloudflare.com, donovan.ns.cloudflare.com9다른 계정
edna.ns.cloudflare.com, elliott.ns.cloudflare.com9또 다른 계정
ns1.vercel-dns.com, ns2.vercel-dns.com112 🔴 전 고객이 같은 값 — 계정을 못 가른다
dns1.registrar-servers.com, dns2.registrar-servers.com111 🔴 Namecheap 기본 — 〃
curitiba.ns.porkbun.com, fortaleza…24🔴 Porkbun 기본 — 〃

제공자별 — 계정을 가르나

제공자호스트NS 종류종류/호스트판정
cloudflare.com1601230.77개별 할당
domaincontrol.com GoDaddy58310.53혼재
nsone.net2690.35혼재
dns-parking.com Hostinger3890.24혼재
vercel-dns.com11210.01공유 기본값
registrar-servers.com11110.01공유 기본값
name.com3540.11공유 기본값 — ns1hwy·ns1cny 처럼 무작위로 보이나 서버 풀 배정이라 계정 단위가 아니다
porkbun.com2410.04공유 기본값
축 하나로 전부를 덮지 못한다
전체 710호스트 기준 — 개별 할당 256(36%) · 공유 기본값 302(43%) · 혼재 152(21%).
NS 는 Cloudflare 구간의 특효약이고, Vercel·Namecheap 구간(223호스트·31%)에는 아무 정보를 안 준다. 그 구간은 여전히 셸 지문 말고 잡을 것이 없다.

⚠️ 아직 라벨로 검정하지 않았다. 「같은 NS 쌍 = 같은 운영자」는 Cloudflare 의 배정 방식에서 따라 나오는 구조적 근거이지, rug 라벨과 대조한 결과가 아니다.

이미지 인코더 지문 · 채움 🔴 24% · immutable · 등급 A 고유가치

토큰 이미지 앞 4KB 만 받아 어떤 도구로 만들었나를 읽는다. image.match_key(같은 이미지인가)와 다르다 — 이쪽은 다른 이미지라도 같은 도구를 잡는다. 해시하지 않고 값 그대로 저장한다.

저장 값호스트예판정
PNG:1254x1254:caBX:7lifeisagamble.lol
simonsaysape.lol
인코더까지 보인다
PNG:1254x1254:pHYs:1felicetterobinhood.fun〃 다른 인코더
JPEG|PNG:508x504:IDAT:1uotf.site〃
WEBP22cornishstuff.com
news4sanantonio.com
포맷 이름뿐
JPEG19claynosaurzstrategy.fun
akitainuelon.org
〃
왜 「청크 이름」이 도구를 가르나 — PNG 는 IHDR(크기·색심도) 뒤에 선택적 청크가 온다. 어떤 것을 어떤 순서로 넣을지는 인코더 구현이 정하고 사용자는 건드리지 않는다. 그래서 같은 도구로 만든 이미지는 내용이 달라도 이 자리가 같다. 형식은 RFC 2083 으로 고정이라 앞 4KB 만 받으면 판정된다.

🔴 JPEG·WEBP 는 지금 파서가 매직바이트만 보고 포맷 이름을 뱉는다. JPEG 는 APP 마커 순서로, WEBP 는 청크 구성으로 같은 수준의 지문을 만들 수 있는데 아직 안 했다 — 그래서 41호스트가 「WEBP 를 쓴다」 이상을 말하지 못하고 묶여 있다.

2.1 실제 값 — 상위 지문은 대부분 플랫폼 기본값이다

각 축에서 가장 많이 뭉친 값과 그 값을 가진 호스트를 나란히 놓았다. 서로 무관한 사이트가 같은 값을 갖는다면 그 값은 운영자 지문이 아니다.

robots — 46.2% 만 갖고 있고, 뭉친 것은 CDN 기본값이다

해시호스트실제 내용같이 묶인 것판정
d53d5a75c14196 User-agent: *
Content-Signal: search=yes,ai-train=no,use=reference
Allow: / …(주석 뺀 21줄)
deadairsol.pro (밈코인)
foolslife.online (밈코인)
nebraskaexaminer.com (미국 지역신문)
Cloudflare 기본
871166c9f7c9103 User-agent: Googlebot / Allow: /
User-agent: Bingbot / Allow: / …
knowyourrmeme.com
usms.live
확인 필요
d41d8cd98f00103 🔴 빈 문자열의 md5. foboterminal.com 은 25줄이 전부 주석이라 정규화 후 0줄이 됐다 서로 무관한 103개 버그 — null 이어야

style — 31.9%. 상위 값은 CSS 리셋 템플릿이다

해시호스트실제 내용 (앞부분)같이 묶인 것판정
1ceb4de319a762 *{box-sizing:border-box;margin:0;padding:0}html{line-height:1.15;-webkit-text-size-adjust:100%;color:#313131;font-family:system-ui… (1,197자, 두 호스트 완전 동일) nebraskaexaminer.com
cornishstuff.com
둘 다 일반 뉴스 사이트
공용 테마
625c33d3105321 body { background-color: #f5f5f5; margin-top: 8%; color: #5d5d5d; font-family: -apple-system… (1,072자) gigagaga.top
ansemup.pro
확인 필요

hdr — 90.4%. 값 자체가 호스팅 시그니처다

호스트헤더 이름 순서 (앞부분)예판정
331access-control-allow-origin|age|cache-control|content-disposition|… svmscope.vercel.appVercel
213cache-control|content-length|content-type|date|server|strict-transport… gustacio.site확인 필요
113date|content-type|transfer-encoding|connection|cache-control|strict-tr… usms.liveCloudflare
76date|content-type|transfer-encoding|connection|cf-cache-status|… foboterminal.comCloudflare

txt — 51% 가 none 이라 변별력이 거의 없다

값호스트뜻
none1,523 (51%)TXT 레코드가 없다 — 절반이 같은 값이라 묶는 데 못 쓴다
spf687메일 발신 정책만 설정
other,spf,verify286소유 확인까지 — 실제 조직일 가능성
spf,verify233〃

이미지 인코더 — 확보 24%, 그나마 절반이 포맷뿐이다

값호스트예판정
WEBP22cornishstuff.com, news4sanantonio.com포맷만 — 인코더 정보 없음
JPEG19claynosaurzstrategy.fun〃
PNG:1254x1254:caBX:7lifeisagamble.lol, simonsaysape.lol인코더 지문 성립
JPEG|PNG:508x504:IDAT:1uotf.site〃
PNG 만 인코더가 보인다. JPEG·WEBP 는 지금 파서가 포맷 이름만 뽑아 「WEBP 를 쓴다」 이상을 말하지 못한다. JPEG 는 APP 마커 순서로, WEBP 는 청크 구성으로 같은 수준의 지문을 만들 수 있는데 아직 안 했다.

채움률 실측 — 응답 2,987 기준

축있음채움률
hdr2,70090.4%
txt (none 아닌 것)1,46449.0%
rob1,38146.2%
style95231.9%
rob·style 조합호스트비율
둘 다 있음58019.4%
하나만1,17339.3%
둘 다 없음1,23441.3% — 변별력 0
여기서 나오는 결론
① 빈 해시를 null 로 바꾼다 — d41d8cd98f00 103호스트가 가짜로 묶여 있다.
② 플랫폼 기본 지문 목록을 만든다 — Cloudflare·Vercel 이 심는 robots·헤더순서·CSS 리셋. IP 축에서 CDN ASN 을 뺀 것과 같은 처리다.
③ JPEG·WEBP 파서를 인코더 수준으로 올린다 — 지금은 포맷 이름뿐이라 41호스트가 무의미하게 묶인다.
④ 그 뒤에 재집계한다. §3 의 39% 는 그 전 수치다.

2.2 축의 성격 — 무엇에 흔들리나

지문은 「같은 운영자면 같은 값」이어야 쓸모가 있다. 그런데 발행자가 사이트마다 디자인을 바꾸면 그 축은 매번 값이 달라져 아무것도 못 묶는다. 실제로 그런지 쟀다. 결과는 예상과 달랐다 — style 만이 아니라 rob 도 불안정하다.

측정 방법 — 같은 운영자를 어떻게 잡았나

전용 IP(비 CDN)에 3호스트 이상 올라와 있는 무리 32개를 「같은 운영자일 가능성이 높은 집합」으로 봤다. CDN·PaaS 는 고객끼리 IP 를 돌려쓰므로 ASN 으로 제외했다(§4 와 같은 처리). 그 무리 안에서 각 축의 값이 몇 종류인지 세면, 축이 운영자를 따라가는지 사이트를 따라가는지 갈린다.

축무리 안에서 하나로 유지호스트마다 전부 다름무엇에 흔들리나
ns이번 32무리 측정에 안 넣었다 — r3 스캔에만 있고 홀드아웃 스캔에서 안 받았다 디자인·호스팅과 독립 도메인 설정이라 사이트를 다시 만들어도 그대로. 바꾸려면 등록대행사에서 직접 손대야 한다
txt17 (53%)2 (6%) 디자인과 무관 DNS 설정이라 사이트를 다시 만들어도 그대로 간다
style11 (34%)10 (31%) 🔴 디자인을 바꾸면 바뀐다 리셋 CSS 뿐 아니라 색·여백 같은 디자인 값이 같은 <style> 에 들어 있다
rob10 (31%)11 (34%) 🔴 가장 불안정하다 「빌더 기본이라 안 변한다」고 봤으나 실측은 반대다 — 무리의 34% 가 호스트마다 다르다
hdr9 (28%)7 (22%) 호스팅을 옮기면 통째로 디자인엔 안 흔들리나, 같은 IP 안에서도 응답 경로(캐시 적중·오류)에 따라 갈린다

같은 공장인데 습관이 갈린다

전용 IP호스트style 종류읽는 법
147.93.159.47 CT-47111 템플릿 고정 11개 사이트가 CSS 가 완전히 같다 — style 이 잘 듣는다
185.41.148.261〃
194.58.68.5961〃
93.188.163.111 HG-111109 매번 바꾼다 같은 서버·같은 운영자인데 CSS 가 사이트마다 다르다
34.149.87.4599전부 다름
38.46.220.1324515 부분 45호스트가 style 로는 15조각으로 쪼개진다
여기서 나오는 것 — 「넷이 전부 일치」 규칙이 성립하지 않는다
같은 공장이라도 CT-47 은 템플릿을 고정해 쓰고 HG-111 은 매번 바꾼다. 축이 듣느냐가 그 공장의 습관에 달렸고 우리가 미리 알 수 없다.

안정적인 것은 txt 하나뿐이고(유지 53% · 전부다름 6%), 그마저 51% 가 none 이라 변별력이 낮다. style(31%)·rob(34%)·hdr(22%) 은 같은 운영자 안에서도 갈린다.

→ 지금처럼 넷이 전부 일치해야 한 무리로 두면 HG-111 같은 공장은 원리상 못 묶는다. 「전부 일치」가 아니라 「몇 개가 일치하는가」로 점수를 매기는 형태로 바꿔야 한다 — 그러면 축 하나가 흔들려도 나머지가 받친다.
왜 style 만 디자인에 흔들리나 — 우리가 <head> 안 <style> 을 통째로 해시하기 때문이다. 거기에는 빌더가 심은 리셋 CSS 와 운영자가 고른 색·여백이 섞여 있다. 실제 값을 보면 드러난다 —
body { background-color: #f5f5f5; margin-top: 8%; color: #5d5d5d; font-family: -apple-system…
background-color 하나만 바꿔도 해시가 통째로 달라진다. 리셋 부분만 떼어내 해시하면 안정성이 올라갈 수 있으나 아직 안 해봤다(§6).

3. 실측 — 「39%」는 인공물이었다

🔴 이 절의 이전 판을 뒤집는다. 「묶임 39% · 토큰 37%」라고 적었던 수치는 버그가 만든 것이다.

지문이 없는 축을 빈 문자열로 두고 그대로 키에 넣었다. 그래서 「robots 없음 + style 없음」인 호스트끼리 서로 일치로 세어졌다. md5('') 하나가 103호스트를 가짜로 묶은 것도 같은 원인이다.
지문이 없다는 것은 「같다」가 아니라 「비교 불가」다. 축 값이 없는 호스트를 그 조합에서 제외하고 다시 집계한 것이 아래다.

원 실험(2026-08-24~26 창)의 규칙을 홀드아웃 창(08-26~09-01)에 적용했다. 응답 2,987 호스트, 이 호스트들을 건 토큰 4,991 이 모수다.

축 조합4축 보유군집묶인 호스트덮는 토큰
r3 원본 4축 robots+헤더+style+TXT374 (13%)41738
TXT 제거540 (18%)105475
robots+헤더+NS ← 채택1,137 (38%)25131 (4.4%)291 (5.8%)
🔴 r3 원본 4축은 홀드아웃에서 사실상 작동하지 않는다. 4축을 전부 가진 호스트가 13%뿐이고, 거기서 나온 군집은 4개 · 17호스트다. 발목을 잡는 건 style(채움 31.8%)과 TXT 다.

TXT 는 축이 아니다. 고유값이 13개뿐이고 spf 하나가 46.9% 를 덮는다 (엔트로피 2.11 bits). 4중 AND 의 한 자리를 차지하면서 정보는 거의 주지 않고 보유율만 49% 로 깎는다. NS 로 교체하면 7.10 bits · 채움 92.2% 다.

축채움고유값최빈값 점유엔트로피
style31.8%7706.5%9.02 bits
robots42.5%9558.0%8.91 bits
헤더 이름 순서92.7%1,00712.4%7.65 bits
DNS NS92.2%92216.5%7.10 bits
DNS TXT49.0%1346.9%🔴 2.11 bits

rawHeaders 수정은 군집을 바꾸지 않았다. axios 의 정규화 객체는 실제로 호스트의 93.6% 에서 헤더를 떨구지만(content-encoding 등), 엔트로피는 7.63 → 7.65 bits, 군집 결과는 25개로 동일했다. 정확성 수정이지 성능 개선이 아니다.

3.1 「운영자」라고 부를 수 있는 것은 그중 일부다

묶였다고 다 같은 운영자가 아니다. NS 가 계정별로 개별 할당되는가로 갈린다 (§2.2 의 제공자별 비율).

등급군집호스트토큰근거
강82855 (1.1%)NS 가 개별 할당 — Cloudflare, 645호스트 → 504종(0.78). NS 자체가 계정 지문
약1490226 (4.5%)공용 NS + IP 1종. name.com 0.04 · registrar-servers 0.01 — NS 는 신호가 아니고 IP 1종만 남는다
🔴 「약」 등급은 공용 호스팅과 구분되지 않는다. 최대 군집(36호스트)에는 knowyourrmeme.com 과 ansemfartdust.com 이 같이 들어 있다. 같은 IP · 같은 name.com NS 인데, name.com 은 NS 를 계정별로 주지 않는다. 「전용 IP」인지 「공용 호스팅 IP」인지는 이 3,108 호스트 안에서는 판정할 수 없다 — 그 IP 에 우리가 안 본 도메인이 몇 개나 더 있는지 모르기 때문이다. 확정하려면 IP 역방향 조회가 필요하다.

확실한 것들도 있다. 방법이 옳게 작동한다는 증거로 참 양성 두 개가 잡혔다 — x.com+twitter.com, 그리고 Sinclair 계열 지역방송 news4sanantonio.com+local12.com. 둘 다 실제로 같은 운영자다. 밈코인 쪽에서는 averagejoecoin.lol+simonsaysape.lol+farticusmaximus.fun, rufussolan.top+blazesolana.top+beefysolana.top 같은 묶음이 나온다.

3.2 그래서 실시간 라벨링이 되나

지금 축만으로는 토큰의 1.1%(강) ~ 5.8%(강+약) 다. 원 실험이 시사한 37% 와는 자릿수가 다르다. 격차의 원인은 셋이고, 전부 채움률이다 — style 31.8%, robots 42.5%, 그리고 아직 못 뚫은 이미지 인코더 축(24%). 이미지 축은 r3 의 L2 1차 분할자였고, IPFS 게이트웨이 차단 때문에 비어 있다.

4. 축이 되지 못한 것 — 상품 축 4종의 실패

같은 창에서 검정했고 전부 부정이었다. 다시 파지 말 것.

축가설결과무너진 지점
registrar + certIssuer + server 지문 조합이 재등장하면 같은 운영자가 옮긴 것 변별력 없음 매치에 linktr.ee 와 Steam 상점이 들어왔다. registrar 1068 배경 점유 16.4%
도메인 나이공장은 갓 산 도메인을 쓴다 리프트 1.2배 군집 <7일 53% vs 비군집 44%. 군집의 29% 가 1년 넘은 도메인이라 신생 규칙은 3분의 1을 놓친다
도메인 등록일 배칭한 번에 사두면 등록일이 뭉친다 배경과 무구분 뭉친 4군집이 전부 08-25·08-26 인데 그 이틀이 배경 최다 등록일(238·231건)이었다
IP 단독같은 IP = 같은 운영자 정밀도 없음 19군집 중 11개가 공유 플랫폼 — Cloudflare Spectrum · Wix · WordPress.com · SEDO 파킹
배경 발생률을 먼저 재지 않으면 전부 「유의해 보인다」. 위 넷은 배경을 재는 순간 죽었다. 새 축을 검정할 때 이 단계를 건너뛰지 말 것 — social-af-signal/pitfalls.md P24 에 사례로 남겼다.

5. 저장 형태 — 버전을 달지 않으면 조용히 깨진다

정규화 규칙을 한 줄만 고쳐도 과거 해시가 전부 무의미해진다. 그런데 값은 여전히 「있기」 때문에 아무도 눈치채지 못하고, 군집만 어긋난다.

data.shell = {
  v: 1,          // 규칙이 바뀌면 2 로 올린다. 다른 v 끼리는 비교하지 않는다
  rob, hdr, style, txt,
  proto: 'h1',   // HTTP/2 는 헤더 표현이 달라 비교가 성립하지 않는다
}
축정규화 규칙 (v1)
rob줄마다 # 뒤 제거 · trim · 소문자 → 빈줄 제거 → \n 결합 → 공백 축약 → md5 앞 12자
hdrres.rawHeaders 의 이름만 순서대로 | 결합. ⚠️ axios 의 정규화 객체를 쓰면 개수가 달라진다(실측 10 vs 11)
style<head> 안 모든 <style> 내용 → 공백 축약 → | 결합 → md5 앞 12자
txt각 TXT 를 spf/dmarc/verify/dkim/other 로 축약 → 정렬 결합. 없으면 none
이미지PNG:{W}x{H}:{IHDR 다음 청크명}: · JPEG · WEBP. 여러 형식이면 정렬해 | 결합
🔴 해시만 저장하면 나중에 검증할 수 없다 — 원본 앞부분을 함께 남긴다
이번에 실제로 당했다. d53d5a75c141 96호스트를 「같은 도구로 만든 군집」이라 며칠 믿었는데, 내용을 직접 받아보니 Cloudflare 기본 파일이었다. 해시는 「같은가」는 답하지만 「무엇인가」는 못 답한다.
data.shell = {
  v: 1,
  rob: 'd53d5a75c141',
  robHead: 'User-agent: * / Content-Signal: search=yes,ai-train=no…',   // 앞 120자
  style: '1ceb4de319a7',
  styleHead: '*{box-sizing:border-box;margin:0;padding:0}html{line-…',  // 앞 120자
  hdr, txt, proto: 'h1',
}
호스트당 240자가 늘지만, 이것이 없으면 플랫폼 기본값을 운영자 지문으로 착각한 채 계속 간다.

저장 위치는 contents.data 하위다. 최상위는 쿼리·정렬 축만 두는 것이 이 레포 규약이고, 지문은 조회 축이 아니라 비교 대상이다. 인덱스는 지금 만들지 않는다 — 실제로 도는 쿼리가 생긴 뒤에 판단한다.

6. 미결 · 다음

✅ 처리됨 — ns 수집(채움 92.2%)과 빈 해시 null 화(103→0), rawHeaders 원본 순서 저장을 shellscan.js 에 반영하고 3,108호스트를 재실측했다. 그 결과가 §3 이다. TXT 는 축에서 제외하고 NS 로 교체했다.
항목상태무엇이 필요한가
이미지 인코더 축 채움률🔴 24% (69/287) 공개 IPFS 게이트웨이가 막혀 있다 — ipfs.io·nftstorage.link 403(우리 출구 IP 차단, 공개 hello-world CID 도 동일), 4everland 는 Cloudflare 챌린지가 오르내린다. ipfs.filebase.io 가 안정적이었으나 3회만 재봤다
수집 시점 1회 캡처미착수 「필요할 때 다시 받는다」가 아니라 토큰 수집 시점에 한 번 받아 저장해야 외부 의존이 1회로 끝난다. scanner-data T7(첫 관측 후 갱신 안 함)이 지문에는 맞는 성질이나, 첫 수집 실패 시 영구 결손이라 재시도 경로가 함께 필요하다
style 을 리셋 CSS 만으로 좁히면 안정될까미검증지금은 <style> 전체를 해시해 디자인 값이 섞인다(§2.2). 리셋·유틸 부분만 떼어 해시하면 무리 안 유지율이 34%보다 오를 수 있다
「약」 등급이 전용 IP 인가🔴 판정 불가 14군집·90호스트·토큰 226(4.5%)이 여기 걸려 있다. 공용 NS + IP 1종인데, 그 IP 에 우리가 안 본 도메인이 몇 개 더 있는지 모른다. IP 역방향 조회(passive DNS)가 있어야 「전용」과 「공용 호스팅」이 갈린다
robots·style 채움률✅ 42.5% · 31.8% 측정했다(§3). 이 둘이 규모의 병목이다 — r3 4축을 전부 가진 호스트가 13%뿐인 이유
favicon만들지 않는다 website-image §7 이 후보로 올렸으나, 원 실험도 751호스트 전부 null 이었다. 실제로 쓰인 적이 없는 축이다
근거와 재현
실행 기록 · 축 명세 전문 — docs/experiments/web-deploy-cohorts/runs/2026-09-01-r3-replication.md
원 방법 — docs/experiments/web-deploy-cohorts/runs/2026-08-27-recent3d-clustering.html
스크립트 — docs/experiments/web-deploy-cohorts/scripts/{shellscan,imgsig,l1l2}.js · 원자료 runs/data/2026-09-01-*.json
코드 수정안 — docs/drafts/website-fingerprint-gaps.md (설명 페이지: -explainer.html)
스크립트 — docs/experiments/web-deploy-cohorts/scripts/{shellscan,imgsig,l1-strict,hosttok}.js
실수 원장 — docs/experiments/social-af-signal/pitfalls.md P23~P26 (P26 이 이 문서 §3 의 철회 사유다)