[시리즈 6부] 301 리다이렉트 vs Canonical: 정확한 선택 기준|올씽블로거

prfparkst
By -
0

[시리즈 6부] 301 리다이렉트 vs Canonical: 정확한 선택 기준

"둘 다 중복을 해결하는데, 언제 뭘 써야 할까요?
잘못 선택하면 트래픽이 날아갑니다."


충격적인 실수: 2천만 원이 날아간 하루

2025년 3월, 한 이커머스 대표가 제게 급하게 연락했습니다.

"어제 사이트 개편했는데 오늘 매출이 90% 떨어졌어요!"

확인 결과:

Before: 
- URL: /products/best-seller-shoes

After (개편):
- URL: /shop/shoes/best-seller
- 설정: Canonical 태그로 구URL 지정
  <link rel="canonical" href="/products/best-seller-shoes" />

문제: URL을 영구 변경했는데 301 대신 Canonical 사용

결과:

  • 사용자가 신URL 접속 → 구URL로 리다이렉트 안 됨
  • 페이지는 로딩되지만 구글은 구URL을 인덱싱
  • 신URL은 검색 결과에서 사라짐
  • 하루 매출 2천만 원 손실

해결: Canonical 제거 → 301 리다이렉트 설정
회복 시간: 72시간

이것이 바로 301 vs Canonical 선택이 중요한 이유입니다.


Part 1: 301과 Canonical의 근본적 차이

🔀 301 Redirect (영구 리다이렉트)

작동 방식:

사용자가 A 페이지 요청
→ 서버: "이 페이지는 B로 이동했어요" (301 코드)
→ 브라우저 자동으로 B로 이동
→ 사용자는 B 페이지 봄

구글봇이 A 페이지 크롤
→ 서버: "이 페이지는 B로 이동" (301)
→ 구글: "A를 인덱스에서 제거, B를 인덱싱"
→ A의 SEO 신호 → B로 전달 (90~99%)

핵심 특징:

  • ✅ 사용자와 봇 모두 자동 이동
  • ✅ 구URL 인덱스 제거, 신URL 인덱싱
  • ✅ 링크 주스 90~99% 전달
  • ✅ 브라우저 주소창 URL 변경

🔗 Canonical (표준 URL 지정)

작동 방식:

사용자가 A 페이지 요청
→ 서버: A 페이지 정상 제공
→ 사용자는 A 페이지 봄
→ URL도 A 그대로

구글봇이 A 페이지 크롤
→ HTML에서 <link rel="canonical" href="B"> 발견
→ 구글: "A 콘텐츠는 B와 중복이구나"
→ 구글: "B를 인덱싱, A는 제외"
→ A의 SEO 신호 → B로 통합

핵심 특징:

  • ✅ 사용자는 A 페이지 그대로 봄 (이동 안 함)
  • ✅ 봇만 B를 선호 URL로 인식
  • ✅ 링크 주스 통합 (100%에 가까움)
  • ✅ 브라우저 주소창 URL 불변

📊 한눈에 비교

기준 301 Redirect Canonical
사용자 경험 자동 이동 (URL 변경) 현재 페이지 유지
봇 동작 A 제거, B 인덱싱 B 인덱싱, A 참조만
페이지 접근성 A 접근 불가 (자동 이동) A, B 둘 다 접근 가능
링크 주스 전달 90~99% 거의 100%
적용 속도 즉시 (서버 응답) 재크롤 필요 (느림)
영구성 영구 이동 신호 힌트 (구글이 무시 가능)
사용자 혼란 없음 (자동 이동) 없음 (그대로)

Part 2: 언제 301을 쓰고, 언제 Canonical을 써야 하는가

301 Redirect를 써야 하는 상황

1. URL 영구 변경 (가장 흔함)

케이스:
- 사이트 구조 개편
- URL 규칙 변경
- 도메인 변경

예시:
/products/item-123 → /shop/items/item-123

방법:
301 리다이렉트 설정

이유: 사용자가 구URL로 접근 시 자동으로 신URL로 안내


2. HTTPS 마이그레이션

케이스:
http://site.com → https://site.com

방법:
모든 HTTP 페이지 → HTTPS로 301

코드 예시 (Apache .htaccess):

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

3. www vs non-www 통합

