중급Google

국제 SEO: hreflang·URL 전략·다국어 사이트 설계 완전 가이드

핵심 요약 (TL;DR)

hreflang 태그 구현법(HTML·HTTP header·sitemap), 서브폴더vs서브도메인vs ccTLD URL 전략, x-default 설정, 언어별 canonical 관리를 다룹니다.

읽기 17 2025-03-22

다국어 SEO가 필요한 이유와 핵심 개념

동일한 콘텐츠를 여러 언어·국가로 제공하는 사이트에서, 검색엔진이 어떤 버전을 어느 국가·언어 사용자에게 보여줄지를 올바르게 판단하도록 돕는 것이 다국어 SEO(International SEO)입니다. 설정이 없으면 Google은 자체적으로 판단하며, 이로 인해 여러 문제가 발생합니다.

다국어 SEO가 없을 때 발생하는 문제

문제설명예시
중복 콘텐츠동일 내용의 여러 언어 페이지가 서로 경쟁영어·한국어 페이지가 같은 키워드에서 순위 경쟁
잘못된 버전 노출한국 사용자에게 영어 버전이 표시한국 Google에서 검색 시 영문 페이지가 1위
PageRank 분산백링크가 여러 언어 버전에 분산되어 권위도 희석en/about, ko/about, ja/about에 각각 다른 백링크 → 총합이 분산
크롤 버짓 낭비불필요한 언어 버전까지 전부 크롤10개 언어 × 1,000 페이지 = 10,000 URL 크롤 필요

핵심 용어

  • hreflang: Google에게 "이 페이지의 다른 언어/국가 버전은 여기에 있습니다"를 알려주는 HTML 속성
  • language code: ISO 639-1 언어 코드 (예: ko, en, ja)
  • region code: ISO 3166-1 Alpha-2 국가 코드 (예: KR, US, JP)
  • x-default: 특정 언어/국가에 매칭되지 않는 사용자를 위한 기본 페이지
  • ccTLD: 국가 코드 최상위 도메인 (예: .kr, .jp, .de)
75%hreflang 오류 사이트Ahrefs 조사: 다국어 사이트의 75%가 hreflang 오류 보유
40+ 언어Google 지원 언어hreflang 태그로 지원되는 언어 수
최대 60% 트래픽잘못된 geo 타겟팅 손실올바른 hreflang 적용 시 지역 트래픽 회복

hreflang 태그 완벽 가이드: 문법·규칙·구현

hreflang 태그 3가지 구현 방법

방법위치적합한 경우
1. HTML <head> 태그각 페이지의 <head><link> 태그페이지 수가 적거나 SSR/SSG 프레임워크 사용 시
2. HTTP 헤더HTTP 응답 헤더의 Link 필드PDF 등 HTML이 아닌 문서, CDN에서 헤더 추가 시
3. 사이트맵XML 사이트맵의 <xhtml:link> 태그대규모 사이트 (수천~수만 페이지), 일괄 관리 시 (★ 권장)

방법 1: HTML <head> 태그

<!-- 한국어 페이지 (example.com/ko/about) -->
<head>
  <link rel="alternate" hreflang="ko" href="https://example.com/ko/about" />
  <link rel="alternate" hreflang="en" href="https://example.com/en/about" />
  <link rel="alternate" hreflang="ja" href="https://example.com/ja/about" />
  <link rel="alternate" hreflang="x-default" href="https://example.com/en/about" />
</head>

