// 무료 도구 · HREFLANG 생성기
hreflang 생성기
URL 패턴 하나와 언어 코드 목록을 넣으면 x-default까지 포함한 hreflang link 태그 전체와, 사이트맵에 넣을 xhtml:link 블록을 함께 만들어 줍니다. 무료이고 브라우저 안에서 끝납니다.
다른 언어:EnglishDeutschEspañolFrançais日本語한국어Português (Brasil)繁體中文
{locale} 자리에 언어 세그먼트가 들어갑니다. 소문자 코드로 바뀌며(pt-br), 세그먼트가 비면 사이트 루트가 됩니다.
ISO 639-1 코드이며 필요하면 -Script나 -REGION을 붙입니다(zh-Hant, pt-BR). 코드 뒤에는 경로(ko /pricing/ 이면 한국어가 루트), 전체 URL, 또는 직접 지정한 세그먼트(zh-Hant tw)를 쓸 수 있습니다.
목록의 어떤 언어와도 맞지 않는 검색자에게 보여 줄 버전입니다. 보통 영어 버전이나 루트 페이지를 지정합니다.
hreflang 태그를 만드는 네 단계
패턴 하나, 목록 하나, 복사 버튼 두 개. 모든 URL을 같은 패턴에서 만들어 내기 때문에, 빠짐없이 서로를 가리키는 한 벌이 구조적으로 완성됩니다. 손으로 대조할 일이 없습니다.
- URL 패턴을 입력합니다. 아무 버전의 URL을 가져와 언어 세그먼트 자리를 {locale}로 바꿔 씁니다: https://example.com/{locale}/pricing/. 코드는 소문자로 들어가고, 세그먼트가 비면 사이트 루트가 됩니다.
- 언어 코드를 나열합니다. 한 줄에 하나씩: ko, en, ja, zh-Hant. 패턴을 따르지 않는 버전이 있으면 — 한국어가 루트에 있다든지 — 코드 뒤에 경로를 적습니다: ko /pricing/. 도메인이 다르면 전체 URL을 그대로 적어도 됩니다.
- x-default를 고릅니다. 목록의 어떤 언어와도 맞지 않는 검색자에게 어느 버전을 보여 줄지 정합니다. 보통 루트나 영어 버전입니다. 생략해도 되지만 생성기는 경고합니다. x-default가 없는 한 벌은 그 판단을 검색엔진에 넘기는 것이기 때문입니다.
- 두 블록을 복사합니다. head 블록은 그대로 모든 버전의 head에 붙여넣습니다. 각 페이지는 자기 자신을 포함해 모든 버전을 나열해야 합니다. 사이트맵 블록은 xhtml 네임스페이스를 선언한 urlset 안에 넣습니다. 한쪽만 써도 충분하고, 둘 다 두려면 내용이 일치해야 합니다.
hreflang이 하는 일과, 서로 가리켜야 하는 이유
hreflang은 link 요소의 속성으로, 페이지의 각 버전이 어떤 언어(필요하면 어떤 지역)를 위해 쓰였는지 검색엔진에 알려 줍니다. 이 표시가 없으면 한국어로 검색한 사람이 영어 페이지에 도착하고, 정작 한국어 페이지는 중복에 가깝다는 이유로 색인되지 않은 채 남을 수 있습니다. 표시가 있으면 Google이 알맞은 버전으로 바꿔 보여 주고, 신호를 여러 URL로 흩뜨리지 않고 한 그룹으로 합칩니다.
대부분이 걸려 넘어지는 규칙은 상호 참조입니다. 모든 버전이 다른 모든 버전과 자기 자신을 나열해야 합니다. A가 B를 가리키는데 B가 A를 가리키지 않으면, Google은 그 표시를 믿을 수 없는 것으로 보고 버립니다. 한쪽이 아니라 그 짝 전체가 사라집니다. 손으로 관리하는 한 벌은 언어를 하나 추가하는 순간 어긋나기 시작합니다. 그래서 이 생성기는 패턴 하나에서 한 벌 전체를 써 내고, 페이지마다 맞춰 가야 하는 조각이 아니라 어디에나 그대로 붙일 수 있는 한 블록을 돌려줍니다.
같은 규칙이 clize.ai 자신의 hreflang을 만듭니다. 사이트맵과 각 언어 페이지가 로케일 접두사 목록 하나에서 생성되므로, 사이트맵이 모르는 버전을 페이지가 주장할 수 없습니다.
한국어는 ko 하나면 됩니다 — 그리고 도메인이 갈릴 때
한국어는 hreflang에서 가장 단순한 언어에 속합니다. 시장이 사실상 하나이기 때문에 지역 코드가 필요 없습니다. ko 한 줄이면 한국어를 읽는 모든 사람을 가리킵니다. ko-KR도 유효하지만 얻는 것은 없습니다. 대한민국 외에 한국어 버전을 따로 만들 계획이 없다면 ko가 더 짧고 오해의 여지도 적습니다. 독일어가 de-DE·de-AT·de-CH로 갈리고 스페인어가 es-ES·es-419로 갈리는 것과 달리, 한국어에는 그런 분기가 없습니다.
대신 한국에서 가장 흔한 오기는 kr입니다. KR은 국가 코드이지 언어 코드가 아니고, hreflang 값은 반드시 언어로 시작해야 합니다. kr이라고 쓰면 그 줄만 무시되는 것이 아니라 그 짝의 상호 참조가 함께 무효가 됩니다. 언어는 ko, 국가까지 붙이려면 ko-KR입니다. 같은 이유로 jp는 일본어가 아니고(ja입니다), uk는 영국이 아니라 우크라이나어입니다.
한국 기업 사이트에서 진짜 문제가 되는 것은 코드가 아니라 도메인이 갈리는 구조입니다. 한국어는 example.co.kr, 영어는 example.com — 이런 배치가 흔한데, 이때 hreflang이 도메인을 넘어 동작한다는 사실을 모르고 두 사이트를 서로 남처럼 두는 경우가 많습니다. hreflang은 도메인 경계와 무관합니다. 서로를 가리키기만 하면 됩니다. 이 생성기에서는 코드 뒤에 전체 URL을 그대로 적으면 됩니다. 예를 들어 ko https://example.co.kr/pricing/와 en https://example.com/pricing/를 한 줄씩 적으면, 두 도메인을 잇는 한 벌이 나옵니다. 그 블록을 양쪽 사이트에 똑같이 넣어야 상호 참조가 성립합니다. 한쪽에만 넣으면 없는 것과 같습니다.
x-default는 한국어와 영어 두 장뿐인 사이트에서도 의미가 있습니다. 목록에 없는 언어로 검색한 사람 — 일본어나 중국어 사용자 — 에게 무엇을 보여 줄지 정하는 줄이기 때문입니다. 보통 영어 버전을 지정합니다. 지정하지 않으면 검색엔진이 대신 고릅니다.
canonical과 hreflang을 함께 쓰기
모든 언어 버전에는 자기 자신을 가리키는 canonical이 필요합니다. 한국어 페이지에는 <link rel="canonical" href="https://example.com/ko/pricing/">처럼 한국어 페이지 자신을 가리키는 canonical을 둡니다. canonical은 head 안에서 버전마다 달라지는 유일한 태그라서 위의 공용 블록에 넣지 않았습니다. 페이지마다 따로 쓰고, 절대 다른 언어 버전을 가리키지 않게 하세요. 한국어 페이지의 canonical이 영어 URL을 가리키면 Google에게 "대신 영어를 색인하라"고 말하는 셈이고, 그 페이지는 hreflang 그룹에서 빠집니다. 도메인이 갈린 사이트에서 특히 자주 나오는 사고입니다.
나머지 두 조건은 기계적입니다. 한 벌에 들어간 모든 URL은 200을 반환하고 색인 가능해야 하며(리디렉션도 noindex도 안 됩니다), URL은 스킴과 호스트를 포함한 절대 URL이어야 합니다. 이 생성기는 절대 URL만 출력합니다. 리디렉션 여부와 색인 상태는 크롤로 확인하거나, 자기 도메인이라면 clize seo check로 각 페이지의 HTTP 상태와 Google 색인 상태를 무료로 한 번에 볼 수 있습니다.
hreflang에서 자주 나오는 실수
- 언어 코드 자리에 kr. KR은 국가 코드입니다.
ko또는ko-KR로 쓰세요. - 되돌아오는 링크 누락. A는 B를 가리키는데 B는 A를 가리키지 않으면 그 짝은 버려집니다. 같은 블록을 모든 버전에 그대로 넣으세요.
- 자기 자신이 빠짐. 각 페이지는 한 벌 안에 자기 자신을 포함해야 합니다. 생성된 블록에는 이미 들어 있습니다.
- 도메인이 다른 사이트를 서로 연결하지 않음. hreflang은 도메인을 넘어 동작합니다. 코드 뒤에 전체 URL을 적고, 양쪽 도메인에 같은 블록을 넣으세요.
- canonical이 다른 언어를 가리킴. 그 페이지는 한 벌에서 빠집니다. 모든 버전에 자기 참조 canonical을 두세요.
- 상대 URL. hreflang에는 스킴과 호스트를 포함한 절대 URL이 필요합니다. 이 생성기는 그 외의 것을 내보내지 않습니다.
- 리디렉션되거나 noindex인 페이지가 한 벌에 포함됨. 한 벌의 모든 URL은 살아 있고 색인 가능한 200이어야 합니다.
- head와 사이트맵의 내용이 다름. 한쪽으로 정하거나, 여기처럼 둘 다 같은 소스에서 생성하세요.
같은 페이지의 다른 기계용 표면에도 "소스는 하나" 원칙이 그대로 적용됩니다. FAQ schema 생성기는 JSON-LD와 화면에 보이는 HTML을 목록 하나에서 써 내고, 에이전트를 위해 llms.txt를 공개한다면 llms.txt 검사기에 넣어 보세요(둘 다 영어). 거기서의 상대 링크는 여기서의 상대 hreflang과 같은 종류의 실수입니다.
// 자주 묻는 질문
hreflang이 무엇인가요?
hreflang은 link 요소의 속성으로, 페이지의 각 버전이 어떤 언어(필요하면 어떤 지역)를 위해 쓰였는지 검색엔진에 알려 줍니다. Google은 이것을 보고 검색자의 언어와 위치에 맞는 버전을 보여 주며, 여러 버전을 중복이 아니라 하나의 그룹으로 취급합니다.
한국어는 ko와 ko-KR 중 무엇을 써야 하나요?
ko로 충분합니다. 한국어를 쓰는 시장이 사실상 하나여서 지역 코드로 나눌 이유가 없습니다. ko-KR도 유효하지만 얻는 것이 없고, 대한민국 밖을 위한 한국어 버전을 따로 만들 계획이 없다면 ko가 더 짧고 오해의 여지도 적습니다.
언어 코드를 kr로 써도 되나요?
안 됩니다. KR은 국가 코드이고 hreflang 값은 반드시 언어로 시작해야 합니다. 한국어는 ko이고, 국가까지 붙이려면 ko-KR입니다. kr이라고 쓰면 그 줄이 무시될 뿐 아니라 그 짝의 상호 참조까지 무효가 됩니다.
한국어 사이트와 영어 사이트의 도메인이 다른데 hreflang으로 연결할 수 있나요?
연결할 수 있습니다. hreflang은 도메인 경계와 무관하게 동작합니다. 이 생성기에서는 코드 뒤에 전체 URL을 적으면 됩니다. 예를 들어 ko https://example.co.kr/pricing/ 과 en https://example.com/pricing/ 처럼 적고, 생성된 같은 블록을 두 도메인 양쪽에 넣어야 상호 참조가 성립합니다.
한국어와 영어 두 개뿐인데 x-default가 필요한가요?
권장합니다. x-default는 목록에 없는 언어로 검색한 사람에게 어떤 버전을 보여 줄지 정하는 줄이라서, 일본어나 중국어 사용자가 왔을 때 무엇을 받을지 여러분이 정하게 됩니다. 보통 영어 버전을 지정하고, 지정하지 않으면 검색엔진이 대신 고릅니다.
hreflang은 head에 넣나요, 사이트맵에 넣나요?
둘 중 하나만 있어도 충분합니다. head의 link 요소, HTML이 아닌 파일에는 HTTP Link 헤더, 또는 sitemap.xml의 xhtml:link 항목입니다. 버전이 많으면 사이트맵에 두는 편이 head를 가볍게 유지합니다. 둘 다 쓴다면 내용이 일치해야 하므로 같은 소스에서 생성하세요.
hreflang과 canonical이 충돌하나요?
각 버전이 자기 자신을 가리키는 canonical을 가지고 있다면 충돌하지 않습니다. canonical이 다른 언어 버전을 가리키면 검색엔진에게 그쪽을 색인하라고 말하는 것이 되고, 그 페이지는 hreflang 그룹에서 빠집니다.
태그를 넣었다면, Google이 실제로 무엇을 보는지 확인하세요.
자기 사이트 점검은 무료입니다. 페이지마다 HTTP 상태와 Google 색인 상태, Search Console의 순위와 노출수를 직전 기간과 비교한 값, 그리고 유입 경로별 트래픽을 AI 엔진과 분리해 돌려줍니다. 에이전트 안에서 명령 한 줄이면 됩니다.
$ npm i -g @clize/clize && clize install $ clize seo check --domain example.co.kr[ Clize의 Agent SEO → ]