hreflang 설정: 12개 언어 구성 사례와 흔한 오류 5가지

SEOgrinder 편집팀 · 게시일 · 수정일 · 읽는 시간 약 13분

핵심 답변: hreflang은 어떤 페이지가 같은 내용의 언어별·지역별 버전인지 Google에 알려 주는 표기로, 검색이 사용자에게 알맞은 버전을 보여 주도록 돕습니다. 모든 버전이 자기 자신과 다른 모든 버전을 나열해야 하고, 서로 짝이 되는 페이지끼리 상대를 가리켜야 합니다. 그렇지 않으면 표기가 무시될 수 있습니다. 아래에서 seogrinder.com이 12개 언어에 hreflang을 설정한 방식과 Google 문서에 나온 hreflang 오류 5가지를 설명합니다.

hreflang은 무엇을 하고, 언제 필요한가요?

Google은 Tell Google about localized versions of your page 문서에서 이 개념을 설명합니다. 한 페이지의 버전이 언어나 지역별로 여러 개 있을 때 그 사실을 Google에 알리면, 검색이 사용자를 언어나 지역에 가장 알맞은 버전으로 안내하는 데 도움이 된다는 것입니다. 원문은 “help Google Search point users to the most appropriate version of your page by language or region”입니다.

Google이 이 표기를 권장하는 경우는 세 가지입니다.

  • 주요 콘텐츠는 한 언어로 두고 탐색 메뉴나 푸터 같은 틀만 번역한 경우
  • 같은 언어 안에서 비슷한 콘텐츠를 지역에 따라 조금씩 달리한 경우. 예를 들어 미국, 영국, 아일랜드용 영어 페이지
  • 콘텐츠를 전부 번역한 경우. 예를 들어 모든 페이지에 독일어판과 영어판이 있는 사이트

Google이 다른 버전을 스스로 찾아낼 수도 있지만, 대개는 명시적으로 알려 주는 편이 가장 좋다고 말합니다. 번역된 페이지는 중복이 아닙니다. 현지화된 버전은 “are only considered duplicates if the main content of the page remains untranslated”, 즉 페이지의 주요 콘텐츠가 번역되지 않은 채 남아 있을 때만 중복으로 취급됩니다(Google).