방법 3: XML 사이트맵 (대규모 사이트 권장)

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
        xmlns:xhtml="http://www.w3.org/1999/xhtml">
  <url>
    <loc>https://example.com/ko/about</loc>
    <xhtml:link rel="alternate" hreflang="ko" href="https://example.com/ko/about" />
    <xhtml:link rel="alternate" hreflang="en" href="https://example.com/en/about" />
    <xhtml:link rel="alternate" hreflang="ja" href="https://example.com/ja/about" />
    <xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/en/about" />
  </url>
  <url>
    <loc>https://example.com/en/about</loc>
    <xhtml:link rel="alternate" hreflang="ko" href="https://example.com/ko/about" />
    <xhtml:link rel="alternate" hreflang="en" href="https://example.com/en/about" />
    <xhtml:link rel="alternate" hreflang="ja" href="https://example.com/ja/about" />
    <xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/en/about" />
  </url>
</urlset>

hreflang 4가지 필수 규칙

  1. 양방향(Bidirectional) 선언: A↔B 양쪽 페이지 모두 서로를 참조해야 합니다. 한쪽만 선언하면 Google이 무시합니다
  2. self-referencing 필수: 현재 페이지도 자기 자신을 hreflang 목록에 포함해야 합니다
  3. 절대 URL: href 값은 반드시 https://로 시작하는 절대 URL이어야 합니다
  4. 올바른 언어-국가 코드: en-US ✅ (소문자 언어-대문자 국가), EN-us ❌, en_US ❌ (밑줄 불가)

x-default의 역할

x-default어떤 hreflang에도 매칭되지 않는 사용자(예: 프랑스어 사용자인데 프랑스어 버전이 없는 경우)를 위한 폴백(fallback) 페이지입니다. 일반적으로 영어 버전이나 언어 선택 페이지를 x-default로 설정합니다.

도메인 구조 전략: ccTLD vs 서브폴더 vs 서브도메인

전략URL 예시SEO 장점SEO 단점운영 복잡도
ccTLD
(국가 도메인)
example.kr
example.jp
example.de
가장 강력한 국가 타겟팅 시그널. 사용자 신뢰도 높음 각 도메인이 별도 사이트로 취급 → 도메인 권위(DA) 분산. 별도 관리 필요 🔴 높음
도메인·호스팅·SSL 각각 관리
서브폴더
(★ 가장 권장)
example.com/ko/
example.com/en/
example.com/ja/
하나의 도메인에 권위 집중. 관리 간편. 백링크 효과 공유 ccTLD만큼 강한 국가 시그널은 아님 (hreflang + GSC 타겟팅으로 보완) 🟢 낮음
하나의 사이트에서 관리
서브도메인 ko.example.com
en.example.com
ja.example.com
독립적 인프라 운영 가능. 지역별 서버 분리 용이 Google이 별도 사이트로 취급할 수 있음 → 권위 분산. hreflang 필수 🟡 중간
DNS·SSL 관리 필요

실무 권장 사항

  • 대부분의 경우: example.com/ko/ 서브폴더 구조를 사용하세요. 구현이 가장 간단하고 도메인 권위가 통합됩니다
  • 특정 국가에 매우 강한 로컬 브랜딩이 필요한 경우: ccTLD를 고려하세요 (예: 일본 시장 전용 .jp)
  • 서브도메인: 특별한 기술적 이유(별도 CMS, 다른 호스팅 인프라)가 아니면 비권장

GSC (Google Search Console) 국가 타겟팅

서브폴더 구조를 사용하면 GSC에서 각 서브폴더를 별도 속성으로 등록하고 국제 타겟팅을 설정할 수 있습니다.

  1. GSC에 example.com/ko/를 URL 접두어 속성으로 추가
  2. 설정 → 국제 타겟팅 → 국가 선택 (한국)
  3. 각 서브폴더별로 반복

ccTLD (국가 도메인)

  • 가장 강한 국가 시그널
  • 도메인 권위(DA) 분산 (각각 독립)
  • 도메인·호스팅·SSL 각각 등록
  • 비용 높음 (도메인 수 × 비용)
  • 대기업·글로벌 브랜드에 적합
vs

서브폴더 (★ 권장)

  • 하나의 도메인에 권위 집중
  • 백링크 효과 전체 사이트에 공유
  • 관리 포인트 최소화
  • 비용 낮음 (하나의 도메인)
  • 대부분의 비즈니스에 적합

