1. 문제의 발단: "수익 손실 위험" 경고
어느 날과 다름없이 애드센스에 접속했는데, 섬뜩한 경고 메시지가 저를 반겼습니다.
"수익 손실 위험 - 하나 이상의 사이트에서 ads.txt 파일을 찾을 수 없습니다."
분명히 ads.txt 파일을 루트 도메인에 잘 업로드해서 승인까지 받았는데 갑자기 왜 이런 문제가 생긴 걸까요?
곰곰이 생각해보니 최근 블로그 구조에 큰 변경이 있었습니다.
- 기존:
example.com(타사 호스팅, 티스토리) - 변경:
example.com(클라우드플레어, 블로그스팟으로 메인 변경)blog.example.com(클라우드플레어, 기존 티스토리 블로그)
도메인 관리 업체를 클라우드플레어로 이전하고, 메인 도메인을 블로그스팟(Blogspot)으로 변경하면서 문제가 발생한 것이었습니다. 애드센스 크롤러가 새롭게 연결된 example.com (블로그스팟)에서 ads.txt 파일을 찾지 못하는 것이 분명했습니다.
2. ads.txt는 어디에 있어야 하는가?
가장 먼저 든 의문은 'blog.example.com에서 광고가 나오는데 ads.txt는 어디에 있어야 하나?'였습니다.
정답: ads.txt 파일은 무조건 '루트 도메인'에 있어야 합니다.
애드센스는 blog.example.com 같은 서브도메인에서 광고가 송출되더라도, 그 사이트의 루트 도메인(Root Domain), 즉 example.com으로 접속하여 https://example.com/ads.txt 파일을 검사합니다.
따라서 저는 새롭게 메인 도메인이 된 블로그스팟에 ads.txt를 설정해야 했습니다.
3. 터미널(curl)을 이용한 문제 추적
단순히 브라우저로만 확인하면 '캐시(Cache)' 때문에 정확한 상태를 알기 어렵습니다. 저는 터미널의 curl 명령어를 사용해 서버의 진짜 응답을 확인했습니다.
1단계: 301 리디렉션 확인
ads.txt 파일에 접속을 시도하면 어떤 응답이 오는지 확인했습니다.
curl -o /dev/null -s -w "%{http_code}" "http://example.com/ads.txt"
301%
301 코드는 '영구 이동(Moved Permanently)'을 의미합니다. 즉, http://example.com/ads.txt는 다른 주소로 리디렉션되고 있다는 뜻입니다. (클라우드플레어의 HTTPS 강제 설정이나 www 리디렉션 규칙 때문입니다.)
2단계: 최종 목적지 확인
curl -IL 옵션으로 리디렉션의 최종 목적지를 추적했습니다.
curl -IL "http://example.com/ads.txt"
HTTP/1.1 301 Moved
Location: http://www.example.com/ads.txt <-- 1차 이동 (www로)
HTTP/1.1 301 Moved Permanently
Location: https://www.example.com/ads.txt <-- 2차 이동 (https로)
HTTP/2 200 <-- 최종 도착 (200 OK)
...
애드센스 크롤러가 최종적으로 도착하는 주소는 https://www.example.com/ads.txt였습니다.
4. 결정적 단서: 'content-length: 0'
최종 목적지에서 200 OK 응답이 왔다는 것은 파일이 존재한다는 뜻입니다. 하지만 애드센스는 왜 파일을 못 찾았다고 할까요?
다시 curl -IL 명령의 응답 헤더를 자세히 살펴봤습니다.
curl -IL "https://www.example.com/ads.txt"
HTTP/2 200
...
content-type: text/plain; charset=UTF-8
content-length: 0 <-- !!!!!!!!!!!! 결정적 단서
...
content-length: 0
범인은 이것이었습니다. 파일은 존재하지만, 그 내용물이 완전히 비어 있다(0 바이트)는 뜻입니다.
애드센스 크롤러가 파일을 성공적으로 찾았지만(200 OK), 막상 열어보니 아무 내용도 없어서 경고를 보낸 것입니다.
5. 해결: 블로그스팟에 ads.txt 코드 입력하기
원인은 간단했습니다. 블로그스팟 설정에서 '맞춤 ads.txt' 기능을 켰지만, 정작 텍스트 상자에 코드를 붙여넣고 '저장'을 하지 않았던 것입니다.
- 블로그스팟 대시보드 > 설정 > 수익 창출 섹션으로 이동합니다.
맞춤 ads.txt 사용옵션을 활성화(ON)합니다.- 바로 아래
맞춤 ads.txt메뉴를 클릭합니다. - 열리는 텍스트 상자에 애드센스
ads.txt코드를 붙여넣습니다.
(예:google.com, pub-xxxxxxxxxxxxxxxx, DIRECT, ...) - '저장' 버튼을 반드시 클릭합니다.
6. 마지막 함정: 브라우저와 서버 캐시
설정을 완료한 후, https://www.example.com/ads.txt에 접속해 보니 여전히 빈 화면이 나왔습니다.
하지만 시크릿 모드(Secret Mode)로 접속하니, ads.txt 코드가 정상적으로 출력되었습니다.
- 일반 창: 브라우저가 '내용이 비어있던' 낡은
ads.txt파일을 캐시(임시 저장)하고 있어서 빈 페이지만 보여줌. - 시크릿 창: 캐시 없이 서버에서 직접 새 파일을 받아오므로, 방금 저장한
ads.txt코드가 정상적으로 보임.
이때 curl 명령어로 다시 확인해도 여전히 content-length: 0이 나올 수 있습니다. 이는 브라우저 캐시와는 별개로 클라우드플레어 같은 CDN 서버에 '빈 파일' 상태가 캐시로 남아있기 때문일 수 있습니다.
가장 중요한 것은 시크릿 창에서 내용이 보이는 것입니다. 시크릿 창에서 코드가 보인다면, 애드센스 크롤러도 이 내용을 정상적으로 읽어갈 수 있습니다. curl 결과가 당장 빈 파일로 나와도 심각하게 고민할 필요가 없으며, 이 서버 캐시는 1시간에서 24시간 이내에 천천히 반영됩니다.
7. 결론
도메인 이전 후 ads.txt 오류가 발생한다면, 다음 3가지를 확인해 보세요.
ads.txt는 루트 도메인에 설정되어 있는가?- 블로그스팟의 경우, '맞춤 ads.txt' 설정에 코드를 넣고 '저장'했는가? (이것이
content-length: 0의 주된 원인입니다.) - 수정 후 시크릿 창으로
ads.txt경로에 접속했을 때 코드가 정상적으로 보이는가?
curl에서 content-length: 0이 계속 나오더라도, 시크릿 창에서 보인다면 캐시 문제일 뿐이므로 걱정하지 않아도 됩니다.
이제 애드센스 대시보드에서 경고가 사라질 때까지 20분에서 1시간 정도 기다리기만 하면 됩니다.


