다국어 사이트의 hreflang 오류|태그가 실패하는 7가지 기술적 이유

本文作者:Don jiang

예를 들어, 언어 코드 형식 오류나 링크 경로가 불완전한 경우 검색 엔진이 페이지의 해당 언어 또는 지역을 올바르게 인식하지 못할 수 있습니다. 심지어 다국어 페이지끼리 트래픽을 경쟁하게 되어 목표 대상자를 놓칠 수도 있습니다.

이 글은 기술적인 실무 관점에서 출발하여 가장 흔한 hreflang 설정 오류 7가지를 정리했습니다. 도구를 활용해 정기적으로 검증하며 사소한 오류로 전체 최적화 효과가 떨어지지 않도록 권장합니다.

다국어 사이트 hreflang 오류

언어 또는 지역 코드 형식 오류

예를 들어, 대문자 사용(예: EN-US)이나 오타(예: zh-CNzh-CH로 잘못 입력)로 인해 검색 엔진이 페이지의 목표 지역을 올바르게 해석하지 못하거나 무효한 태그로 오인할 수 있습니다.

코드가 겉보기에는 맞아 보여도(예: es-ES 대신 es 사용) 불필요한 정보가 매칭 로직에 방해가 될 수 있습니다.

영향이 매우 큽니다. 예를 들어, 스페인 사용자의 검색 트래픽이 포르투갈어 페이지로 잘못 배분될 수 있습니다.

ISO 표준 코드 규칙

hreflang 코드는 ‘언어’와 ‘지역’ 두 부분으로 구성되며, 반드시 ISO 표준을 엄격히 따라야 합니다:

  • 언어 코드: ISO 639-1 표준의 소문자 2자리 약어를 사용해야 합니다 (예: en, es, zh).
  • 지역 코드: 선택 사항이며, ISO 3166-1 표준의 대문자 2자리 국가/지역 약어를 사용합니다 (예: US, GB, CN).
  • 조합 형식: 언어와 지역은 하이픈(-)으로 구분합니다. 예: en-US (미국 영어), zh-CN (간체 중국어).

예외 사항:

  • 언어 코드만 있을 경우(예: fr) 모든 해당 언어 사용자 대상으로 지역 제한이 없습니다.
  • 번체 중국어는 zh-Hant (중국어 번체) 또는 zh-Hant-TW (대만 번체)를 사용해야 하며, zh-TW는 대만 간체로 오해될 수 있습니다.

대표적 오류 사례 및 결과

오류 1: 대소문자 혼동

  • 오류 예: EN-us (언어 대문자 + 지역 소문자), Zh-cn (언어 첫 글자 대문자).
  • 결과: 검색 엔진이 해당 태그를 무시해 페이지가 목표 사용자와 매칭되지 않을 수 있습니다.

오류 2: 철자 오류 또는 가짜 코드

  • 오류 예: pt-BZ (브라질 코드는 BR가 맞음), eu (바스크어 – 일부 엔진은 소수 언어 미지원).
  • 결과: 소수 언어 페이지 또는 잘못된 지역 코드는 올바르게 인덱싱되지 않아 트래픽이 기본 언어 페이지로 유입될 수 있습니다.

오류 3: 불필요한 코드 또는 잘못된 조합

  • 오류 예: es-ES (스페인어 + 스페인 지역, 보통 es만 써도 됨), en-US-UK (유효하지 않은 다지역 조합).
  • 결과: 불필요한 정보는 엔진을 혼란스럽게 하여 더 간결한 경쟁 페이지를 우선시할 수 있습니다.

추천 도구 및 검증 방법

  • 구글 hreflang 테스트 도구: URL 입력 시 태그 파싱 여부 확인 가능 (Search Console과 함께 사용 권장).
  • Screaming Frog: 사이트 크롤링 후 hreflang 태그 필터링, 오류 코드 일괄 추출 가능(유료 버전).
  • Hreflang Validator (서드파티 도구): 무료 온라인 검사기로 형식 오류 및 링크 충돌 표시.

실전 수정 절차

기존 코드 확인: WordPress 사이트 기준, 플러그인(예: Yoast SEO) 또는 페이지 소스에서 <link rel="alternate" hreflang="..." /> 태그를 찾습니다.