자동 리디렉션의 위험: Accept-Language 기반 리디렉트를 피해야 하는 이유

많은 사이트가 사용자의 Accept-Language 헤더나 IP 기반 위치를 감지하여 자동으로 해당 언어 페이지로 리디렉션합니다. 이것은 SEO에 심각한 문제를 일으킵니다.

자동 리디렉션이 위험한 5가지 이유

문제설명
1. Googlebot 크롤링 차단Googlebot은 보통 미국 IP + 영어 Accept-Language로 크롤합니다. 자동 리디렉션이 있으면 한국어 페이지를 크롤하려 해도 영어 페이지로 리디렉션되어 한국어 콘텐츠를 인덱싱할 수 없습니다
2. 링크 공유 무력화한국어 URL을 공유해도 미국 사용자가 클릭하면 영어로 리디렉션 → 의도한 콘텐츠를 볼 수 없음
3. 캐시 충돌CDN이 한국어 응답을 캐시했는데 미국 사용자에게 한국어가 보이는 등 캐시 오동작
4. 사용자 선택권 박탈재외 한국인이 미국에서 한국어 사이트를 보고 싶어도 영어로 강제 리디렉션
5. hreflang 무력화hreflang으로 올바른 버전을 안내해도 리디렉션이 이를 덮어씀

올바른 대안: 배너(Suggestion) 방식

<!-- 리디렉션 대신 언어 전환 배너를 표시 -->
<div class="language-banner">
  🌐 이 페이지의 한국어 버전이 있습니다.
  <a href="/ko/about">한국어로 보기</a>
  <button onclick="dismissBanner()">English로 계속</button>
</div>
  • ✅ 배너 표시: 사용자에게 언어 전환을 제안하되 강제하지 않음
  • ✅ 쿠키 기반 기억: 사용자가 선택한 언어를 쿠키에 저장하여 다음 방문 시 적용
  • ❌ 자동 리디렉션: 302/301로 강제 전환 ← 절대 하지 마세요

IP 기반 리디렉션이 허용되는 유일한 경우

루트 도메인(example.com)에서만 사용자를 적절한 로케일 페이지로 안내하는 것은 허용됩니다. 단, 302(임시) 리디렉션을 사용하고, 301(영구)은 사용하지 마세요. 또한 x-default를 루트 도메인으로 설정해야 합니다.

다국어 canonical·사이트맵·콘텐츠 전략

다국어 canonical 태그 규칙

각 언어 버전은 자기 자신을 canonical로 지정해야 합니다. 다국어 페이지 간에 canonical을 서로 가리키면 안 됩니다.

<!-- ✅ 올바른 canonical 설정 -->
<!-- /ko/about 페이지 -->
<link rel="canonical" href="https://example.com/ko/about" />

<!-- /en/about 페이지 -->
<link rel="canonical" href="https://example.com/en/about" />

<!-- ❌ 잘못된 canonical --- 한국어 페이지가 영어를 canonical로 가리킴 -->
<!-- /ko/about 페이지 -->
<link rel="canonical" href="https://example.com/en/about" />

만약 한국어 페이지가 영어 페이지를 canonical로 지정하면, Google은 한국어 버전을 중복으로 판단하고 인덱싱에서 제외할 수 있습니다.

다국어 사이트맵 구성

방식설명적합
통합 사이트맵 + hreflang하나의 사이트맵에 모든 언어의 URL을 포함하고 xhtml:link로 hreflang 선언서브폴더 구조 (example.com/ko/)
언어별 사이트맵 + 사이트맵 인덱스언어별로 sitemap-ko.xml, sitemap-en.xml을 만들고 인덱스로 통합대규모 사이트 (10만+ 페이지)
독립 사이트맵각 ccTLD/서브도메인에서 독립 사이트맵 운영ccTLD 구조

