리다이렉트
리다이렉트는 특정 URL로 들어온 요청을 자동으로 다른 URL로 전달하는 기술입니다. 서버 응답 코드(301·302·307·308), HTML 메타 태그, 자바스크립트로 구현하며, 영구 이전과 임시 이전을 구분해 검색엔진과 브라우저에 신호를 보냅니다.
- 리다이렉트는 한 URL로 들어온 요청을 다른 URL로 자동 전달하는 동작으로, 서버 응답(3xx)·메타 태그·자바스크립트 세 가지 방식으로 구현합니다.
- 영구 리다이렉트(301·308)는 새 URL을 정규 주소로 색인하라는 신호이고, 임시 리다이렉트(302·307)는 원래 URL을 그대로 유지합니다.
- 301·302는 비-GET 요청에서 메서드가 GET으로 바뀔 수 있고, 308·307은 메서드와 본문을 그대로 보존합니다.
- 구글은 안정성 순서로 서버 리다이렉트 > 메타 새로고침 > 자바스크립트 순을 권장합니다.
- 여러 방식을 섞으면 무한 루프 위험이 있으므로 단일 서버 측 리다이렉트로 통일하는 편이 안전합니다.
리다이렉트란?
리다이렉트(Redirect)는 사용자나 크롤러가 요청한 URL을 자동으로 다른 URL로 넘겨주는 기술입니다. 페이지 주소가 바뀌었거나, http에서 https로 전환했거나, 여러 변형 URL을 하나의 정규 주소로 모을 때 사용합니다. 요청을 받은 서버 또는 페이지가 "이 주소가 아니라 저 주소로 가십시오"라고 알려 주면, 브라우저와 검색엔진이 그 지시를 따라 목적지로 이동합니다.
리다이렉트는 크게 영구(permanent)와 임시(temporary)로 나뉩니다. 영구 리다이렉트는 콘텐츠가 새 위치로 완전히 이전되었음을, 임시 리다이렉트는 일시적인 이동임을 의미합니다. 이 구분이 SEO에서 중요한 이유는, 검색엔진이 영구 신호를 받으면 새 URL을 정규(canonical) 주소로 삼아 색인하지만, 임시 신호에서는 원래 URL을 색인에 유지하기 때문입니다.
구현 방식
리다이렉트는 세 가지 계층에서 구현할 수 있으며, 실행 우선순위와 신뢰도가 다릅니다.
- 서버 측 리다이렉트(HTTP 3xx): 서버가 3xx 상태 코드와
Location헤더를 응답으로 보냅니다. 가장 빠르고 모든 리소스 유형에 적용되며 SEO에 가장 안정적입니다. - 메타 새로고침(meta refresh): HTML
<head>안의<meta http-equiv="Refresh">로 처리합니다. HTML 문서에만 동작하며, 접근성을 위해 지연 시간을 항상 0으로 두어야 합니다. - 자바스크립트 리다이렉트:
window.location으로 이동시킵니다. 조건부 분기는 가능하지만 렌더링 실패 위험이 있어 구글은 최후의 수단으로만 권장합니다.
상태 코드 비교
서버 리다이렉트의 핵심은 어떤 3xx 코드를 쓰느냐입니다. 영구·임시 구분과 HTTP 메서드 보존 여부에 따라 다음과 같이 나뉩니다.
| 코드 | 이름 | 성격 | 메서드 처리 | 주요 용도 |
|---|---|---|---|---|
| 301 | Moved Permanently | 영구 | GET 유지, 비-GET은 GET으로 바뀔 수 있음 | 사이트 구조 변경, 페이지 영구 이전 |
| 308 | Permanent Redirect | 영구 | 메서드·본문 그대로 보존 | 비-GET 동작(POST 등)이 있는 영구 이전 |
| 302 | Found | 임시 | GET 유지, 비-GET은 GET으로 바뀔 수 있음 | 일시적으로 페이지 위치 변경 |
| 307 | Temporary Redirect | 임시 | 메서드·본문 그대로 보존 | 비-GET 동작이 있는 임시 이동 |
| 303 | See Other | 임시 | GET으로 변경(본문 손실) | POST/PUT 처리 후 결과 페이지로 이동 |
MDN에 따르면 301·302는 명세상 메서드를 바꾸지 않도록 의도되었으나 실제 일부 클라이언트가 POST/PUT/DELETE를 GET으로 바꾸는 모호함이 있었고, 308·307은 이 모호함을 제거하기 위해 도입되어 메서드와 본문을 엄격히 보존합니다.
구현 예시
운영 환경별 서버 측 영구 리다이렉트 예시입니다.
HTTP/1.1 301 Moved Permanently
Location: https://www.example.com/new-page/# Nginx — http→https + non-www→www 통합 (영구)
server {
listen 80;
server_name example.com www.example.com;
return 301 https://www.example.com$request_uri;
}# Apache .htaccess — 단일 경로 영구 이전
Redirect 301 /old-page/ https://www.example.com/new-page/<!-- 메타 새로고침: 서버 리다이렉트가 불가능할 때만, 지연 0 -->
<head>
<meta http-equiv="Refresh" content="0; URL=https://example.com/new-page/" />
</head>SEO 모범사례
구글 검색 센터 공식 문서를 근거로 한 권장 사항입니다.
- 영구 이전에는 301 또는 308을 사용합니다. 구글은 이를 새 URL을 정규 주소로 삼으라는 신호로 해석하고, 검색 결과에 새 URL을 노출합니다.
- 일시적 변경에는 302 또는 307을 사용합니다. 임시 리다이렉트에서는 색인 파이프라인이 대상 URL을 정규 주소로 삼지 않고, 원래 URL을 검색 결과에 유지합니다.
- 방식은 서버 측을 1순위로 선택합니다. 구글이 명시한 우선순위는 서버 리다이렉트 > 메타 새로고침 > 자바스크립트 > 크립토 리다이렉트 순이며, 자바스크립트는 서버·메타 방식이 모두 불가능할 때만 사용합니다.
- 여러 방식을 중복하지 않습니다. MDN은 HTTP 리다이렉트와 HTML 메타 리다이렉트를 함께 두면 한쪽만 변경되었을 때 무한 루프 등 문제가 생길 수 있다고 경고합니다.
- 비-GET 동작이 걸린 엔드포인트는 308·307을 씁니다. POST 같은 요청에서 메서드가 GET으로 바뀌면 동작이 깨질 수 있으므로 메서드 보존 코드를 선택합니다.