Summary#
웹 collector의 중복 억제는 단순히 URL 문자열을 비교하는 문제가 아니다. 안정적인 수집 파이프라인은 보통 URL 정규화, HTTP 재검증, 본문 추출, 콘텐츠 지문, 근사 중복 탐지, 출처/정본성 판단을 함께 사용해야 한다. 실패 모드는 크게 두 방향이다.
- 중복을 놓치는 경우: 같은 문서가 다른 URL, 추적 파라미터, RSS/HTML 경로, 모바일/AMP/인쇄용 페이지, syndication 페이지로 반복 수집된다.
- 서로 다른 문서를 중복으로 잘못 억제하는 경우: pagination, live blog, 업데이트 기사, 동일 템플릿을 공유하는 짧은 글, 같은 제목의 다른 문서가 하나로 합쳐진다.
collector 계층에서 이 문제가 해결되지 않으면 이후 capsule/claim 생성 단계는 동일 근거를 반복 학습하거나, 오래된 사본을 정본으로 오인하거나, 서로 다른 주장들을 하나의 문서로 병합하는 오류를 전파한다.
Key Points#
- URL 정규화는 필요하지만 충분하지 않다.
- RFC 3986 기준으로 scheme/host 대소문자, percent-encoding, dot-segment, 기본 포트, fragment 제거 등은 기본 정규화 대상이다.
- 그러나 query parameter는 도메인별 의미가 다르다.
utm_*,fbclid,gclid같은 tracker는 제거해도 되는 경우가 많지만,?page=2,?id=123,?lang=ko,?sort=recent는 콘텐츠를 바꿀 수 있다. -
따라서 전역 규칙과 사이트별 allowlist/denylist를 분리해야 한다.
-
rel=canonical은 강한 신호지만 절대 진실은 아니다. - Google 문서는 중복 URL 통합을 위해 canonical 링크, redirect, sitemap 등을 사용할 수 있다고 설명한다.
- 하지만 collector에서는 canonical을 무조건 신뢰하면 안 된다. 사이트가 모든 기사에 홈페이지를 canonical로 넣거나, syndicated copy가 원출처가 아닌 자기 URL을 canonical로 넣거나, pagination이 1페이지를 canonical로 지정해 후속 페이지를 잃는 경우가 있다.
-
권장 정책은
declared_canonical_url과effective_collector_key를 분리 저장하고, canonical 적용은 redirect chain, HTTP status, 본문 유사도, source trust와 함께 판단하는 것이다. -
redirect chain은 수집 키 결정에 포함되어야 한다.
http → https,www → apex, 모바일 도메인, AMP URL, shortlink는 동일 문서일 가능성이 높다.- 다만 redirect 목적지가 soft-404, consent wall, geo wall, login wall이면 잘못된 병합이 발생할 수 있다.
-
최종 URL뿐 아니라 original URL, redirect chain, status code를 모두 보존해야 재현성과 감사가 가능하다.
-
HTTP 재검증은 idempotent fetch의 핵심이다.
ETag와Last-Modified는 이미 수집한 리소스가 바뀌었는지 확인하는 데 유용하다.- 조건부 요청을 사용하면 같은 URL을 반복 다운로드하지 않고도 변경 여부를 확인할 수 있다.
-
단, 서버가 ETag를 불안정하게 생성하거나, 동일 콘텐츠에도 매 요청 다른 ETag를 주거나, Last-Modified를 부정확하게 제공하는 경우가 있다. 따라서 HTTP validator만으로 중복 여부를 결정하면 안 된다.
-
콘텐츠 fingerprint는 URL 기반 dedup의 보완재다.
- 원문 HTML 전체 hash는 광고, 추천 기사, timestamp, cookie banner 때문에 자주 바뀐다.
- 더 안정적인 방식은 boilerplate 제거 후 article text, title, author, published time, canonical URL 등을 정규화하여 hash를 만드는 것이다.
-
exact hash는 동일 사본 탐지에 강하고, SimHash/MinHash 계열은 근사 중복 탐지에 유용하다.
-
근사 중복 탐지는 임계값 설계가 중요하다.
- SimHash류 접근은 대규모 웹 크롤링에서 near-duplicate 탐지에 쓰일 수 있다.
- 하지만 짧은 문서, 보도자료 기반 기사, 동일 템플릿 문서에서는 false positive가 늘어난다.
-
collector는 “중복으로 삭제”보다 “중복 후보 cluster로 묶고 대표 문서를 선택”하는 방식이 안전하다.
-
RSS와 HTML 경로는 같은 문서를 중복 수집하기 쉽다.
- RSS feed의
<link>,<guid>, HTML의 canonical URL, OpenGraph URL, 실제 fetch URL이 서로 다를 수 있다. - RSS
guid가 permalink가 아니거나, feed item이 업데이트될 때 guid는 유지되지만 link가 바뀌는 경우도 있다. -
feed ingestion에서는
feed_id + guid,link URL,canonical URL,content fingerprint를 모두 별도 키로 저장하고 reconciliation해야 한다. -
pagination과 series 문서는 특별 취급해야 한다.
?page=2,/page/2,rel=next/prev, infinite scroll API는 같은 기사 일부일 수도 있고 별도 문서 목록일 수도 있다.- 첫 페이지만 canonical로 지정된 다중 페이지 기사는 나머지 페이지가 중복으로 억제될 위험이 있다.
-
collector는 pagination URL을 무조건 tracker로 취급하지 말고, 본문 연속성 및 page marker를 확인해야 한다.
-
syndication은 duplicate suppression과 provenance를 분리해야 한다.
- AP/Reuters/보도자료/기관 공지처럼 동일하거나 거의 같은 본문이 여러 사이트에 게재될 수 있다.
- 이를 하나의 content cluster로 묶는 것은 유용하지만, 각 게재 위치의 URL, 발행 시각, 편집 차이, 지역화된 제목은 보존해야 한다.
-
claim 생성에서는 원출처와 사본을 구별해야 하며, 단순히 먼저 수집된 URL을 canonical source로 삼으면 안 된다.
-
권장 collector record schema
original_urlnormalized_urlfinal_urlredirect_chaindeclared_canonical_urlog_urlfeed_guidfeed_linkhttp_statusetaglast_modifiedfetched_atcontent_typeraw_html_hashextracted_text_hashnear_duplicate_fingerprintduplicate_cluster_idsuppression_decisionsuppression_reason-
source_trust_notes -
안전한 duplicate suppression 정책
- URL 정규화만으로 삭제하지 말고 candidate cluster를 만든다.
- canonical URL은 신호로 저장하되, 즉시 병합하지 않는다.
- exact extracted-text hash가 같으면 강한 중복 후보로 본다.
- near-duplicate는 threshold와 문서 길이를 함께 본다.
- 짧은 문서, live update, pagination, 법령/문서 버전, changelog는 보수적으로 처리한다.
- suppression된 문서도 최소 metadata와 reason은 남긴다.
- 대표 문서 선정은 “가장 먼저 본 URL”이 아니라 source authority, canonical consistency, 발행 시각, redirect 안정성, 본문 완전성을 고려한다.
Cautions#
- 현재 실행 환경에서는 사용자가 요구한 별도의
WebSearch/WebFetch도구가 제공되지 않아, 실시간 검색 결과 검증과 fetch 기반 원문 확인을 수행하지 못했다. 아래 Sources는 공개적으로 알려진 신뢰 가능한 문서 URL을 기반으로 한 초안용 출처다. rel=canonical의 실제 동작은 검색엔진의 canonicalization과 내부 collector의 canonicalization이 다를 수 있다. 검색엔진 SEO 문서를 그대로 ingestion dedup 정책으로 옮기면 안 된다.- query parameter 제거 규칙은 사이트별로 달라야 한다. 전역적으로
id,page,lang,ref등을 제거하면 데이터 손실이 발생할 수 있다. - SimHash/near-duplicate 알고리즘은 대규모 후보 축소에는 유용하지만, 의미적 동일성을 보장하지 않는다.
ETag와Last-Modified는 서버 구현 품질에 의존한다. validator 불일치, CDN 변형, gzip/content negotiation 차이 때문에 콘텐츠 fingerprint와 함께 사용해야 한다.- RSS
guid는 항상 URL이나 영구 식별자가 아니다. feed producer의 관행을 확인해야 한다. - syndicated content는 “중복 제거”보다 “동일 계열 문서 cluster화”가 더 안전하다. 출처별 metadata를 삭제하면 provenance가 손상된다.
Sources#
- https://www.rfc-editor.org/rfc/rfc3986#section-6
- https://www.rfc-editor.org/rfc/rfc9110.html#name-validators
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Last-Modified
- https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls
- https://developers.google.com/search/docs/crawling-indexing/canonicalization
- https://www2007.org/papers/paper215.pdf
- https://www.rssboard.org/rss-specification
Sagwan Revalidation 2026-05-11T02:30:45Z#
- verdict:
ok - note: URL 정규화·canonical·redirect 관련 권장안은 현재도 유효함
Sagwan Revalidation 2026-05-12T02:59:43Z#
- verdict:
ok - note: URL 정규화·canonical·redirect 관련 권장안은 현재도 유효하다.
Sagwan Revalidation 2026-05-13T03:25:47Z#
- verdict:
ok - note: URL 정규화·canonical·redirect 관련 권장안은 여전히 유효함
Sagwan Revalidation 2026-05-14T04:00:33Z#
- verdict:
ok - note: URL 정규화·canonical·redirect 관련 권장안은 현재도 유효하다.
Sagwan Revalidation 2026-05-15T04:26:32Z#
- verdict:
ok - note: URL 정규화·canonical·redirect 관련 권장안은 여전히 유효하다.
Sagwan Revalidation 2026-05-16T04:55:13Z#
- verdict:
ok - note: URL 정규화·canonical·redirect 관련 권장안은 현재 practice와 부합함
Sagwan Revalidation 2026-05-17T05:13:51Z#
- verdict:
ok - note: URL 정규화·canonical·리다이렉트 관련 권장안은 여전히 유효하다.
Sagwan Revalidation 2026-05-18T05:35:51Z#
- verdict:
ok - note: URL 정규화·canonical·redirect 관련 권장안은 현재도 유효하다.
Sagwan Revalidation 2026-05-19T06:05:27Z#
- verdict:
ok - note: URL 정규화·canonical·redirect 관련 권장안은 현재 practice와 부합함
Sagwan Revalidation 2026-05-20T06:25:34Z#
- verdict:
ok - note: URL 정규화·canonical·redirect 관련 권장안은 현재도 유효하다.
Sagwan Revalidation 2026-05-21T06:30:08Z#
- verdict:
ok - note: URL 정규화·canonical·redirect 관련 권장안이 여전히 현행 practice와 부합함
Sagwan Revalidation 2026-05-22T06:55:16Z#
- verdict:
ok - note: URL 정규화·canonical·redirect 관련 권장안은 현재도 유효하다.
Sagwan Revalidation 2026-05-23T07:35:15Z#
- verdict:
ok - note: URL 정규화·canonical·redirect 관련 권장안은 현재도 실무적으로 유효함
Sagwan Revalidation 2026-05-24T07:54:32Z#
- verdict:
ok - note: URL 정규화·canonical·redirect 관련 권장안이 현재 practice와 부합함
Sagwan Revalidation 2026-05-25T08:23:20Z#
- verdict:
ok - note: URL 정규화·canonical·리다이렉트 관련 권장안은 현재도 유효하다.
Sagwan Revalidation 2026-05-26T08:27:24Z#
- verdict:
ok - note: [chatgpt 오류] The read operation timed out
Sagwan Revalidation 2026-05-27T09:04:30Z#
- verdict:
ok - note: URL 정규화·canonical·redirect 관련 권장안은 현재도 유효하다.
Sagwan Revalidation 2026-05-28T09:42:52Z#
- verdict:
ok - note: URL 정규화·canonical·리다이렉트 관련 권장안은 여전히 유효하다.
Sagwan Revalidation 2026-05-29T09:43:50Z#
- verdict:
ok - note: URL 정규화·canonical·리다이렉트 관련 권장안은 여전히 유효함
Sagwan Revalidation 2026-05-30T09:48:39Z#
- verdict:
ok - note: URL 정규화·canonical·redirect 관련 권장안은 현재도 유효하다.
Sagwan Revalidation 2026-05-31T10:21:58Z#
- verdict:
ok - note: URL 정규화·canonical·redirect 관련 권장안은 현재도 유효함
Sagwan Revalidation 2026-06-01T14:46:23Z#
- verdict:
ok - note: URL 정규화·canonical·redirect 관련 권장안은 여전히 최신 관행과 부합함
Sagwan Revalidation 2026-06-02T19:11:23Z#
- verdict:
ok - note: URL 정규화·canonical·redirect 관련 권장안은 현재도 유효하다.
Sagwan Revalidation 2026-06-03T20:12:18Z#
- verdict:
ok - note: URL 정규화·canonical·redirect 관련 권고가 현재 practice와 부합함
Sagwan Revalidation 2026-06-04T20:20:46Z#
- verdict:
ok - note: URL 정규화·canonical·리다이렉트 관련 권장안은 여전히 유효함