용어집
SEO

301 리다이렉트

301 리다이렉트는 페이지가 새 URL로 영구히 이동했음을 브라우저와 검색엔진에 알리는 HTTP 상태 코드입니다. 구글은 이를 새 URL을 표준(canonical)으로 삼으라는 신호로 해석하여 검색 결과의 기존 주소를 교체하고, 기존 URL이 쌓아 온 링크 가치(랭킹)를 이동 대상으로 넘깁니다.

  • 영구 이동에는 301 또는 308을, 임시 이동에는 302 또는 307을 사용합니다.
  • 301은 새 URL을 표준으로 만들고, 기존 URL이 얻은 링크 가치(랭킹)를 이동 대상으로 전달합니다.
  • 임시 리다이렉트(302, 307)는 SEO 가치를 넘기지 않으므로 영구 이동에는 절대 사용하면 안 됩니다.
  • 요청 메서드와 POST 본문을 보존해야 한다면 301 대신 308을, 302 대신 307을 사용합니다.
  • 구글이 가장 안정적으로 해석하므로 자바스크립트나 meta refresh보다 서버 측 리다이렉트를 우선합니다.

301 리다이렉트란

301 리다이렉트(301 Moved Permanently)는 요청한 URL이 새 위치로 영구히 이동했음을 알리는 HTTP 상태 코드입니다. 브라우저는 응답의 Location 헤더에 담긴 새 주소를 자동으로 따라가고, 검색엔진은 기존 URL이 쌓아 온 링크 가치를 이동 대상으로 넘깁니다. MDN의 설명에 따르면, 검색엔진이 301 응답을 받으면 원래 URL을 가리키던 링크들을 리다이렉트된 리소스에 귀속시켜 SEO 랭킹을 새 URL로 이전합니다.

구글 검색 문서는 영구 리다이렉트와 임시 리다이렉트를 구분하며, 이 구분은 SEO에서 가장 중요합니다. 색인 파이프라인은 영구 리다이렉트(301, 308)를 리다이렉트 대상을 표준으로 삼으라는 신호로 처리하므로 새 이동 대상이 검색 결과에 나타납니다. 반면 임시 리다이렉트(302, 303, 307)는 표준화 신호로 사용되지 않으므로 출발 페이지(기존 URL)가 결과에 남습니다.

