GitHub Pages 블로그를 구글 검색에 노출시키기

블로그를 만들어 배포하는 것으로 끝이 아니다. 사이트가 존재해도 구글이 그 존재를 모르면 검색으로는 아무도 찾아올 수 없다. GitHub Pages에 Hugo 사이트를 올린 상태에서 실제로 검색 노출까지 진행하며 한 일과, 그 과정에서 만난 함정을 정리한다.

검색에 뜨려면 무엇이 필요한가

블로그가 구글 검색 결과에 나타나려면 네 가지가 모두 갖춰져야 한다.

  1. 구글이 사이트의 존재를 알아야 한다 → Google Search Console에 등록
  2. 구글이 사이트를 크롤링할 수 있어야 한다 → robots.txt에 sitemap 링크
  3. 구글이 안에 무엇이 있는지 알아야 한다 → sitemap.xml 제출
  4. 구글이 페이지를 색인에 넣어야 한다 → 크롤링 대기 (3일~2주)

다행히 Hugo는 sitemap.xml을 기본으로 자동 생성하고, enableRobotsTXT = true만 켜 두면 robots.txt도 만들어 준다. 결국 실제로 손봐야 할 것은 몇 가지 SEO 보완과 Search Console 등록 정도다.

현재 상태 진단과 SEO 보완

먼저 배포된 사이트에서 세 가지가 정상인지 curl로 확인한다.

1
2
3
4
5
6
7
8
curl -sI "https://<도메인>/sitemap.xml"
# → HTTP 200, content-type: application/xml 이면 정상

curl -s "https://<도메인>/robots.txt"
# → User-agent: * 는 기본. Sitemap: 링크가 있는지 확인

curl -s "https://<도메인>/" | grep -oE '<meta [^>]*(description|og:|canonical)[^>]*>'
# → og:title, og:description, canonical 있는지 확인

Hugo + Stack 기본 구성이면 sitemap과 meta 태그는 이미 있지만, 두 가지가 빠져 있었다. robots.txt에 sitemap 링크가 없어서 구글이 사이트맵을 자동으로 발견하지 못하고, og:image가 없어서 검색 결과나 메신저 공유에서 썸네일이 뜨지 않는 문제다.

첫 번째는 layouts/robots.txt 파일을 만들어 해결한다. Hugo는 이 파일이 있으면 우선 사용한다.

1
2
3
4
User-agent: *
Allow: /

Sitemap: {{ "sitemap.xml" | absURL }}

absURL이 baseURL을 붙여 절대 경로로 렌더하므로 다중 도메인이나 리버스 프록시 환경에서도 안전하다.

두 번째는 hugo.toml의 defaultImage 블록을 활성화한다.

1
2
3
4
5
[params.defaultImage]
  [params.defaultImage.opengraph]
    enabled = true
    local = true
    src = "img/avatar.png"

local = truestatic/ 아래 경로를 그대로 쓴다. 개별 글에 cover 이미지가 있으면 그쪽이 우선하고, 없으면 이 기본값이 쓰인다.

Search Console 등록과 Sitemap 제출

Google Search Console에 로그인한 뒤 진행한다.

  1. 속성 추가 → URL 접두어를 선택하고 사이트 URL(예: https://<user>.github.io/)을 입력한다.
  2. 소유권 확인에서 HTML 파일 방식을 고르면 구글이 googleXXXX...html 파일을 준다.
  3. 이 파일을 블로그 프로젝트의 static/ 폴더에 그대로 두고 commit + push 한다.
  4. GitHub Pages 배포가 끝나면 https://<도메인>/googleXXXX...html로 접근되는지 curl로 확인한다.
  5. Search Console로 돌아와 확인 버튼을 누르면 “소유권이 확인됨"이 뜬다.

파일 내용은 google-site-verification: ... 한 줄뿐이다. 이 토큰 자체가 인증 역할을 하지만 저장소에 push해도 위험하지 않다. 다만 구글이 준 파일명과 내용은 이 사이트·이 계정 조합에서만 유효하다는 점만 기억하면 된다.

인증이 끝나면 왼쪽 메뉴 Sitemaps에서 입력란에 sitemap.xml만 넣고 제출한다. 처음에는 “가져올 수 없음"이 자주 뜨는데, 대부분 구글이 방금 등록된 속성을 캐시하는 중이거나 첫 fetch가 일시적으로 실패한 것이다. 12~48시간 기다리면 자동으로 재시도되어 “성공"으로 바뀐다. 급하면 사이트맵을 삭제 후 재제출해 강제로 다시 트리거할 수 있다.

우선 노출을 원하는 페이지가 있다면 상단 URL 검사 도구로 특정 URL을 넣고 색인 생성 요청을 할 수 있다. 홈(/), 대표·최신 글 몇 개, 핵심 카테고리 페이지 순으로 요청하면 몇 시간하루 안에 처리된다. 하루 요청 수 제한(1015개)이 있으니 중요한 URL부터, 한 URL당 한 번만 누른다.

노출까지의 시간차, 그리고 함정

세팅은 하루면 끝나지만, 실제 노출까지는 시간이 걸린다.

시점상태
지금site:<도메인> 검색 결과 0 (정상)
3~7일홈과 대표 글 색인 시작 → 결과 1~5개
1~2주대부분 페이지 색인 완료
이후고유 이름(블로그 제목 등)부터 상위 노출 시작

진행 상황은 두 곳에서 볼 수 있다. 구글에서 site:<도메인>을 검색하면 색인된 페이지 수를 대략 파악할 수 있고, Search Console의 색인생성 → 페이지에서 “색인 생성됨/미생성” 개수를 정확히 확인할 수 있다.

겪은 함정은 모두 시간차에서 비롯된 것이었다.

  • 인증 직후 URL 검사 색인 요청 실패: 시스템 반영에 시간이 필요하다. 30분~1시간 뒤 재시도하면 대부분 성공한다.
  • Sitemap 제출 직후 “가져올 수 없음”: 흔한 초기 현상. 기다리면 자동 재시도되어 “성공"으로 바뀐다.
  • site:<도메인> 결과 0: 세팅 문제가 아니라 아직 색인되지 않은 것뿐이다.

이 시간차를 미리 알고 있으면 조급해할 일이 없다. 파일 배치와 제출은 하루 안에 끝나고, 나머지는 구글의 스케줄대로 진행된다. 한 번 해 두면 이후로는 계속 자동으로 크롤링·색인되므로, 여유가 될 때 각 글에 개별 cover 이미지를 붙여 썸네일을 다양화하거나 Article 구조화 데이터(Structured Data)를 추가해 검색 스니펫을 더 다듬을 수 있다.

한 줄 정리

검색 노출 세팅 자체는 robots.txt·og:image 보완과 Search Console 등록·sitemap 제출로 하루면 끝나고, 나머지는 구글이 3일~2주에 걸쳐 크롤링·색인하기를 기다리는 시간차의 문제다.

Hugo로 만듦
JimmyStack 테마 사용 중