hreflang이 아닌 것도 두 가지 있습니다. 먼저 Google이 페이지의 언어를 알아내는 방법이 아닙니다. Google은 페이지의 언어를 감지할 때 hreflang이나 HTML의 lang 속성을 쓰지 않는다고 밝혔고(“doesn't use hreflang or the HTML lang attribute to detect the language of a page”, Google), 다국어 사이트 문서는 그 대신 눈에 보이는 콘텐츠를 쓴다고 덧붙입니다. 그리고 순위를 약속하는 장치도 아닙니다. Google이 설명하는 목적은 하나, 검색하는 사람마다 알맞은 버전을 보여 주는 것입니다.

seogrinder.com은 12개 언어를 어떻게 연결하나요?

이 절은 2026년 11월 5일에 확인한 seogrinder.com 블로그를 설명합니다. 시작 페이지 /에는 hreflang 태그가 없습니다. 모든 글은 한 언어로 쓰인 별도의 페이지입니다. 태그는 직접 읽어 볼 수 있습니다.

curl -sS https://seogrinder.com/ko/blog/seo-chekeuliseuteu-jeomgeom | grep '<link rel="alternate" hreflang'

이 명령은 SEO 체크리스트 글의 어느 언어판에 실행해도 같은 13줄을 출력합니다(12개 언어판 모두).

<link rel="alternate" hreflang="en" href="https://seogrinder.com/en/blog/seo-audit-checklist">
<link rel="alternate" hreflang="ar" href="https://seogrinder.com/ar/blog/qaimat-tadqiq-seo">
<link rel="alternate" hreflang="de" href="https://seogrinder.com/de/blog/seo-audit-checkliste">
<link rel="alternate" hreflang="es" href="https://seogrinder.com/es/blog/checklist-seo-auditoria">
<link rel="alternate" hreflang="fr" href="https://seogrinder.com/fr/blog/checklist-audit-seo-gratuite">
<link rel="alternate" hreflang="hi" href="https://seogrinder.com/hi/blog/seo-audit-checklist-hindi">
<link rel="alternate" hreflang="it" href="https://seogrinder.com/it/blog/checklist-audit-seo">
<link rel="alternate" hreflang="ja" href="https://seogrinder.com/ja/blog/seo-chekkurisuto">
<link rel="alternate" hreflang="ko" href="https://seogrinder.com/ko/blog/seo-chekeuliseuteu-jeomgeom">
<link rel="alternate" hreflang="nl" href="https://seogrinder.com/nl/blog/seo-audit-checklist-uitvoeren">
<link rel="alternate" hreflang="pl" href="https://seogrinder.com/pl/blog/checklista-seo-audyt">
<link rel="alternate" hreflang="pt" href="https://seogrinder.com/pt/blog/checklist-de-auditoria-seo">
<link rel="alternate" hreflang="x-default" href="https://seogrinder.com/en/blog/seo-audit-checklist">

이 블록이 보여 주는 점은 다음과 같습니다.

  • 방법은 하나입니다. 태그는 HTML의 head 안에 있습니다. 이 페이지들은 HTTP 헤더로 hreflang을 보내지 않고, sitemap.xml에도 xhtml:link 항목이 없습니다. Google은 세 가지 방법이 동등하다고 설명하며, 모두 쓴다고 이점이 있다고 보지 않습니다.
  • 단순한 언어 코드입니다. 코드는 12개이고 지역은 붙이지 않았습니다. 글마다 언어별 버전이 정확히 하나씩이기 때문입니다.
  • 페이지가 자기 자신을 나열합니다. 한국어판에서는 ko 줄이 그 페이지 자신의 주소입니다. 12개 언어판이 모두 같은 줄을 담고 있습니다.
  • 태그는 단순합니다. <head> 안에 <link>를 하나씩 두었고, 추가 속성은 없습니다. Google은 올바른 형식의 head를 요구하며, 한 태그 안에서 hreflang과 media 같은 속성을 섞는 것을 경고합니다.
  • canonical은 자기 자신을 가리킵니다. 각 버전은 영어판이 아니라 자기 주소를 canonical로 씁니다. 번역된 버전은 중복이 아니라는 Google의 설명과 맞습니다.
  • 언어마다 별도 주소를 쓰고, 자동 리디렉션은 하지 않습니다. /ko/blog/seo-chekeuliseuteu-jeomgeom은 한국어를 로마자로 옮긴 slug를 씁니다. Google은 쿠키나 브라우저 설정보다 언어별로 다른 URL을 쓰라고 권하고, 추정한 언어에 따라 방문자를 리디렉션하지 말라고 조언합니다. 영어 페이지에 Accept-Language: de로 요청하면 200이 돌아오고 그 자리에 머뭅니다(2026년 11월 5일 확인). 또 모든 글에는 다른 버전으로 가는 단순한 링크가 담긴 언어 메뉴가 있습니다.

구성 방식. 각 글 파일은 group 줄에 주제를 적습니다. 블로그 코드는 group이 같은 파일을 모두 모아 구성원마다 <link>를 하나씩 출력하고(영어가 먼저, 그다음은 언어 코드순) x-default를 영어판으로 지정합니다. 파일이 없는 언어에는 줄이 생기지 않습니다. 그래서 영어와 독일어로만 있는 주제에는 en, de, x-default 세 줄이 들어갑니다. Google은 불완전한 집합도 허용합니다. “you can omit some languages on some pages; Google will still process the ones that point to each other”(Google).

집계 방법. 아래 반복문은 사이트맵에서 모든 글 주소를 읽어 페이지마다 hreflang 줄 수를 셉니다.

for u in $(curl -sS https://seogrinder.com/sitemap.xml | grep -o 'https://seogrinder.com/[a-z][a-z]/blog/[^<]*'); do
  curl -sS "$u" | grep -c '<link rel="alternate" hreflang'
done | sort | uniq -c

2026년 11월 5일에 408 13이 출력되었습니다. 13줄(12개 언어와 x-default)인 페이지가 408개라는 뜻입니다. 이어서 작은 스크립트가 같은 408개 페이지를 가져와 태그를 비교했습니다. 모든 페이지가 자기 자신을 나열하고, 나열된 모든 주소가 200으로 응답하면서 그 페이지를 되돌아 가리키며, x-default는 영어판 주소와 같았습니다. 우리의 블로그 점검(check:blog)은 블로그를 바꿀 때마다 모든 글 페이지에 대해 이 규칙을 검사합니다.

x-default는 무엇에 쓰나요?

Google은 x-default를 “recommended for specifying the fallback page for users whose language settings don't match any of your site's localized versions”라고 설명합니다(Google). 필수는 아닙니다.

Google은 어느 페이지에든 이 값을 쓸 수 있지만 “designed for language selector pages and so it will work best with those”, 즉 언어 선택 페이지를 위해 만든 값이라 그런 페이지에서 가장 잘 작동한다고 덧붙입니다. 우리에게는 글용 언어 선택 페이지가 없어서, 대체 페이지는 같은 글의 영어판입니다. 블로그 목록 페이지의 대체 페이지는 /en/blog입니다. 이것은 우리의 결정이지 규칙이 아닙니다.

자주 하는 실수: Google 문서에 나온 hreflang 오류 5가지

Google 문서에는 “Common Mistakes” 절에 항목이 세 개 있고, 가이드라인이 “must”를 붙여 요구하는 사항이 두 가지 더 있습니다. 아래 다섯 가지가 그것입니다. Google은 각 오류가 얼마나 자주 일어나는지는 말하지 않습니다. 결과가 명시된 것은 둘뿐입니다. 되돌아오는 링크 누락(태그 무시)과 예약된 지역 코드(해당 부분 무시)입니다. 나머지는 규칙만 적혀 있습니다.

1. 되돌아오는 링크 누락

페이지 X가 페이지 Y를 가리키면 페이지 Y도 페이지 X를 가리켜야 합니다. Google의 규칙은 이렇습니다. “If two pages don't both point to each other, the tags will be ignored”(Google). 이유도 Google이 함께 밝힙니다. 다른 사이트가 내 페이지의 대체 버전이라고 마음대로 선언할 수 있어서는 안 되기 때문입니다. 해결 방법은 모든 버전이 하나의 소스에서 같은 링크 블록을 출력하게 하는 것입니다. 전체 집합을 관리하기 어렵다면 Google은 일부 페이지에서 일부 언어를 생략해도 된다고 허용합니다. 다만 새로 추가한 언어는 원본 언어나 주력 언어와 양방향으로 연결해야 한다고 말합니다.

2. 자기 자신을 나열하지 않는 버전

모든 방법에 적용되는 가이드라인은 이렇습니다. “Each language version must list itself as well as all other language versions”(Google). HTML 방식에서는 자기 자신(“including itself”)을 포함해 버전마다 링크를 하나씩 두고, 모든 버전에 똑같은 집합을 둔다는 뜻입니다. 자기 참조가 없으면 어떻게 되는지는 Google이 말하지 않습니다. 오류로 보고 해당 줄을 추가하세요.

3. 유효하지 않은 언어 코드

값의 첫 부분은 ISO 639-1 형식의 언어이고, 그 뒤에 선택적으로 지역이 올 수 있습니다. Google은 이렇게 씁니다. “Specifying the region alone is not valid”. 벨기에 예시에서 be는 벨라루스어의 언어 코드이므로 틀린 값이고, 올바른 코드는 de-BE, nl-BE, fr-BE입니다. 이 표준에 없는 코드, 예를 들어 es-419는 지원되지 않습니다(zh-Hans 같은 문자 체계 코드는 허용됩니다). 대소문자는 상관없지만, 표준에 따라 지역은 대문자로 씁니다.

4. 유효하지 않은 지역 코드

지역은 공식적으로 부여된 ISO 3166-1 Alpha 2 코드여야 합니다. 다른 용도로 예약된 코드에 대해 Google은 “Google Search ignores that part of the annotation”이라고 밝힙니다. 표기의 그 부분을 무시한다는 뜻입니다. Google은 EU, UN, UK가 아무 효과가 없다고 명시합니다. 영국의 코드는 GB이며, Google 자신의 예시 en-GB가 그렇습니다.

5. 상대 주소 또는 불완전한 주소

“Alternate URLs must be fully-qualified, including the transport method (http/https)”(Google). Google의 예시는 https://example.com/foo이고, //example.com/foo나 /foo는 안 됩니다.

hreflang은 어떻게 점검하나요?

직접 점검하려면 위의 curl 명령을 내 페이지 하나에 실행해, 그 페이지가 자기 자신을 나열하는지 확인합니다. 그런 다음 출력된 주소마다 같은 명령을 실행해 첫 번째 페이지가 보이는지 찾아보세요. 이것이 되돌아오는 링크 테스트입니다. Google은 제3자가 만든 디버깅 도구도 소개하면서, 그 도구들은 “are not maintained or checked by Google”이라고 밝힙니다.

SEOgrinder는 우리의 도구이며, 우리가 만듭니다. 페이지를 검사한 뒤 「Google에서의 페이지」 탭을 열고 「언어 (hreflang)」 카드를 찾으세요. 이 카드는 코드, 자기 참조, x-default, 대상이 응답하는지, 대상이 되돌아 참조하는지를 점검합니다. 모두 정상이면 한 줄만 표시되고, 그렇지 않으면 점검 항목마다 결과가 나열되며 문제는 할 일 목록에 올라갑니다.

오류SEOgrinder가 보여 주는 내용(예시 문구)
1. 되돌아오는 링크 누락「2개 대상이 되돌아 참조하지 않습니다」
2. 자기 참조 없음「페이지가 자기 자신을 참조하지 않습니다」
3과 4. 유효하지 않은 코드「유효하지 않은 언어 코드 1개」(언어와 지역을 Google이 명시한 표준에 비추어 검사합니다)
5. 상대 주소별도의 줄 없음: SEOgrinder는 점검에 앞서 상대 주소를 페이지 기준으로 풀어 해석하므로, 이 오류는 소스에서 찾아야 합니다

한계가 두 가지 있습니다. 첫째, 페이지당 최대 10개 대상만 가져옵니다. 항목이 13개인 우리 페이지에서는 10개를 점검하고 그 사실도 알려 줍니다(「13개 항목 중 10개를 받아 확인했습니다」). 둘째, 입력한 페이지 하나를 평가합니다. 사이트 전체는 위에서처럼 반복문으로 주소를 하나씩 확인하세요.

자주 묻는 질문

언어마다 주소가 따로 있으면 hreflang이 꼭 필요한가요?

필수는 아닙니다. Google은 hreflang 없이도 다른 버전을 찾을 수 있지만, 대개는 명시적으로 알려 주는 편이 가장 좋다고 말합니다.

hreflang을 넣으면 순위가 오르나요?

Google 문서는 그렇게 주장하지 않습니다. 목적을 언어나 지역에 가장 알맞은 버전으로 사용자를 안내하는 것이라고 설명합니다. 순위는 누구도 약속할 수 없습니다.

세 가지 방법 중 무엇을 써야 하나요?

Google에게는 세 가지가 동등하며, 여러 개를 함께 써도 이점이 없습니다. Google은 HTML 태그는 사이트맵이 없거나 헤더를 제어할 수 없는 사이트에 맞고, HTTP 헤더는 PDF처럼 HTML이 아닌 파일에 맞는다고 설명합니다. 우리는 HTML 태그를 씁니다.

다음 단계

내 페이지 하나에 curl 명령을 실행해 그 페이지가 자기 자신을 나열하는지, 대상 하나가 되돌아 가리키는지 확인하세요. 그런 다음 SEOgrinder로 페이지를 검사하고, 「Google에서의 페이지」 탭에서 「언어 (hreflang)」 카드의 첫 번째 문제 줄을 고친 뒤 다시 확인을 누르세요. hreflang이 8개 점검 그룹 중 어디에 속하는지는 SEO 체크리스트에서 볼 수 있습니다.

함께 읽어 보세요

블로그의 다른 글