케이스:
www.site.com + site.com 둘 다 접근 가능

선택:
https://www.site.com (또는 non-www)

방법:
선택하지 않은 것 → 선택한 것으로 301

코드 예시 (Nginx):

server {
    listen 80;
    server_name site.com;
    return 301 https://www.site.com$request_uri;
}

4. 페이지 삭제 (대체 페이지 있음)

케이스:
/old-product (단종) → /new-product (후속작)

방법:
301 리다이렉트

이유:

  • 구 상품 링크를 북마크한 사용자 → 신상품으로 유도
  • 구 상품의 SEO 자산 → 신상품으로 전달

5. 사이트 마이그레이션

케이스:
old-domain.com → new-domain.com

방법:
모든 페이지 1:1 매칭 301

예시:

old-domain.com/about → new-domain.com/about
old-domain.com/products/1 → new-domain.com/products/1

Canonical을 써야 하는 상황

1. 파라미터 URL (콘텐츠 동일)

케이스:
/products?color=red
/products?sort=price
/products?utm_source=facebook

원본:
/products

방법:
모든 변형에 canonical 추가
<link rel="canonical" href="/products" />

이유:

  • 파라미터 URL도 접근 가능해야 함 (필터 유지)
  • 301하면 필터가 사라짐

2. 중복 콘텐츠 (여러 경로로 접근)

케이스:
/blog/seo-guide
/category/seo/seo-guide
/author/john/seo-guide

같은 글, 다른 URL

방법:
메인 URL만 남기고 나머지는 canonical

3. 프린트/공유 버전

케이스:
/article/123
/article/123/print
/article/123/amp

방법:
print, amp → 원본을 canonical로

이유:

  • 사용자가 프린트 버전 직접 접근 가능
  • SEO는 원본으로 통합

4. A/B 테스트 페이지

케이스:
/landing-v1
/landing-v2 (테스트 중)

방법:
v2 → v1을 canonical로 (또는 반대)

이유:

  • 테스트 기간 동안 두 페이지 모두 접근 필요
  • SEO 신호는 하나로 통합

5. 모바일 버전 (별도 URL)

케이스:
site.com/page (데스크톱)
m.site.com/page (모바일)

방법:
모바일 → 데스크톱 canonical

이유:

  • 모바일 사용자는 모바일 URL로 접근
  • 검색 인덱스는 데스크톱 URL로 통합

Part 3: 잘못 선택하면 벌어지는 일

💥 실수 1: 301 써야 하는데 Canonical 사용

상황:

사이트 개편으로 모든 URL 변경
/old-structure/page → /new-structure/page

잘못된 조치:
신 페이지에 구 페이지를 canonical로 지정

결과:

1. 사용자가 신URL 접근 → 정상 표시 (OK)
2. 구글이 신URL 크롤 → 구URL을 canonical로 인식
3. 구URL은 이미 404 (삭제됨)
4. 구글 혼란 → 신URL 인덱싱 안 됨
5. 사이트 전체가 검색 결과에서 사라짐

피해 규모: 트래픽 -90%, 회복 1~2주

올바른 조치: 구URL → 신URL로 301


💥 실수 2: Canonical 써야 하는데 301 사용

상황:

파라미터 URL 정리
/products?color=red → /products로 301

결과:

1. 사용자가 "빨간색 필터" 클릭
2. URL: /products?color=red
3. 301로 /products로 이동
4. 필터가 사라짐 → 모든 색상 표시
5. 사용자: "버그인가?" → 이탈

피해: 사용자 경험 파괴, 전환율 하락

올바른 조치: Canonical 사용 (파라미터 URL 유지)


💥 실수 3: 301 체인 (다단계 리다이렉트)

상황:

A → 301 → B
나중에 B → 301 → C
결과: A → B → C (2단계 체인)

문제:

- 사용자 경험: 로딩 느림 (2번 요청)
- SEO: 링크 주스 손실 (단계마다 5~10% 손실)
- 구글: "이거 귀찮은데?" → 크롤 빈도 하락

해결: A → C 직접 301

코드 예시 (정리 전/후):

# Before (체인)
Redirect 301 /old-page /medium-page
Redirect 301 /medium-page /new-page

# After (직접)
Redirect 301 /old-page /new-page
Redirect 301 /medium-page /new-page

