웹사이트의 URL 구조를 리뉴얼하거나 특정 페이지를 새 주소로 옮길 때 리다이렉트(Redirect)를 설정해본 경험이 있으실 겁니다.
다만 대부분의 개발자들은 301과 302 상태 코드의 명확한 차이점과 이것이 검색엔진 크롤러에 미치는 치명적인 영향을 모른 채 단순 이동용으로 302나 자바스크립트 이동을 남발하곤 합니다.
이번 글에서는 301과 302 리다이렉트의 정확한 원리, 왜 SEO(검색엔진 최적화) 관점에서 구분해서 써야 하는지, 그리고 서버 환경별(PHP, Nginx, Apache) 올바른 설정 방법까지 완벽하게 정리해서 소개하겠다.
HTTP 상태 코드에서 300번대는 페이지 이동(Redirection)을 나타냅니다. 그중 가장 흔하게 쓰이는 것이 301과 302입니다.
두 코드 모두 브라우저를 이용하는 사람에게는 지정된 새 URL로 똑같이 이동되는 것처럼 보이지만, 검색엔진 수집 로봇(Googlebot, Yeti 등)에게는 완전히 다른 의미로 전달됩니다.
301 Moved Permanently는 '영구 이동'을 의미합니다. 기존 URL이 완전히 폐기되었으며 앞으로 모든 요청을 새 URL로 처리하라는 신호입니다.
반면 302 Found(기존 Moved Temporarily)는 '일시적 이동'입니다. 지금은 잠깐 새 URL을 보여주지만, 기존 URL이 조만간 다시 활성화될 예정이라는 의미를 가집니다.
검색엔진은 기존 페이지가 쌓아온 백링크, 랭킹 점수(Link Equity 또는 Link Juice)를 새 페이지로 이전해야 할지 말지를 상태 코드로 판단합니다.
301 리다이렉트를 사용하면 검색엔진은 이전 URL의 색인을 지우고 새 URL로 색인을 즉시 전환하며, 기존의 SEO 점수를 새 URL로 넘겨줍니다.
반면 302 리다이렉트를 쓰면 검색엔진은 이전 URL의 색인을 그대로 유지하고, SEO 점수도 이관하지 않습니다.
| 구분 | 301 Moved Permanently | 302 Found (Temporary) |
|---|---|---|
| 이동 성격 | 영구적 이동 (Permanent) | 일시적 이동 (Temporary) |
| SEO 점수 이관 | 기존 URL의 랭킹/백링크 점수 90~99% 이관 | SEO 점수 이관되지 않음 |
| 검색 색인 전환 | 새 URL로 검색 결과 인덱스 자동 교체 | 기존 URL 색인 유지, 새 URL은 미색인 가능성 높음 |
| 브라우저 캐싱 | 브라우저에 강하게 캐싱됨 (서버 요청 없이 바로 이동) | 캐싱되지 않음 (매번 서버에 확인 후 이동) |
| 주요 사용 상황 | 도메인 변경, HTTP->HTTPS 전환, URL 구조 개편 | 이벤트 페이지 임시 이동, A/B 테스트, 점검 페이지 |
실무 환경에 따라 PHP 코드, Nginx 설정, Apache .htaccess 설정으로 301 리다이렉트를 올바르게 구현하는 방법을 살펴보겠습니다.
PHP에서 단순 header("Location: ..."); 구문만 사용하면 기본적으로 HTTP 302 상태 코드가 전송됩니다. 301로 명시해야 합니다.
✗ 잘못된 코드 (302 임시 이동으로 기본 전송됨)
<?php
// 상태 코드를 지정하지 않으면 기본값으로 302 Found가 전송되어 SEO 점수가 유실됨
header("Location: https://example.com/new-page");
exit;
?>✓ 올바른 코드 (301 영구 이동 상태 코드 명시)
<?php
// HTTP응답 코드를 301로 지정하여 영구 이동임을 검색엔진에 알림
header("Location: https://example.com/new-page", true, 301);
exit;
?>출력/동작 결과:
클라이언트 응답 헤더에 HTTP/1.1 301 Moved Permanently 가 출력되며, Googlebot이 신규 URL로 검색 색인 및 랭킹 점수를 안전하게 이관합니다.
웹 서버 설정에서도 redirect 키워드는 302, permanent 키워드는 301을 생성합니다.
✗ 잘못된 코드 (302 임시 리다이렉트 발생)
# redirect 구문 사용 시 302로 응답함
rewrite ^/old-path/(.*)$ /new-path/$1 redirect;✓ 올바른 코드 (301 영구 리다이렉트 발생)
# permanent 구문 사용 시 301로 응답함
rewrite ^/old-path/(.*)$ /new-path/$1 permanent;
# 또는 return 문을 통한 명시적 301 처리 (권장)
location /old-path/ {
return 301 https://example.com/new-path/;
}출력/동작 결과:
Nginx 서버 단에서 요청을 받자마자 301 헤더를 리턴하므로 PHP 프로세스를 타지 않고 빠르고 효율적으로 SEO 최적화 리다이렉트가 이뤄집니다.
리다이렉트 처리 시 개발 현장에서 자주 발생하는 실수를 점검해보겠습니다.
✗ 잘못된 것: 자바스크립트(window.location.href)를 이용한 단순 페이지 이동
자바스크립트 기반 이동은 검색엔진 크롤러가 해석하지 못하거나 302보다 더 늦게 색인에 반영되어 기존 페이지가 검색 결과에서 완전히 사라질 위험이 있습니다.
✓ 올바른 것: 서버 응답 헤더(HTTP Response Header) 수준에서 301 상태 코드를 즉시 반환하도록 설정해야 합니다.
✗ 잘못된 것: 리다이렉트 체인(Redirect Chain) 형성
A URL -> B URL (301) -> C URL (301) 형태로 연속 리다이렉트가 발생하면 검색엔진 크롤링 예산(Crawl Budget)이 낭비되고 랭킹 점수 손실이 생깁니다.
✓ 올바른 것: A URL -> C URL (301) 과 같이 최종 목적지 주소로 한 번에 바로 이동하도록 리다이렉트 규칙을 주기적으로 정리해야 합니다.
301 리다이렉트와 302 리다이렉트의 차이를 정확히 이해하고 상황에 맞춰 올바르게 사용하는 것은 웹사이트의 검색 노출 유지에 있어 기본이자 필수적인 요소입니다. 영구적인 URL 개편에는 반드시 301을, 일시적인 이벤트 페이지 전환에는 302를 적용하여 소중한 검색 색인과 SEO 점수를 지키기 바랍니다.
301 vs 302 리다이렉트 최적화는 검색 노출 유지를 위한 필수 작업이다. 이러한 작은 최적화와 올바른 설정 습관이 모여서 검색엔진의 신뢰도를 높이고 유기적 트래픽을 지키는 큰 효과를 만든다는 점을 잊지 말자. 이 글의 서버별 301 설정 예제를 참고해 기존 리다이렉트 규칙을 점검하고 수정하면, SEO 점수 유실 없는 완벽한 URL 이전을 완료할 수 있을 것이다.