콘텐츠 전략: 번역 vs 트랜스크리에이션 vs 로컬라이제이션

전략설명SEO 효과비용
기계 번역Google Translate, DeepL로 자동 번역⚠️ 낮음 — 부자연스러운 문장, 키워드 누락✅ 매우 낮음
전문 번역원문을 정확하게 다른 언어로 번역🟡 보통 — 정확하지만 문화적 맥락 부족⚠️ 중간
트랜스크리에이션의미를 유지하면서 문화·정서에 맞게 재창작✅ 높음 — 현지 검색 의도에 맞는 키워드 사용❌ 높음
로컬라이제이션통화·날짜·단위·문화적 참조까지 현지화✅ 최고 — 완전한 현지화 경험❌ 매우 높음

다국어 키워드 리서치

직역하지 마세요. 같은 개념이라도 각 언어에서 검색되는 키워드가 다릅니다.

  • 영어 sneakers ≠ 한국어 스니커즈 (한국에서는 운동화가 더 높은 검색량)
  • 영어 best laptops ≠ 일본어 ノートパソコン おすすめ (직역하면 最高のラップトップ이지만 실제 검색에서는 다른 표현 사용)
  • 각 타겟 언어의 네이티브 스피커가 키워드 리서치에 참여해야 합니다

Next.js에서 다국어 SEO 구현

Next.js App Router의 i18n 라우팅 패턴

app/
  [locale]/          // 동적 세그먼트로 언어 분기
    layout.tsx       // 언어별 Layout
    page.tsx         // 홈페이지
    about/
      page.tsx       // /ko/about, /en/about
    blog/
      [slug]/
        page.tsx     // /ko/blog/post-1, /en/blog/post-1

hreflang 자동 생성 (generateMetadata)

// app/[locale]/about/page.tsx
const locales = ['ko', 'en', 'ja'];

export async function generateMetadata({ params }) {
  const { locale } = await params;
  const t = await getTranslations(locale);

  return {
    title: t('about.title'),
    description: t('about.description'),
    alternates: {
      canonical: `https://example.com/${locale}/about`,
      languages: Object.fromEntries(
        locales.map(l => [l, `https://example.com/${l}/about`])
      ),
      // → { ko: '.../ko/about', en: '.../en/about', ja: '.../ja/about' }
    },
  };
}

다국어 사이트맵 생성 (sitemap.ts)

// app/sitemap.ts
const locales = ['ko', 'en', 'ja'];
const pages = ['', 'about', 'contact', 'blog'];

export default async function sitemap() {
  const entries = [];

  for (const page of pages) {
    for (const locale of locales) {
      const url = `https://example.com/${locale}/${page}`.replace(/\/$/, '');
      const languages = Object.fromEntries(
        locales.map(l => [l, `https://example.com/${l}/${page}`.replace(/\/$/, '')])
      );

      entries.push({
        url,
        lastModified: new Date(),
        alternates: { languages },
      });
    }
  }

  return entries;
}

미들웨어로 루트 리디렉션 (권장 패턴)

// middleware.ts
import { NextRequest, NextResponse } from 'next/server';
import Negotiator from 'negotiator';

const locales = ['ko', 'en', 'ja'];
const defaultLocale = 'en';

function getPreferredLocale(req: NextRequest): string {
  const headers = { 'accept-language': req.headers.get('accept-language') || '' };
  const languages = new Negotiator({ headers }).languages();
  return languages.find(l => locales.includes(l)) || defaultLocale;
}

export function middleware(req: NextRequest) {
  const { pathname } = req.nextUrl;

  // 이미 locale이 있으면 통과
  if (locales.some(l => pathname.startsWith(`/${l}`))) return;

  // 루트 접속 시만 언어 감지 후 302 리디렉션
  const locale = getPreferredLocale(req);
  return NextResponse.redirect(new URL(`/${locale}${pathname}`, req.url), 302);
}