Part 4: 혼용 전략 - 사이트 마이그레이션 단계별 가이드

🚀 시나리오: 대규모 사이트 리뉴얼

상황:

  • 10,000개 페이지
  • URL 구조 완전 변경
  • 목표: 트래픽 손실 0%

📅 6주 마이그레이션 플랜

Week 1-2: 준비 및 매핑

1. URL 매핑 테이블 생성

old_url,new_url,redirect_type
/products/item-1,/shop/items/item-1,301
/blog/post-1,/articles/post-1,301
/category/shoes,/shop/shoes,301

2. 우선순위 설정

Tier 1 (즉시): 트래픽 상위 20% 페이지
Tier 2 (1주 후): 중간 70%
Tier 3 (2주 후): 나머지 10%

3. 테스트 환경 구축

staging.site.com에서 전체 테스트
- 301 작동 확인
- Canonical 검증
- 사용자 플로우 테스트

Week 3: Soft Launch (일부 페이지)

Tier 1 페이지만 먼저 마이그레이션:

1. 301 리다이렉트 설정
   old.com/top-product → new.com/top-product

2. 신 페이지에 self-referencing canonical
   <link rel="canonical" href="new.com/top-product" />

3. 구 페이지 canonical도 신페이지로 (이중 안전망)
   <link rel="canonical" href="new.com/top-product" />

모니터링 (실시간):

- Google Analytics: 트래픽 변화
- Search Console: 인덱싱 상태
- 순위 추적 도구: 키워드 순위

Week 4: 전체 마이그레이션

전체 10,000 페이지 301 적용:

서버 설정 (Nginx 예시):
```nginx
map $request_uri $new_uri {
    include /etc/nginx/redirects.map;
}

server {
    if ($new_uri) {
        return 301 $new_uri;
    }
}

redirects.map 파일:

/products/item-1 /shop/items/item-1;
/products/item-2 /shop/items/item-2;
# ... 10,000줄

Week 5: 검증 및 최적화

1. 404 오류 체크

Search Console → 색인 생성 → 페이지
→ "찾을 수 없음(404)" 필터

발견된 404:
- 매핑 누락 페이지 → 즉시 301 추가
- 삭제된 페이지 → 유사 페이지로 301

2. Canonical 정리

구 사이트 canonical (더 이상 불필요):
- 제거 또는 유지 (해도 무방)

신 사이트 canonical:
- 모든 페이지 self-referencing 확인

3. 리다이렉트 체인 제거

Screaming Frog:
Response Codes → Redirection (3xx) 탭
→ Redirect Chains 필터
→ 직접 경로로 수정

Week 6: 모니터링 및 최적화

지표 추적:

목표:
- 오가닉 트래픽: 마이그레이션 전 대비 95% 이상 유지
- 평균 순위: 변동 ±2위 이내
- 인덱싱: 신URL 90% 이상

실제 데이터 (성공 케이스):
- Week 1: 트래픽 -15% (일시적)
- Week 2: 트래픽 -5%
- Week 3: 트래픽 회복 100%
- Week 4: 트래픽 +8% (새 구조의 SEO 이점)

🔧 도구 활용

1. 301 자동 생성 도구

import pandas as pd

# URL 매핑 CSV 읽기
df = pd.read_csv('url_mapping.csv')

# Nginx redirects.map 생성
with open('redirects.map', 'w') as f:
    for _, row in df.iterrows():
        f.write(f"{row['old_url']} {row['new_url']};\n")

print("redirects.map 생성 완료!")

2. 리다이렉트 테스트 스크립트

import requests

def test_redirect(old_url, expected_new_url):
    response = requests.get(old_url, allow_redirects=False)
    
    if response.status_code == 301:
        actual_new_url = response.headers.get('Location')
        if actual_new_url == expected_new_url:
            return "✅ PASS"
        else:
            return f"❌ FAIL: {actual_new_url}"
    else:
        return f"❌ FAIL: Status {response.status_code}"

# 테스트
df = pd.read_csv('url_mapping.csv')
results = []

for _, row in df.iterrows():
    result = test_redirect(row['old_url'], row['new_url'])
    results.append(result)
    print(f"{row['old_url']}: {result}")

Part 5: HTTP 헤더 Canonical (고급 기법)

📄 HTML 태그 불가능한 리소스

대상:

  • PDF 문서
  • 이미지 파일
  • XML/JSON API 응답

문제: <link rel="canonical"> 태그를 넣을 수 없음


🔧 HTTP 헤더로 Canonical 지정

방법:

HTTP/1.1 200 OK
Content-Type: application/pdf
Link: <https://site.com/documents/guide>; rel="canonical"

💻 서버별 설정

Apache (.htaccess)

<FilesMatch "\.pdf$">
    Header set Link '<https://site.com/documents>; rel="canonical"'
</FilesMatch>

Nginx

location ~* \.pdf$ {
    add_header Link '<https://site.com/documents>; rel="canonical"';
}

PHP (동적 생성)

<?php
header('Link: <https://site.com/page>; rel="canonical"');

// PDF 출력
readfile('document.pdf');
?>

📊 활용 케이스

케이스 1: 여러 버전 PDF

영문 PDF: /docs/guide-en.pdf
한글 PDF: /docs/guide-ko.pdf

둘 다 HTML 페이지를 canonical로:
Link: <https://site.com/docs/guide>; rel="canonical"

케이스 2: 이미지 중복

원본: /images/product.jpg
썸네일: /images/product-thumb.jpg
리사이즈: /images/product-800x600.jpg

모두 원본을 canonical로:
Link: <https://site.com/images/product.jpg>; rel="canonical"

Part 6: 특수 상황 결정 트리

🌳 의사결정 플로우차트

질문 1: 페이지가 완전히 이동했나요? (URL 변경)
   YES → 301 Redirect
   NO → 질문 2

질문 2: 사용자가 현재 URL로 접근할 필요가 있나요?
   YES → Canonical
   NO → 질문 3

질문 3: 콘텐츠가 정말 중복인가요?
   YES → Canonical
   NO → 질문 4

질문 4: 두 페이지를 별도로 인덱싱하고 싶나요?
   YES → 아무것도 안 함 (독립 페이지)
   NO → Canonical

📋 상황별 빠른 참조표

상황 301 Canonical 둘 다 없음
URL 영구 변경
도메인 변경
HTTPS 마이그레이션
파라미터 URL
프린트 버전
AMP 페이지
중복 카테고리 경로
A/B 테스트
모바일 별도 URL
사이트 마이그레이션
계절 상품 (단종)
완전히 다른 콘텐츠

Part 7: 실전 케이스 스터디

📈 Case 1: 이커머스 도메인 변경 (트래픽 손실 0%)

회사: 패션 쇼핑몰
규모: 3,000개 상품, 월 방문자 50만

상황:

old-shop.com → new-brand.com
이유: 브랜드 리뉴얼

전략:

Phase 1 (Week 1-2): 준비

1. 전체 URL 매핑
   old-shop.com/products/1 → new-brand.com/products/1
   (1:1 완벽 매칭)

2. 신 도메인 준비
   - 콘텐츠 동일하게 복사
   - 모든 페이지에 self-referencing canonical
   - 내부 링크 모두 신 도메인으로

3. DNS 준비
   - 구 도메인 유지 (6개월)
   - 신 도메인 활성화

Phase 2 (Week 3): 301 설정

# 구 도메인 (.htaccess)
RewriteEngine On
RewriteCond %{HTTP_HOST} ^old-shop\.com$ [NC]
RewriteRule ^(.*)$ https://new-brand.com/$1 [R=301,L]

Phase 3 (Week 3-4): 모니터링

일일 체크:
- Google Analytics: 트래픽 추이
- Search Console: 
  - 구 도메인 인덱스 감소 확인
  - 신 도메인 인덱스 증가 확인
- 주요 키워드 순위 (50개)

결과:

Week 1: 트래픽 -12% (일시적)
Week 2: 트래픽 -3%
Week 3: 트래픽 100% 회복
Week 4: 트래픽 +5% (신 도메인 브랜드 효과)

6개월 후:
- 구 도메인 인덱스: 0개
- 신 도메인 인덱스: 3,000개
- 트래픽: +18% (브랜드 인지도 상승)

📈 Case 2: 블로그 URL 구조 변경 (Canonical 활용)

회사: IT 전문 미디어
규모: 1,500개 글, 월 방문자 30만

상황:

기존: /blog/2025/01/15/post-title
신규: /articles/post-title (날짜 제거)

이유: 
- URL 간결화
- Evergreen 콘텐츠 강조

문제:

기존 URL을 301하면:
- 소셜 미디어 공유 링크 깨짐
- 이메일 뉴스레터 링크 깨짐

해결책: 301 + Canonical 혼용

Step 1: 신규 URL 생성

/articles/post-title 페이지 생성
<link rel="canonical" href="https://site.com/articles/post-title" />

Step 2: 구URL은 유지하되 Canonical 추가

/blog/2025/01/15/post-title 그대로 유지
<link rel="canonical" href="https://site.com/articles/post-title" />

Step 3: 내부 링크 점진적 변경

신규 글: 신URL 사용
기존 글: 3개월에 걸쳐 신URL로 변경

결과:

- 기존 링크 모두 작동 (사용자 경험 유지)
- SEO 신호는 신URL로 통합
- 트래픽 손실: 0%
- 순위 변동: ±1위 이내

📈 Case 3: 파라미터 URL 정리 (Canonical만 사용)

회사: 여행 예약 사이트
규모: 500개 도시, 필터 조합 50,000개 URL

상황:

/hotels?city=seoul
/hotels?city=seoul&price=low
/hotels?city=seoul&price=low&rating=5
/hotels?city=seoul&rating=5
... 수만 개 조합

문제:

- 크롤 예산 폭발
- 중복 콘텐츠 대량 발생
- 순위 분산

해결: Canonical만 사용 (301 쓰면 안 됨!)

구현:

// React Component
function HotelSearch({ city, filters }) {
  const canonicalUrl = `https://site.com/hotels?city=${city}`;
  
  return (
    <Helmet>
      <link rel="canonical" href={canonicalUrl} />
    </Helmet>
  );
}