301을 사용해야 할 때

  • 사이트를 새 도메인으로 옮길 때(예: http://old.comhttps://new.com).
  • 홈페이지가 여러 URL(example.com/home, home.example.com, www.example.com)로 접근 가능하여 하나의 선호(표준) 주소로 통합하고 싶을 때.
  • 두 사이트를 병합하면서 기존 URL을 가리키는 링크가 올바른 페이지에 도달하도록 해야 할 때.
  • 페이지를 삭제하고 사용자를 대체 페이지로 보내되, 다시 되돌릴 계획이 없을 때.

301 vs 302 vs 307 vs 308

네 코드 모두 브라우저가 Location 헤더를 자동으로 따라가게 하지만, 이동이 영구인지 임시인지요청 메서드(GET/POST)가 보존되는지에서 차이가 납니다. 메서드 보존은 폼 제출(POST)이나 API 호출처럼 본문을 함께 보내는 요청에서 결정적입니다.

코드의미영구 / 임시구글 SEO 처리요청 메서드 보존
301 Moved Permanently영구 이동영구새 URL이 표준이 됨, 링크 가치 이전보장 안 됨 — POST가 GET으로 바뀔 수 있음
302 Found임시 이동임시기존 URL 유지, SEO 가치 이전 없음보장 안 됨 — POST가 GET으로 바뀔 수 있음
307 Temporary Redirect임시 이동임시기존 URL 유지, SEO 가치 이전 없음보존됨 — 메서드와 본문을 그대로 재사용
308 Permanent Redirect영구 이동영구새 URL이 표준이 됨, 링크 가치 이전보존됨 — 메서드와 본문이 바뀌면 안 됨

핵심 대비는 다음과 같습니다. 301 vs 308: 둘 다 영구이며 SEO 효과는 같지만, 명세상 301은 메서드를 유지해야 함에도 오래된 클라이언트가 POST를 GET으로 바꾸는 사례가 알려져 있습니다. 메서드를 반드시 보존해야 한다면 308을 사용합니다(MDN). 302 vs 307: 둘 다 임시이고 SEO 가치를 넘기지 않지만, 307은 클라이언트가 메서드나 본문을 바꾸지 않음을 보장한다는 점에서 302와 다릅니다. 어떤 메서드든 GET으로 바꾸고 싶다면 303 See Other를 사용합니다.

요약하면, 일반적인 영구 페이지 이동, 도메인 이전, URL 통합에는 301을, POST 본문까지 보존해야 하는 영구 이동에는 308을 사용하는 것이 표준 관행입니다.

구현 예시

구글은 검색 결과에 표시되는 URL을 변경해야 할 때마다 서버 측 영구 리다이렉트를 사용하라고 권장합니다. 서버 측 리다이렉트는 구글이 이를 올바르게 해석할 가능성을 가장 높여 주기 때문입니다(자바스크립트 리다이렉트는 렌더링이 실패하면 누락될 수 있습니다).

Apache (.htaccess)

단순한 경로 매핑에는 mod_alias로 충분합니다.

# 영구 리다이렉트 (301)
Redirect permanent "/old" "https://example.com/new"

# 임시 리다이렉트 (302)
Redirect temp "/two-old" "https://example.com/two-new"

패턴 매칭처럼 더 복잡한 규칙에는 mod_rewrite를 사용합니다.

RewriteEngine on

# 영구 (301): /service 를 /about/service 로 이동
RewriteRule   "^/service$"  "/about/service"  [R=301]

# 임시 (302, R의 기본값): /service 를 /about/service 로 이동
RewriteRule   "^/service$"  "/about/service"  [R]

Nginx

location = /service {
    # 영구 리다이렉트 (301)
    return 301 $scheme://example.com/about/service;

    # 임시 리다이렉트 (302)
    # return 302 $scheme://example.com/about/service;
}

# 정규식 기반 리다이렉트 (permanent=301, redirect=302)
location ~ ^/service/offline/([a-z]+)/?$ {
    rewrite ^/service/offline/([a-z]+)/?$ /service?name=$1 permanent;
}

PHP (서버 스크립트)

헤더는 화면에 어떤 출력도 보내기 전에 설정해야 합니다.

<?php
header('HTTP/1.1 301 Moved Permanently');
header('Location: https://www.example.com/newurl');
exit();

SEO에서 중요한 이유

  • 링크 가치(랭킹) 이전: 301과 308은 기존 URL이 쌓은 백링크 가치를 새 URL로 넘깁니다. 302와 307은 그러지 않으므로, 영구 이동에 302를 쓰면 새 URL은 그 가치를 받지 못한 채 기존 URL이 계속 결과에 노출됩니다. 명백한 손실입니다.
  • 표준 신호: 구글은 301을 URL을 표준으로 삼으라는 강력한 신호로 읽습니다. rel="canonical"이 "권고" 신호라면, 301은 실제로 통합을 수행하는 "강제" 메커니즘입니다.
  • 남아 있는 대체 이름: 구글은 리다이렉트의 출발지와 도착지를 모두 추적합니다. 도메인 이동 후에도 사용자가 여전히 기존 URL을 더 신뢰하는 검색어에서는 기존 URL이 한동안 계속 나타날 수 있습니다. 이는 정상이며 시간이 지나면 사라집니다.
  • 리다이렉트 체인 주의: 거치는 단계가 쌓이면(A→B→C) 크롤링 효율과 신호 이전이 약해집니다. 가능하면 A→C로 한 번에 보냅니다.
  • 410/404와 구분: 영구 이동에는 301을, 대체 없이 영구히 삭제한 콘텐츠에는 410 Gone을, 일시적 부재에는 404를 사용합니다. 삭제한 페이지를 무관한 페이지로 301 리다이렉트하면 소프트 404로 처리될 수 있습니다.

구현 체크리스트

  • 먼저 이동이 영구인지 임시인지 결정합니다. 되돌릴 계획이 없다면 301(또는 308)을 사용합니다.
  • 가능하면 자바스크립트나 meta refresh가 아닌 서버 측 리다이렉트를 사용합니다.
  • POST 본문이나 API 호출을 보존해야 한다면 301 대신 308을, 302 대신 307을 사용합니다.
  • 도메인 또는 사이트 이전 시 모든 기존 URL을 대응하는 새 URL과 1:1로 매핑합니다(전부 홈페이지로 보내지 않습니다).
  • 리다이렉트 체인을 한 단계로 축소합니다.
  • 이동 후 서치 콘솔의 URL 검사로 구글이 보는 상태를 확인한 다음, 사이트맵을 갱신하고 재제출합니다.

참고·출처