잘못된 코드 일괄 교체:

  1. 다국어 플러그인(WPML 등)을 사용하는 경우, 언어 설정에서 직접 “언어 코드” 형식을 수정하세요.
  2. 수동으로 수정할 때는 모든 페이지가 동일한 형식을 따르는지 확인하세요(예: 전역적으로 ENen으로 변경).

지역 코드 추가(선택 사항):

  • 지역을 세분화할 필요가 있을 때만 추가하세요(예: en-GB는 영국 사용자를 대상으로). 그렇지 않으면 순수 언어 코드만 사용하세요(예: fr).

재검증: 도구를 사용해 다시 한 번 확인하여 수정된 페이지가 200 상태 코드를 반환하고 크롤링 오류가 없는지 확인하세요.

절대 URL을 완전하게 사용하지 않음

많은 사이트 운영자들이 상대 경로(예: /de/page)나 프로토콜 생략(예: example.com/de)이 설정을 단순화한다고 생각하지만, 실제로는 심각한 문제를 초래합니다.

예를 들어, 페이지에 httphttps 버전이 모두 있을 경우 프로토콜을 쓰지 않으면 검색 엔진이 이를 별도의 페이지로 잘못 인식하여 SEO 점수가 분산될 수 있습니다.

또한, 서브도메인이나 하위 디렉터리를 사용하는 사이트가 절대 URL을 통일하지 않으면 경로 혼란이 발생하여 태그가 제대로 작동하지 않을 수 있습니다(예: 모바일과 PC URL 혼용).

절대 URL 정의 및 필요성