효과:

Before:
- 인덱싱: 50,000개 URL
- 크롤 예산: 하루 5,000 URL (부족)
- 신규 도시 인덱싱: 평균 2주

After:
- 인덱싱: 500개 URL (도시별)
- 크롤 예산: 하루 500 URL (충분)
- 신규 도시 인덱싱: 평균 1일
- 순위: 평균 3.2위 상승

Part 8: 고급 혼용 테크닉

🎯 테크닉 1: 301 + Canonical 이중 안전망

상황: 중요한 마이그레이션 (리스크 최소화)

방법:

1. 구 페이지: 301 리다이렉트
   (서버 설정)

2. 혹시 301 못 본 봇 대비, 구 페이지 HTML에도:
   <link rel="canonical" href="new-url" />

3. 신 페이지: self-referencing canonical
   <link rel="canonical" href="new-url" />

장점:

  • 301 작동 안 하면 Canonical이 백업
  • 과도기적 중복 방지
  • 안전성 극대화

🎯 테크닉 2: 단계적 301 (Soft Migration)

상황: 대규모 사이트, 리스크 분산

방법:

Week 1: 상위 10% 페이지만 301
        나머지 90%는 Canonical

Week 2: 문제 없으면 상위 50%로 확대
        나머지 50%는 Canonical

Week 3: 전체 100% 301

장점:

  • 문제 조기 발견
  • 빠른 롤백 가능
  • 트래픽 손실 최소화

🎯 테크닉 3: Canonical First, 301 Later

상황: 봇 혼란 최소화

방법:

Day 1: 신URL 생성 + self-referencing canonical
       구URL에 신URL canonical 추가
       (301 없음, 둘 다 접근 가능)

Day 7: 구글이 신URL 인덱싱 시작 확인

Day 14: 구URL → 신URL 301 적용

장점:

  • 구글이 먼저 신URL 학습
  • 301 적용 시 이미 인덱싱되어 있음
  • 전환 충격 최소화

Part 9: 디버깅 및 문제 해결

🐛 문제 1: "301했는데 순위 하락"

진단:

1. 301 체인 확인
   A → B → C (2단계 이상?)
   
2. 신URL canonical 확인
   self-referencing인가?
   
3. 신URL 콘텐츠 확인
   구URL과 동일한가?

4. 내부 링크 확인
   여전히 구URL 가리키나?

해결:

