서식은 정확히 어떻게 쓰나

HTML 방식은 <link rel="alternate" hreflang="[lang_code]" href="url_of_page" /> 형태이고, 이 태그들은 반드시 형식이 올바른 head 섹션 안에 있어야 합니다. HTTP 헤더 방식은 Link: <url1>; rel="alternate"; hreflang="[lang_code_1]", <url2>; rel="alternate"; hreflang="[lang_code_2]" 형태로 여러 대상을 쉼표로 이어 붙입니다. 사이트맵 방식은 xmlns:xhtml="http://www.w3.org/1999/xhtml" 네임스페이스를 선언한 뒤 각 URL 항목 안에 <xhtml:link rel="alternate" hreflang="[supported_language-code]" href="..."/>를 넣습니다.

세 방법은 대안 관계이지 누적해서 쓰라는 뜻이 아닙니다. 하나를 골라 일관되게 유지하는 편이 관리에 유리합니다. HTML head를 쓸 수 없는 PDF 같은 파일은 HTTP 헤더 방식만 가능하므로, 파일 유형이 섞인 사이트라면 헤더나 사이트맵 방식을 기본으로 잡는 쪽이 편합니다.

왜 상호 참조가 그렇게 중요한가

구글 문서는 두 페이지가 서로를 가리키지 않으면 태그가 무시된다고 명시합니다. 페이지 X가 페이지 Y를 가리키면 페이지 Y도 페이지 X를 가리켜야 하고, 각 언어 변형은 자기 자신을 포함해 모든 변형을 참조해야 합니다.

실무에서 가장 흔한 누락이 자기 자신을 가리키는 항목입니다. 한국어 페이지에 영어·일본어만 나열하고 한국어 자신은 빼는 식인데, 이러면 세트 전체가 무시될 수 있습니다. 언어를 추가할 때 기존 페이지들의 목록을 함께 갱신하지 않는 것도 같은 결과를 만듭니다. 언어 버전 추가는 새 페이지 하나를 만드는 작업이 아니라 세트 전체를 다시 쓰는 작업으로 다뤄야 합니다.

코드는 어떤 기준으로 적어야 하나

지원되는 값은 ISO 639-1 언어 코드와 ISO 3166-1 Alpha 2 지역 코드뿐입니다. en, de처럼 언어만 쓰거나 en-GB, de-CH처럼 언어와 지역을 붙여 씁니다. 문자 체계는 ISO 15924로 지정해 zh-Hans, zh-Hant처럼 씁니다. 지역 코드를 언어 없이 단독으로 쓰는 것은 허용되지 않고, es-419 같은 비표준 코드도 지원되지 않습니다.

여기서 오해가 자주 생깁니다. 지역 코드는 "이 나라 사용자에게 이 버전을 보여달라"는 뜻이지 "이 나라에서만 노출된다"는 차단 설정이 아닙니다. hreflang은 순위를 올리는 신호도 아닙니다. 같은 콘텐츠의 여러 버전 중 어느 것을 보여줄지 고르는 신호이므로, 순위가 안 오르는 문제를 hreflang으로 풀려고 하면 방향이 어긋납니다.

x-default는 언제 넣어야 하나

x-default는 사이트의 어떤 현지화 버전과도 언어 설정이 맞지 않는 사용자를 위한 대체 페이지를 지정하는 값입니다. <link rel="alternate" href="https://example.com/" hreflang="x-default" /> 형태로 씁니다. 보통 언어 선택 페이지나 글로벌 기본 페이지를 지정합니다.

필수는 아니지만 지정하지 않으면 미지원 언어 사용자가 어느 버전으로 갈지는 구글 판단에 맡겨집니다. 진출국을 늘려 갈 계획이라면 처음부터 x-default를 넣어 두는 편이 나중에 언어를 추가할 때 흔들림이 적습니다.

캐노니컬·URL 구조와는 어떻게 맞물리나

hreflang과 rel=canonical은 역할이 다릅니다. 캐노니컬은 중복 콘텐츠가 있을 때 어느 URL을 정규 버전으로 볼지 명시해 인덱싱 신호를 하나로 모으는 태그입니다. 언어 버전끼리는 중복이 아니므로, 각 언어 페이지의 캐노니컬은 자기 자신을 가리켜야 합니다. 영어 페이지의 캐노니컬을 한국어 페이지로 걸어 두면 hreflang을 아무리 정확히 써도 영어 페이지가 인덱스에서 빠집니다.

URL 구조도 함께 정해야 합니다. 구글은 URL에서 하이픈을 단어 사이 공백으로, 밑줄을 단어를 이어붙이는 문자로 해석합니다. 파라미터가 많고 복잡한 URL은 사실상 같은 콘텐츠를 가리키는 URL 수를 불필요하게 늘려 크롤링 효율을 떨어뜨립니다. 언어를 쿼리 파라미터로 붙이는 방식보다 하위 디렉터리나 서브도메인으로 나누는 쪽이 관리와 검증 모두 수월합니다. 기존 URL을 옮기게 되면 301 리다이렉트로 명시해야 링크 자산이 넘어가고, 등록기관 기본 포워딩이 302로 설정된 경우가 많아 이관 시 확인이 필요합니다.