[시리즈 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줄 정리
- 301 = URL 영구 변경 (사용자 자동 이동), Canonical = 중복 통합 (URL 유지)
- 잘못 선택하면 트래픽 -90% 사고, 올바르게 사용하면 손실 0%
- 마이그레이션은 301 + Canonical 혼용 전략으로 리스크 최소화
301 vs Canonical, 이제 헷갈리지 않습니다.
📌 이 글이 도움이 되셨다면:
- 💬 댓글: "301과 Canonical 차이 드디어 이해했어요!"
- 🔖 북마크: 마이그레이션 시 필수 참고 문서
- 📧 알림 구독: 완결편 7부 놓치지 마세요
7부에서 만나요! 실전 케이스 대공개, 당신의 성공 스토리를 만듭니다.
작성: 2026년 1월 | 시리즈 6/7
참고: Google Search Central, Apache/Nginx Documentation, Web.dev Migration Guide

댓글 쓰기
0댓글