예를 들어, 언어 코드 형식 오류나 링크 경로가 불완전한 경우 검색 엔진이 페이지의 해당 언어 또는 지역을 올바르게 인식하지 못할 수 있습니다. 심지어 다국어 페이지끼리 트래픽을 경쟁하게 되어 목표 대상자를 놓칠 수도 있습니다.
이 글은 기술적인 실무 관점에서 출발하여 가장 흔한 hreflang 설정 오류 7가지를 정리했습니다. 도구를 활용해 정기적으로 검증하며 사소한 오류로 전체 최적화 효과가 떨어지지 않도록 권장합니다.

언어 또는 지역 코드 형식 오류
예를 들어, 대문자 사용(예: EN-US
)이나 오타(예: zh-CN
을 zh-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="..." />
태그를 찾습니다.
잘못된 코드 일괄 교체:
- 다국어 플러그인(WPML 등)을 사용하는 경우, 언어 설정에서 직접 “언어 코드” 형식을 수정하세요.
- 수동으로 수정할 때는 모든 페이지가 동일한 형식을 따르는지 확인하세요(예: 전역적으로
EN
을 en
으로 변경).
지역 코드 추가(선택 사항):
- 지역을 세분화할 필요가 있을 때만 추가하세요(예:
en-GB
는 영국 사용자를 대상으로). 그렇지 않으면 순수 언어 코드만 사용하세요(예: fr
).
재검증: 도구를 사용해 다시 한 번 확인하여 수정된 페이지가 200 상태 코드를 반환하고 크롤링 오류가 없는지 확인하세요.
절대 URL을 완전하게 사용하지 않음
많은 사이트 운영자들이 상대 경로(예: /de/page
)나 프로토콜 생략(예: example.com/de
)이 설정을 단순화한다고 생각하지만, 실제로는 심각한 문제를 초래합니다.
예를 들어, 페이지에 http
와 https
버전이 모두 있을 경우 프로토콜을 쓰지 않으면 검색 엔진이 이를 별도의 페이지로 잘못 인식하여 SEO 점수가 분산될 수 있습니다.
또한, 서브도메인이나 하위 디렉터리를 사용하는 사이트가 절대 URL을 통일하지 않으면 경로 혼란이 발생하여 태그가 제대로 작동하지 않을 수 있습니다(예: 모바일과 PC URL 혼용).
절대 URL 정의 및 필요성
절대 URL은 반드시 프로토콜(http://
또는 https://
), 완전한 도메인과 경로를 포함해야 합니다(예: https://www.example.com/de/page
).
필요성:
- 검색 엔진은 각 페이지를 명확히 구분할 필요가 있습니다. 상대 경로(예:
/de/page
)는 현재 도메인의 어떤 버전(http
또는 https
)인지 애매하게 해 중복 콘텐츠 문제가 발생할 수 있습니다. - 서브도메인이나 하위 디렉터리를 사용할 때 절대 경로를 명시하지 않으면 검색 엔진이 페이지 소속을 잘못 판단할 수 있습니다(예:
de.example.com/page
와 www.example.com/de/page
를 별개의 페이지로 인식).
대표적인 문제 상황:
- 페이지에
http
와 https
버전이 동시에 존재하지만 hreflang에 프로토콜이 누락되어 SEO 점수가 분산됨. - 모바일과 PC에서 같은 콘텐츠를 사용하지만 URL 구조가 다름(예:
m.example.com/de
와 example.com/de
)에도 절대 URL로 연결하지 않음.
일반적인 오류 상황 및 결과
오류 1: 상대 경로나 프로토콜 누락
오류 예시:
<link hreflang="de" href="/de/page" />
(상대 경로)<link hreflang="es" href="www.example.com/es/page" />
(https://
누락)
결과:
- 검색 엔진이
/de/page
를 http://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 링크가 완전한 형식으로 조합되었는지 확인, 예:
서버 설정:
- 프로토콜 일관성 강제:
.htaccess
나 Nginx 설정으로 http
를 https
로 자동 리디렉션, 혼합 콘텐츠 방지. - 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>
에 다음 코드를 추가 (프랑스어 페이지 예시):
동적 렌더링 페이지 수정(예: React):
서버 사이드 렌더링(SSR) 로직에서 현재 페이지 언어에 따라 자기 참조 태그를 동적으로 생성:
폐쇄 루프 연결 원칙 및 필요성
hreflang의 핵심 규칙은 모든 관련 페이지가 서로를 가리켜야 한다는 것으로, 완전한 폐쇄 루프를 형성해야 함. 예를 들어:
- 독일어 페이지(
de
)는 영어 페이지(en
), 프랑스어 페이지(fr
) 등 다른 언어 버전을 가리켜야 함; - 영어 및 프랑스어 페이지도 독일어 페이지를 다시 가리켜야 함.
필요성:
- 권한 전달: 폐쇄 루프 연결은 검색 엔진이 다국어 페이지가 동일한 페이지임을 이해하도록 도와주어 권한 분산을 방지함.
- 중복 콘텐츠 방지: 단방향 연결(예: 영어 페이지가 독일어 페이지를 가리키지만, 독일어 페이지가 영어 페이지를 가리키지 않는 경우)은 검색 엔진이 이를 별개의 콘텐츠로 인식해 중복 콘텐츠 패널티를 받을 수 있음.
예외 상황:
- 단일 언어 페이지(예: 영어 단독)는 폐쇄 루프가 필요 없지만 자기 참조는 필요함.
- 지역 변형(예:
en-US
와 en-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 태그 로직이 모든 언어 버전을 순환하도록 설정하세요:
옵션 2: 수동 코드 수정 (정적 사이트)
각 언어 버전별로 연관된 URL 목록(예: 엑셀 파일)을 만들어 서로 연결할 URL 그룹을 나열하세요.
페이지에 목록에 따라 태그를 추가하세요, 예를 들면:
독일어, 프랑스어 페이지도 영어 페이지 링크를 포함하도록 동기화하세요.
옵션 3: 서버 사이드 자동화 (예: Nginx)
역방향 프록시와 매핑 규칙을 사용해 hreflang 태그를 동적으로 생성하세요:
Canonical 태그와의 충돌
예를 들어, 독일어 상품 페이지의 Canonical 태그가 영어 메인 사이트 페이지를 가리키면, 검색 엔진은 독일어 페이지를 영어 페이지의 복사본으로 인식하여 독일어 사용자에게 노출하지 않을 수 있습니다.
더 일반적인 문제는 많은 CMS 시스템이 모든 언어 버전의 Canonical을 주 언어 페이지(x-default 등)로 통일하는 경우로, 이로 인해 다른 언어 페이지가 독립적으로 인덱싱되지 못합니다.
충돌 원리 및 우선순위 규칙
검색 엔진이 hreflang과 Canonical 태그를 처리하는 우선순위:
Canonical 우선: 페이지 A의 Canonical이 페이지 B를 가리키면, 검색 엔진은 A를 B의 복사본으로 간주해 A의 hreflang 선언을 무시합니다.
hreflang이 무효화되는 경우:
- 프랑스어 페이지 Canonical이 영어 페이지를 가리키는 경우 → 프랑스어 페이지가 프랑스 사용자에게 노출되지 않습니다.
- 다국어 페이지의 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 예시)
- 다국어 설정에 들어가 “Canonical을 주 언어로 통일” 옵션을 끕니다.
- “고급 설정”에서 “각 언어 버전에 독립 Canonical 생성”을 활성화합니다.
방안 2: 수동 코드 수정
페이지 <head>
내에서 Canonical 태그가 자기 자신의 URL을 가리키도록 합니다. 예:
방안 3: 서버 측 설정 (예: Nginx)
현재 언어 버전에 맞춰 Canonical 태그를 동적으로 생성:
또는 모바일 페이지가 200 상태 코드 대신 302 임시 리디렉션을 반환해 검색 엔진이 크롤링을 포기할 수 있습니다.
일부 CDN이나 방화벽 규칙이 크롤러 요청을 차단해 특정 지역 언어 페이지 접근이 불가능할 수 있습니다.