- 체인 제거: A → C 직접
- Canonical 수정
- 콘텐츠 복원
- 내부 링크 업데이트

🐛 문제 2: "Canonical 설정했는데 구글이 무시"

원인 체크:

□ Canonical이 404 가리킴
□ Canonical이 리다이렉트 가리킴
□ Noindex + Canonical 동시 사용
□ 여러 Canonical 태그
□ 상대 경로 사용

확인 방법:

Search Console → URL 검사
→ "사용자가 지정한 표준 페이지" vs "Google이 선택한 표준 페이지"

불일치? → 위 체크리스트 확인

🐛 문제 3: "301 후 트래픽 회복 안 됨"

타임라인 체크:

301 후 경과 시간:
- 1주: 정상 (아직 재크롤 중)
- 2주: 50% 회복 목표
- 4주: 90% 회복 목표
- 8주: 완전 회복

8주 후에도 안 되면 문제 있음

조치:

1. Search Console "색인 생성 요청" (주요 페이지)
2. Sitemap 재제출
3. 신URL 프로모션 (백링크 구축)

Part 10: 빠른 참조 - 결정 가이드

5초 결정법

질문: "URL이 바뀌었나요?"

YES → 301
NO → Canonical

10초 결정법

질문 1: "사용자를 자동으로 이동시켜야 하나요?"
   YES → 301

질문 2: "사용자가 현재 URL로 계속 접근할 필요가 있나요?"
   YES → Canonical
   NO → 301

30초 결정법

1. 페이지 목적 확인
   - 영구 이동: 301
   - 중복 통합: Canonical

2. 사용자 경험 확인
   - URL 변경 필요: 301
   - URL 유지 필요: Canonical

3. SEO 목표 확인
   - 구URL 제거: 301
   - 구URL 유지 (검색 제외만): Canonical

오늘 당장 할 일 (체크리스트)

📋 당신의 사이트 점검 (20분)

□ 현재 301 사용 중인 페이지 목록
  → Screaming Frog: Response Codes → 3xx

□ 현재 Canonical 사용 중인 페이지 목록
  → Screaming Frog: Internal → Canonical

□ 각각이 올바르게 사용되고 있는가?
  → 위의 결정 가이드로 재검토

□ 301 체인 존재 여부
  → Screaming Frog: Redirect Chains

□ Canonical + 301 충돌 확인
  → 같은 페이지에 둘 다 있으면 안 됨

다음 편 예고

[7부] 실전 케이스 스터디: Canonical 하나로 트래픽 2배 만든 방법

"이론은 끝났습니다. 이제 실전입니다.
실제 사이트들이 어떻게 트래픽을 2배로 만들었는지 전격 공개합니다."

  • 케이스 1: 이커머스 - 상품 필터 URL 정리로 크롤 예산 60% 절약
  • 케이스 2: 블로그 미디어 - 페이지네이션 최적화로 노출 47% 증가
  • 케이스 3: 글로벌 브랜드 - 잘못된 국가 타겟팅 해결
  • 케이스 4: SaaS - React SPA에서 SSR 마이그레이션
  • 케이스 5: 뉴스 - AMP Canonical 최적화
  • 당신의 사이트 유형별 즉시 적용 가이드

📅 3일 후 공개 예정 (시리즈 완결편!)


핵심 요약: 3줄 정리

  1. 301 = URL 영구 변경 (사용자 자동 이동), Canonical = 중복 통합 (URL 유지)
  2. 잘못 선택하면 트래픽 -90% 사고, 올바르게 사용하면 손실 0%
  3. 마이그레이션은 301 + Canonical 혼용 전략으로 리스크 최소화

301 vs Canonical, 이제 헷갈리지 않습니다.


📌 이 글이 도움이 되셨다면:

  • 💬 댓글: "301과 Canonical 차이 드디어 이해했어요!"
  • 🔖 북마크: 마이그레이션 시 필수 참고 문서
  • 📧 알림 구독: 완결편 7부 놓치지 마세요

7부에서 만나요! 실전 케이스 대공개, 당신의 성공 스토리를 만듭니다.


작성: 2026년 1월 | 시리즈 6/7
참고: Google Search Central, Apache/Nginx Documentation, Web.dev Migration Guide


Tags:

댓글 쓰기

0댓글

댓글 쓰기 (0)