HTTP 리다이렉트 완전 가이드

목차

HTTP 리다이렉트란

HTTP 리다이렉트(URL 리다이렉션)는 사용자를 한 URL에서 다른 URL로 자동 전송하는 메커니즘입니다. 페이지를 요청하면 서버가 3xx 상태 코드와 새 주소를 가리키는 Location 헤더로 응답하고, 브라우저가 해당 주소로 자동 이동합니다.

리다이렉트는 다양한 상황에서 사용됩니다:

리다이렉트 작동 원리

클라이언트 요청:
GET /old-page HTTP/1.1
Host: example.com

서버 응답:
HTTP/1.1 301 Moved Permanently
Location: https://example.com/new-page

리다이렉트 유형

301 Moved Permanently

301은 가장 일반적인 리다이렉트 유형입니다. 리소스가 새 URL로 영구적으로 이동했음을 클라이언트와 검색 엔진에 알립니다.

✅ 301을 사용해야 하는 경우

  • 영구적인 도메인 이전
  • 영구적인 URL 구조 변경
  • HTTP → HTTPS 업그레이드
  • 중복 콘텐츠 통합

SEO: 검색 엔진은 링크 가치(PageRank)를 새 URL로 이전하고 인덱스를 업데이트합니다. Google은 보통 몇 주 내에 이를 완료합니다.

브라우저 동작: 브라우저는 301 리다이렉트를 캐시하여 이후 방문 시 원래 URL을 건너뛸 수 있습니다.

302 Found (임시)

302임시 이동을 나타냅니다. 원래 URL은 유효한 상태로 인덱스에 유지됩니다.

✅ 302를 사용해야 하는 경우

  • 유지보수 페이지
  • A/B 테스트
  • 지역 기반 임시 라우팅
  • 단기 모바일/데스크톱 분기

303 See Other

303은 원래 요청 메서드와 관계없이 GET으로 리다이렉트 대상을 가져오도록 클라이언트에 강제합니다. 주로 POST 제출 후 폼 재전송을 방지하는 데 사용됩니다 (Post/Redirect/Get 패턴).

307 Temporary Redirect

307은 302와 유사하지만 원래 요청 메서드를 엄격하게 유지합니다. POST는 리다이렉트 후에도 POST로 유지됩니다 — 역사적으로 메서드 변경을 허용했던 302와 다릅니다.

308 Permanent Redirect

308은 301의 메서드 유지 버전입니다. GET 요청의 경우 301과 308의 동작은 동일합니다. 요청 메서드를 변경해서는 안 되는 영구 리다이렉트가 필요할 때 308을 사용합니다.

클라이언트 측 리다이렉트

Meta refresh

<meta http-equiv="refresh" content="0; url=https://example.com/new-page">

SEO에 불리 — 검색 엔진이 올바르게 처리하지 못할 수 있습니다.

JavaScript 리다이렉트

window.location.href = "https://example.com/new-page";

크롤러가 JavaScript를 실행하지 않을 수 있어 SEO에 이상적이지 않습니다.

⚠️ 클라이언트 측 리다이렉트의 한계

클라이언트 측 리다이렉트는 HTTP 상태 코드를 갖지 않으므로, 검색 엔진은 이동이 영구적인지 임시적인지 판단할 수 없습니다. 항상 서버 측 리다이렉트를 우선하세요.

사용 시기 가이드

SEO 영향

링크 가치 이전

301 리다이렉트는 링크 가치의 거의 전부를 새 URL로 이전합니다. Google은 301이 PageRank의 약 100%를 이전한다고 밝혔습니다. 302는 가치를 이전하지 않으며, 원래 URL이 랭킹 시그널을 유지합니다.

인덱스 업데이트 타임라인

301 설정 후 Google은 보통:

리다이렉트 체인의 영향

체인의 홉이 추가될 때마다 (A → B → C) 지연 시간이 증가하고 가치가 희석될 수 있습니다. Google은 약 10홉까지 따라가지만, 3을 초과하는 체인은 문제의 신호입니다. 항상 원래 URL에서 최종 목적지로 직접 리다이렉트하세요.

🎯 모범 사례

직접 리다이렉트 (A → C)를 사용하세요. 체인을 정기적으로 감사하고 가능한 한 단축하세요.

일반적인 문제와 해결 방법

1. 리다이렉트 루프

증상: 브라우저에 "리다이렉트가 너무 많습니다"라고 표시됨.

일반적인 원인: CDN/원본 서버 간 HTTPS 설정 충돌, WordPress siteurl 설정 오류, Nginx/Apache 리라이트 규칙 중복, .htaccess 설정 오류.

# curl로 진단
curl -I -L https://example.com

또는 301check.com으로 전체 체인을 시각화할 수 있습니다.

2. 쿼리 문자열 손실

리다이렉트 규칙에서 쿼리 파라미터가 유지되도록 하세요. Nginx에서는 $request_uri 또는 $is_args$args를 사용합니다.

3. 캐시된 301

브라우저는 301 리다이렉트를 캐시합니다. 리다이렉트를 변경해도 사용자에게는 이전 목적지가 표시될 수 있습니다. 시크릿 창에서 테스트하거나 캐시를 지우세요.

4. 모바일 리다이렉트 불일치

모바일 사용자가 해당 모바일 페이지가 아닌 홈페이지로 리다이렉트되는 경우, URL 매핑을 수정하거나 반응형 디자인으로 전환하세요.

모범 사례