자주 묻는 질문 (FAQ)

Q. Bing도 hreflang을 지원하나요?
Bing은 hreflang을 지원하지 않습니다. Bing은 대신 <meta http-equiv="content-language" content="ko"> 태그와 <html lang="ko"> 속성을 사용하여 언어를 판별합니다. 다국어 사이트에서 양쪽 검색엔진을 모두 지원하려면 hreflang(Google용) + html lang 속성(Bing·기타용)을 함께 사용하세요. 네이버도 hreflang을 지원하지 않으며 html lang과 콘텐츠 자체의 언어를 기반으로 판별합니다.
Q. 영어와 한국어만 있는 사이트에서도 hreflang이 필요한가요?
네, 2개 언어여도 hreflang이 필요합니다. 없으면 Google이 한국 사용자에게 영어 버전을 보여주거나, 두 버전이 중복 콘텐츠로 경쟁할 수 있습니다. 최소한 hreflang="ko", hreflang="en", hreflang="x-default" 세 개를 양쪽 모든 페이지에 추가하세요.
Q. 일부 페이지만 번역된 경우 hreflang은 어떻게 설정하나요?
번역이 존재하는 페이지에만 hreflang을 설정하세요. 존재하지 않는 언어 버전을 hreflang에 포함하면 404 에러가 발생하고 Google이 hreflang 태그 전체를 무시할 수 있습니다. 규칙: (1) 번역이 있는 페이지 → 해당 언어 hreflang 추가, (2) 번역이 없는 페이지 → 해당 언어 hreflang 생략, (3) x-default는 항상 폴백 페이지를 가리키도록 설정. 모든 페이지가 모든 언어로 번역될 필요는 없습니다.
Q. hreflang과 canonical이 충돌하면 어떻게 되나요?
각 언어 버전이 자기 자신을 canonical로 지정하면 충돌하지 않습니다. 문제는 한국어 페이지가 영어 페이지를 canonical로 가리키는 경우에 발생합니다: Google은 "이 한국어 페이지는 영어 페이지의 중복이다"로 해석하여 한국어 버전을 인덱싱하지 않습니다. 규칙: 다국어 페이지 간에는 절대 cross-language canonical을 사용하지 마세요. canonical은 같은 언어 내에서만 사용합니다 (예: www와 non-www 통합).
Q. 자동 번역 플러그인(예: Weglot, TranslatePress)을 사용하면 SEO에 효과가 있나요?
Weglot, TranslatePress 같은 플러그인은 hreflang 태그를 자동으로 추가하고 서브폴더/서브도메인 구조를 자동 생성하므로 기술적 SEO 설정은 올바르게 처리됩니다. 문제는 번역 품질입니다: (1) 초기 기계 번역 품질이 낮으면 콘텐츠 품질 시그널에 부정적, (2) 키워드가 직역되어 현지 검색 의도와 불일치, (3) 문화적 맥락이 누락. 실무 권장: 플러그인으로 기계 번역 → 네이티브 스피커가 핵심 페이지를 수동 교정 → 중요하지 않은 페이지는 기계 번역 유지. 이 하이브리드 접근이 비용 대비 가장 효과적입니다.

지금 읽으신 SEO 지식, 바로 적용해보세요!

검색엔진 최적화는 실전입니다. SEO SOVISS의 무료 분석 도구로 내 웹사이트의 오디트 점수를 즉시 확인하고 기술적 문제점을 점검해보세요.

내 웹사이트 진단하기 →
정수아

데이터분석팀 선임

정수아

GA4, Search Console 및 서버 로그 데이터를 기반으로 사용자 행동을 분석하고 트래픽 갭(Traffic Gap)을 도출합니다.

SEO SOVISS 전체 집필진 보기 →
국제 SEO: hreflang·URL 전략·다국어 사이트 설계 완전 가이드