절대 URL은 반드시 프로토콜(http:// 또는 https://), 완전한 도메인과 경로를 포함해야 합니다(예: https://www.example.com/de/page).

필요성:

  1. 검색 엔진은 각 페이지를 명확히 구분할 필요가 있습니다. 상대 경로(예: /de/page)는 현재 도메인의 어떤 버전(http 또는 https)인지 애매하게 해 중복 콘텐츠 문제가 발생할 수 있습니다.
  2. 서브도메인이나 하위 디렉터리를 사용할 때 절대 경로를 명시하지 않으면 검색 엔진이 페이지 소속을 잘못 판단할 수 있습니다(예: de.example.com/pagewww.example.com/de/page를 별개의 페이지로 인식).

대표적인 문제 상황:

  • 페이지에 httphttps 버전이 동시에 존재하지만 hreflang에 프로토콜이 누락되어 SEO 점수가 분산됨.
  • 모바일과 PC에서 같은 콘텐츠를 사용하지만 URL 구조가 다름(예: m.example.com/deexample.com/de)에도 절대 URL로 연결하지 않음.

일반적인 오류 상황 및 결과

오류 1: 상대 경로나 프로토콜 누락

오류 예시:

  1. <link hreflang="de" href="/de/page" /> (상대 경로)
  2. <link hreflang="es" href="www.example.com/es/page" /> (https:// 누락)

결과:

  • 검색 엔진이 /de/pagehttp://example.com/de/page로 인식할 수 있는데, 실제 페이지는 https 버전이라 태그가 무효화됨.
  • 프로토콜이 다른 페이지들이 별개의 페이지로 간주되어 중복 콘텐츠 및 SEO 점수 분산 발생.

오류 2: 서브도메인 간 미통일

  • 오류 예시: 메인 사이트는 https://example.com/fr/page를 사용하는데, 프랑스어 서브사이트는 https://fr.example.com/page이고 hreflang이 서로 절대 URL로 연결되어 있지 않습니다.
  • 결과: 검색 엔진이 서브도메인과 메인 사이트 페이지의 연관성을 파악하지 못해 프랑스어 사용자가 기본 언어 페이지로 안내될 수 있습니다.

오류 3: 동적 파라미터 미표준화

  • 오류 예시: <link hreflang="ja" href="https://example.com/page?lang=ja" /> (추적 파라미터 포함)
  • 결과: 파라미터가 검색 엔진에 다른 페이지로 인식될 수 있음(예: ?lang=ja?lang=ja&utm=ads), 태그 적용이 불완전해짐.

도구를 통한 검출 방법

  • Google Search Console:
    “커버리지 보고서”에서 “중복 페이지” 또는 “hreflang 누락” 오류를 확인해 불완전한 URL을 찾음.
  • Screaming Frog:
    사이트 크롤 후 hreflang 태그를 필터링하고 모든 href 속성이 절대 URL인지 확인(필터 조건: //example.com 또는 /path).
  • Sitebulb:
    “국제 SEO 감사” 보고서에서 “불완전 hreflang URL”을 표시하고 수정 권장.

수정 방안 및 실무 절차

CMS 시스템(예: WordPress):

플러그인 설정:
Yoast SEO 등 플러그인을 사용하는 경우, “다국어 설정”에서 “절대 URL 생성”을 강제로 활성화(보통 “상대 경로” 옵션 비활성화).

데이터베이스 일괄 교체:
SQL 명령어 또는 Better Search Replace 같은 플러그인을 사용해 href="/href="https://www.example.com/로 교체.

수동 코드 수정:
HTML 또는 서버 측 렌더링 로직에서 모든 hreflang 링크가 완전한 형식으로 조합되었는지 확인, 예:

<link rel="alternate" hreflang="de" href="<?php echo site_url('/de/page'); ?>" />

서버 설정:

  • 프로토콜 일관성 강제: .htaccess나 Nginx 설정으로 httphttps로 자동 리디렉션, 혼합 콘텐츠 방지.
  • URL 정규화: 동일 콘텐츠의 다른 경로(예: /de/de/)에 대해 301 리디렉션 추가, 유일한 절대 URL 보장.

자기 참조 hreflang 태그 누락

예를 들어, 프랑스어 페이지가 영어, 스페인어 등 다른 버전 링크만 표시하고 hreflang="fr"로 자신을 가리키지 않는 경우

검색 엔진이 해당 페이지의 언어 소유권을 확인하지 못해 프랑스어 사용자 검색 결과에 올바르게 분류되지 않을 수 있음.

자기 참조 태그의 역할과 필요성

자기 참조 태그란 페이지 내에 자신을 가리키는 hreflang 선언(예: 프랑스어 페이지는 <link rel="alternate" hreflang="fr" href="자신의 URL"/> 포함).

핵심 역할:

  • 검색 엔진에 현재 페이지의 언어/지역 소속을 명확히 알려 오인 방지.
  • 다른 언어 버전과 폐쇄 루프 연관 형성 (모든 페이지가 서로 선언), 올바른 권한 전달 보장.

누락 시 발생하는 문제

  • 검색 엔진이 페이지를 “언어 미선언”으로 간주하여 기본 언어 디렉터리에 할당할 수 있으며, 이로 인해 목표 사용자 트래픽이 감소할 수 있습니다.
  • 다국어 경쟁 상황에서 (예: 영어와 스페인어 페이지 모두 자기 참조가 없을 경우) 내부 중복 콘텐츠 문제가 발생할 수 있습니다.

일반적인 오류 사례 및 분석

오류 1: 단일 언어 사이트에서 hreflang 잘못 사용

  • 상황: 한 가지 언어 버전만 존재하는 페이지에 존재하지 않는 다른 언어 페이지로 강제로 hreflang을 추가한 경우.
  • 사례: 영어 단일 사이트 페이지에서 hreflang="en"를 자기 자신에게 지정하면서, 존재하지 않는 hreflang="es" 페이지로 잘못 연결하여 검색 엔진의 혼란을 초래함.

오류 2: 다국어 플러그인 설정 누락

  • 상황 예시: WPML 플러그인을 사용할 때 “자동 자기 참조 hreflang 생성” 옵션을 체크하지 않은 경우.
  • 결과: 생성된 태그에 현재 페이지에 대한 선언이 빠지고 다른 언어 버전 링크만 포함됨.

오류 3: 동적 페이지에 완전한 태그 미적용

  • 상황 예시: React/Vue 같은 JavaScript 렌더링 페이지에서 hreflang 태그가 <head>에 제대로 삽입되지 않은 경우.
  • 결과: 검색 엔진 크롤러가 동적으로 생성된 자기 참조 태그를 인식하지 못할 수 있음.

검증 도구 및 방법

1단계: 수동 소스 코드 확인

  • 페이지에서 Ctrl+U를 눌러 소스를 열고, hreflang="xx"을 검색해 현재 URL을 가리키는 태그가 있는지 확인 (참고: xx는 현재 페이지 언어 코드).

2단계: 구글 서치 콘솔 확인

  • “URL 검사 도구”에 페이지 URL을 입력한 후 “국제 타겟팅” 리포트를 확인 — “자기 참조 hreflang 태그 없음” 경고가 뜨면 문제 있음.

3단계: Hreflang Validator 툴 사용

  • 페이지 URL 입력 시 모든 관련 hreflang 링크를 나열하며, 자기 참조 태그가 누락된 경우 빨간색 경고로 표시.

수정 방법 및 실습 단계

CMS 시스템 수정 (WordPress 예시)

플러그인 설정 수정

  • Yoast SEO 사용 시: “고급 설정”에서 “자기 참조 hreflang 추가” 활성화.
  • WPML 사용 시: “언어 설정” → “SEO 옵션”에서 “자기 링크 포함” 체크.

수동 수정 (정적 사이트 또는 커스텀 코드)

페이지의 <head>에 다음 코드를 추가 (프랑스어 페이지 예시):

<link rel="alternate" hreflang="fr" href="https://www.example.com/fr/page-actuelle" />
<link rel="alternate" hreflang="x-default" href="https://www.example.com/" />

동적 렌더링 페이지 수정(예: React):

서버 사이드 렌더링(SSR) 로직에서 현재 페이지 언어에 따라 자기 참조 태그를 동적으로 생성:

const hreflangSelf = `<link rel="alternate" hreflang="${currentLang}" href="${currentURL}"/>`;
document.head.insertAdjacentHTML('beforeend', hreflangSelf);

다국어 페이지가 서로 연결되어 있지 않음

예를 들어, 독일어 페이지는 영어 버전을 가리키지만 영어 페이지는 독일어 페이지를 다시 링크하지 않음

단방향 연결은 검색 엔진이 다국어 페이지의 대응 관계를 확인하지 못하게 하여 일부 페이지만 인덱싱되거나 중복 콘텐츠로 오인될 수 있음.

폐쇄 루프 연결 원칙 및 필요성

hreflang의 핵심 규칙은 모든 관련 페이지가 서로를 가리켜야 한다는 것으로, 완전한 폐쇄 루프를 형성해야 함. 예를 들어:

  • 독일어 페이지(de)는 영어 페이지(en), 프랑스어 페이지(fr) 등 다른 언어 버전을 가리켜야 함;
  • 영어 및 프랑스어 페이지도 독일어 페이지를 다시 가리켜야 함.

필요성:

  • 권한 전달: 폐쇄 루프 연결은 검색 엔진이 다국어 페이지가 동일한 페이지임을 이해하도록 도와주어 권한 분산을 방지함.
  • 중복 콘텐츠 방지: 단방향 연결(예: 영어 페이지가 독일어 페이지를 가리키지만, 독일어 페이지가 영어 페이지를 가리키지 않는 경우)은 검색 엔진이 이를 별개의 콘텐츠로 인식해 중복 콘텐츠 패널티를 받을 수 있음.

예외 상황:

  • 단일 언어 페이지(예: 영어 단독)는 폐쇄 루프가 필요 없지만 자기 참조는 필요함.
  • 지역 변형(예: en-USen-GB)은 서로를 가리켜야 하지만 다른 언어와는 반드시 연결할 필요는 없음.

일반적인 링크 단절 상황 및 결과

상황 1: 신규 언어 버전 추가 시 기존 페이지 미동기화

  • 사례: 뉴스 사이트가 일본어 페이지(ja)를 추가했으나 기존 영어, 중국어 페이지가 일본어 페이지에 대한 hreflang 태그를 추가하지 않음.
  • 결과: 일본어 페이지가 '고립된 페이지'가 되어 검색 엔진이 연결되지 않은 다른 언어 페이지만 인덱싱함.

상황 2: CMS 플러그인 로직 결함

  • 사례: WordPress 다국어 플러그인(예: Polylang)이 페이지 일괄 생성 시 기존 콘텐츠에 신규 언어 링크를 자동 추가하지 않음.
  • 결과: 일부 페이지 연결이 끊어지고 사용자가 기존 콘텐츠에서 신규 언어 버전으로 전환 불가.

상황 3: 동적 파라미터로 인해 연결 실패

  • 사례: 스페인어 페이지 URL에 파라미터 포함(예: ?lang=es)되었으나 다른 언어 페이지 hreflang에는 해당 파라미터가 포함되지 않음.
  • 결과: 검색 엔진이 es 파라미터 페이지를 별개 콘텐츠로 간주함.

검사 도구 및 문제 해결 방법

도구 1: Screaming Frog

  • 크롤링 결과의 “Hreflang” 탭에서 “Missing Reciprocal Links”(반대 링크 누락) 필터링
  • 조치: 오류 목록 내보내기, 폐쇄 루프가 형성되지 않은 URL 그룹 찾기

도구 2: Sitebulb

  • “International SEO Audit” 보고서에서 “Unreciprocated hreflang links” 경고 확인, 링크 단절 페이지와 누락된 언어 표시

도구 3: DeepCrawl

  • 사용자 지정 규칙 설정, 다국어 페이지 간 연관성 모니터링, 매주 단절 문제 자동 보고

수정 방안 및 실행 단계

방안 1: CMS 플러그인 일괄 수정 (Shopify 예시)

다국어 플러그인(예: Langify) 설정에서 “모든 언어 버전 자동 연결” 옵션 활성화

"템플릿 설정"에서 hreflang 태그 로직이 모든 언어 버전을 순환하도록 설정하세요:

{% for language in shop.languages %}
<link rel="alternate" hreflang="{{ language.iso_code }}" href="{{ canonical_url | replace: shop.domain, language.domain }}" />
{% endfor %}

옵션 2: 수동 코드 수정 (정적 사이트)

각 언어 버전별로 연관된 URL 목록(예: 엑셀 파일)을 만들어 서로 연결할 URL 그룹을 나열하세요.

페이지에 목록에 따라 태그를 추가하세요, 예를 들면:


<link rel="alternate" hreflang="en" href="https://example.com/en/page" />
<link rel="alternate" hreflang="de" href="https://example.com/de/page" />
<link rel="alternate" hreflang="fr" href="https://example.com/fr/page" />

독일어, 프랑스어 페이지도 영어 페이지 링크를 포함하도록 동기화하세요.

옵션 3: 서버 사이드 자동화 (예: Nginx)

역방향 프록시와 매핑 규칙을 사용해 hreflang 태그를 동적으로 생성하세요:

location / {
add_header Link "<https://$host/en$uri>; rel=alternate; hreflang=en";
add_header Link "<https://$host/de$uri>; rel=alternate; hreflang=de";
}

Canonical 태그와의 충돌

예를 들어, 독일어 상품 페이지의 Canonical 태그가 영어 메인 사이트 페이지를 가리키면, 검색 엔진은 독일어 페이지를 영어 페이지의 복사본으로 인식하여 독일어 사용자에게 노출하지 않을 수 있습니다.

더 일반적인 문제는 많은 CMS 시스템이 모든 언어 버전의 Canonical을 주 언어 페이지(x-default 등)로 통일하는 경우로, 이로 인해 다른 언어 페이지가 독립적으로 인덱싱되지 못합니다.

충돌 원리 및 우선순위 규칙

검색 엔진이 hreflang과 Canonical 태그를 처리하는 우선순위:

Canonical 우선: 페이지 A의 Canonical이 페이지 B를 가리키면, 검색 엔진은 A를 B의 복사본으로 간주해 A의 hreflang 선언을 무시합니다.

hreflang이 무효화되는 경우:

  1. 프랑스어 페이지 Canonical이 영어 페이지를 가리키는 경우 → 프랑스어 페이지가 프랑스 사용자에게 노출되지 않습니다.
  2. 다국어 페이지의 Canonical이 모두 메인 사이트를 가리키는 경우 → 모든 언어 버전이 중복 콘텐츠로 간주됩니다.

예외 규칙:

  • Canonical 태그가 자기 자신을 가리키는 경우(예: <link rel="canonical" href="현재 페이지 URL"/>) hreflang이 정상 작동합니다.

전형적인 오류 상황과 결과

오류 1: 다국어 플러그인 기본 설정 충돌

  • 사례: 워드프레스의 Yoast SEO 플러그인은 다국어 페이지의 Canonical을 기본적으로 주 언어 페이지로 지정합니다. 예를 들어, 독일어 페이지의 Canonical 태그는 <link rel="canonical" href="https://example.com/en/page"/>와 같습니다.
  • 결과: 독일어 페이지가 영어 페이지의 복제본으로 인식되어 독일어 검색 결과에 노출되지 않아 트래픽이 50% 이상 감소합니다.

오류 2: 동적 매개변수 간섭

  • 사례: 매개변수가 포함된 URL(예: example.com/page?lang=de)의 Canonical이 매개변수가 없는 버전(example.com/page)을 가리키지만, 후자는 hreflang이 설정되어 있지 않습니다.
  • 결과: 매개변수가 있는 독일어 페이지가 인덱싱되지 않아 사용자가 검색할 때 기본 언어 페이지만 표시됩니다.

오류 3: 지역별 변형 미독립 선언

  • 사례: en-US 페이지의 Canonical이 일반 영어 페이지(en)를 가리켜 검색 엔진이 미국 영어 페이지를 별도의 가치가 없는 것으로 인식하게 됩니다.
  • 결과: 미국 사용자가 en 페이지(예: 영국 영어)로 유도되어 현지화 경험이 저하됩니다.

검사 도구 및 문제 해결 방법

도구 1: Google Search Console

  • “커버리지 보고서”에서 “제외됨” 탭 아래의 “중복 페이지” 또는 “제출했으나 인덱싱 안됨” 항목을 필터링하여 Canonical 충돌로 인한 hreflang 무효 여부를 확인합니다.

도구 2: Screaming Frog

  • 사이트 크롤링 후 hreflang과 Canonical 태그가 모두 포함된 페이지를 필터링하고, Canonical이 자기 자신이 아닌 다른 페이지를 가리키는지 확인합니다.
  • 데이터를 내보내고 Canonical != Self-URL 조건으로 필터링합니다.

도구 3: DeepCrawl

  • hreflang과 Canonical 대상이 일치하지 않을 때 경고가 발생하도록 맞춤 알림 규칙을 설정합니다.

수정 방안 및 실행 단계

방안 1: CMS 플러그인 수정 (Yoast SEO 예시)

  1. 다국어 설정에 들어가 “Canonical을 주 언어로 통일” 옵션을 끕니다.
  2. “고급 설정”에서 “각 언어 버전에 독립 Canonical 생성”을 활성화합니다.

방안 2: 수동 코드 수정

페이지 <head> 내에서 Canonical 태그가 자기 자신의 URL을 가리키도록 합니다. 예:

<!-- 독일어 페이지의 Canonical이 자기 자신을 가리킴 -->
<link rel="canonical" href="https://example.com/de/page" />

방안 3: 서버 측 설정 (예: Nginx)

현재 언어 버전에 맞춰 Canonical 태그를 동적으로 생성:

location /de/ {
add_header Link "<https://example.com/de/$uri>; rel=canonical";
}

서버 오류 또는 HTTP 요청 미지원

예를 들어, 동적으로 생성된 페이지가 서버 타임아웃으로 인해 완전한 HTML을 로드하지 못해 <head> 내 hreflang 태그가 누락되는 경우;

또는 모바일 페이지가 200 상태 코드 대신 302 임시 리디렉션을 반환해 검색 엔진이 크롤링을 포기할 수 있습니다.

일부 CDN이나 방화벽 규칙이 크롤러 요청을 차단해 특정 지역 언어 페이지 접근이 불가능할 수 있습니다.

서버 오류 유형 및 영향

주요 상태 코드 및 그 영향:
404 Not Found

  • 상황:프랑스어 페이지가 다른 언어 페이지의 hreflang에 의해 참조되었으나, 실제 URL이 삭제되었거나 경로가 잘못됨.
  • 결과:검색 엔진은 hreflang 연결을 무효로 판단하여 프랑스어 페이지가 색인되지 않으며, 다른 언어 페이지의 신뢰도도 하락함.

500 Internal Error

  • 상황:서버 충돌로 인해 동적으로 생성된 hreflang 태그가 로드되지 않음.
  • 결과:페이지가 500 오류를 반환하며 hreflang이 완전히 작동하지 않고, 크롤러가 일시적으로 사이트를 차단할 수 있음.

302 Temporary Redirect

  • 상황:모바일 페이지가 임시로 데스크톱 URL로 리디렉션되었으나 hreflang 태그가 전달되지 않음.
  • 결과:검색 엔진은 대상 페이지(데스크톱)의 hreflang만 크롤링하고 모바일 언어 버전을 무시할 수 있음.

동적 페이지 로딩 문제

JavaScript 렌더링 결함

  • 사례:React/Vue 기반 싱글 페이지 애플리케이션(SPA)에서 hreflang 태그를 JS로 동적으로 삽입하지만 사전 렌더링하지 않음.
  • 결과:검색 엔진 크롤러가 JS를 실행하지 않아 hreflang 태그를 읽지 못할 수 있음.

CDN/캐시 설정 간섭

  • 사례:CDN 캐시 설정이 <head> 내 hreflang 태그를 무시하거나 잘못된 언어 버전을 캐시함.
  • 결과:사용자가 같은 URL에 접근할 때 CDN이 서로 다른 언어 버전을 반환해 hreflang 연결이 혼란스러워짐.

서버 타임아웃 및 성능 문제

  • 사례:페이지 로딩 시간이 5초 이상으로 길어 크롤러가 조기 종료되어 hreflang 태그를 완전히 읽지 못함.
  • 결과:특히 대형 다국어 사이트에서 일부 언어 연결이 손실됨.

검증 도구 및 문제 해결 방법

Google Search Console

  • “커버리지 보고서”를 사용하여 서버 오류(404/500)로 제외된 페이지를 확인하고 다국어 버전 관련 URL을 필터링함.

Screaming Frog

  1. 크롤링 설정에서 “hreflang 검사” 옵션을 활성화함.
  2. 결과에서 “서버 오류”(4xx, 5xx) 태그를 필터링하여 hreflang 연결 페이지를 확인함.

로그 파일 분석

  • 서버 로그(예: Nginx access.log)에서 검색 엔진 크롤러(User-Agent에 Googlebot 포함) 요청을 필터링해 자주 오류를 반환하는 URL을 찾아냄.

수정 방안 및 실전 단계

서버 오류 수정

404 문제

  • hreflang에 연결된 모든 URL이 실제 존재하는지 확인하고 끊어진 링크를 수정함.
  • 페이지가 삭제되었다면 다른 언어 페이지의 hreflang에서 해당 링크를 제거함.

500 문제

  • 서버 자원(메모리 추가, 데이터베이스 연결 풀 등)을 최적화하여 충돌 위험을 줄임.
  • New Relic 같은 모니터링 경고 시스템을 설정해 실시간으로 문제를 발견하고 수정함.

동적 페이지 최적화

사전 렌더링 방안

  • Next.js, Nuxt.js 같은 SSR(서버사이드 렌더링) 프레임워크를 사용해 hreflang 태그가 초기 HTML에 포함되도록 함.
  • Prerender.io 같은 사전 렌더링 도구를 설정해 크롤러에 정적 버전을 제공함.

CDN 설정 수정

  1. CDN 설정에서 /de/, /fr/ 같은 언어 경로를 “캐시 안 함” 또는 짧은 캐시 주기(예: 1시간)로 설정함.
  2. CDN이 <head> 전체 내용을 전달하도록 설정하고 HTML 태그 변경을 금지함.

성능 최적화

  • 이미지, CSS/JS 등 페이지 자원을 압축해 로딩 시간을 3초 이내로 단축함.
  • Google Lighthouse 같은 도구를 사용해 렌더링 차단 문제를 점검 및 수정함.

동적 파라미터로 인한 중복 콘텐츠 문제

동적 파라미터(예: ?utm_source=ads, ?sessionid=123)의 과도한 사용은 다국어 사이트 중복 콘텐츠 문제의 “숨은 주범”입니다.

예를 들어, 스페인어 페이지가 서로 다른 파라미터로 인해 여러 URL(예: /es/page?ref=facebook, /es/page?ref=email)을 가질 수 있는데, 검색 엔진은 이를 별도의 페이지로 인식해 중복 콘텐츠로 처리합니다.

파라미터 유형의 영향 및 분류

반드시 유지해야 하는 매개변수:

  1. 페이징 매개변수(예: ?page=2): 서로 다른 콘텐츠 블록을 구분하는 데 사용됩니다. 유지하되 표준화해야 합니다(예: rel="canonical"로 메인 페이지를 가리키도록).
  2. 언어/지역 매개변수(예: ?lang=de): URL이 경로로 언어를 구분하지 않는 경우(예: /de/) 이러한 매개변수는 유지하고 hreflang과 일치시켜야 합니다.

반드시 제거해야 하는 매개변수:

  1. 추적 매개변수(예: ?utm_source, ?ref=social): 페이지 내용을 변경하지 않으므로 hreflang에서 제거해야 합니다.
  2. 세션 ID(예: ?sessionid=123): 사용자 행동 추적 매개변수로, 중복 URL이 대량 생성될 수 있습니다.

일반적인 오류 사례와 결과

오류 1: 매개변수가 표준화되지 않음

  • 사례: 동일한 프랑스어 페이지가 여러 추적 매개변수를 가진 URL로 존재함(예: /fr/page?utm=ads/fr/page?utm=email), 이 둘 모두 hreflang에서 독립 페이지로 선언됨.
  • 결과: 검색 엔진이 여러 중복 버전을 크롤링하여 권한이 분산되고, 프랑스어 페이지의 순위가 하락함.

오류 2: hreflang에 매개변수 누락

  • 사례: 영어 페이지의 hreflang이 /de/page를 가리키지만, 실제 독일어 URL은 /de/page?lang=de로 연결이 끊김.
  • 결과: 독일어 페이지가 독립 콘텐츠로 간주되어 영어 페이지와 다국어 연결이 이루어지지 않음.

오류 3: 페이징 매개변수가 주요 콘텐츠에 영향

  • 사례: 제품 목록 페이지 /es/products?page=2의 hreflang이 주요 목록 페이지 /es/products를 가리키지 않음.
  • 결과: 페이징 페이지가 독립 언어 페이지로 오인되어 주요 목록 페이지와 트래픽 경쟁을 함.

도구를 통한 점검 방법

Google Search Console:

  • “커버리지” 보고서에 들어가 “제출했지만 색인되지 않음” URL을 필터링하여, 매개변수로 인한 중복 배제 여부 확인.

Screaming Frog:

  1. 사이트 크롤링 시 “URL 매개변수 무시” 옵션을 활성화하여 매개변수가 있는 페이지와 없는 페이지의 내용 유사도를 비교.
  2. hreflang 태그를 필터링하여 매개변수 URL의 표준화 미비 문제 확인.

정규식 매칭:

  • 로그 분석 도구(예: ELK Stack)에서 정규식을 사용해 특정 매개변수(예: utm_*)가 포함된 크롤러 요청을 필터링하고 중복 크롤링 횟수 통계.

해결책 및 실무 단계

해결책 1: 매개변수 표준화(서버 설정)

Apache 규칙 예시:

RewriteCond %{QUERY_STRING} ^utm_
RewriteRule ^(.*)$ /$1? [R=301,L]
  • 역할: 모든 utm_ 매개변수를 자동 제거하고 301 리다이렉트로 매개변수 없는 URL로 이동.

해결책 2: hreflang과 Canonical 연동

hreflang에는 매개변수 없는 URL만 사용(예: /de/page).

매개변수가 있는 URL에 canonical 태그를 추가해 무매개변수 버전을 가리킴:

<link rel="canonical" href="https://example.com/de/page" />

해결책 3: Google Search Console의 URL 매개변수 설정

  1. “URL 매개변수” 설정에 들어가 utm_, sessionid 등의 매개변수를 “페이지 콘텐츠에 영향 없음”으로 지정.
  2. 페이징 매개변수(예: page)는 “페이징”으로 지정하여 검색 엔진이 역할을 이해하도록 도움.

다국어 사이트의 hreflang 최적화는 ‘한 번 설정으로 끝나는 작업’이 아닙니다.
세부 사항의 완성은 대개 이러한 ‘사소한’ 기술적 실수를 피하는 것부터 시작됩니다.

滚动至顶部