ERR_TOO_MANY_REDIRECTS
페이지가 서로를 계속 가리켜 브라우저가 리디렉션을 끝내지 못하고 오류를 표시하는 상태입니다.
서버가 3xx 상태 코드와 Location 헤더를 응답해 클라이언트를 원래 요청 URL에서 다른 대상 URL로 자동 이동시키는 요청 전달 방식입니다. 입력은 원래 URL 요청이고 출력은 대상 URL로의 재요청입니다.
Redirect는 서버가 3xx 응답과 Location 헤더로 브라우저를 다른 URL로 이동시키는 구성요소입니다. 상태 코드에 따라 영구(301·308)와 임시(302·303·307)로 나뉘며, 잘못 구성하면 순환이 생겨 요청이 종료되지 않을 수 있습니다.
Redirect(리다이렉트)는 하나의 자원에 여러 URL을 부여해, 원래 요청한 URL에서 다른 URL로 브라우저를 자동으로 이동시키는 구성요소입니다. 서버는 3으로 시작하는 상태 코드와 이동할 주소를 담은 Location 헤더를 응답하고, 브라우저는 그 주소로 다시 요청을 보냅니다.
사용자는 추가 왕복 요청을 거의 인지하지 못하지만, 요청은 두 번 일어납니다.
리다이렉트의 성격은 상태 코드로 결정됩니다.
| 구분 | 코드 | 의미 | 메서드 처리 |
|---|---|---|---|
| 영구 | 301 Moved Permanently | 주소가 영구 이동 | GET 유지, 그 외는 GET으로 바뀔 수 있음 |
| 영구 | 308 Permanent Redirect | 주소가 영구 이동 | 메서드와 본문 유지 |
| 임시 | 302 Found | 일시적으로 다른 위치 | GET 유지, 그 외는 GET으로 바뀔 수 있음 |
| 임시 | 303 See Other | 다른 자원 참조 | 모든 메서드를 GET으로 변경 |
| 임시 | 307 Temporary Redirect | 일시적 이동 | 메서드와 본문 유지 |
| 특수 | 300 Multiple Choices | 여러 대상 중 선택 | 클라이언트가 목록에서 선택 |
| 특수 | 304 Not Modified | 캐시된 응답이 아직 유효 | 캐시 재사용 지시 |
영구(301·308) 리다이렉트는 검색 엔진과 크롤러가 원래 URL을 새 URL로 갱신하지만, 임시(302·303·307) 리다이렉트는 새 URL을 기억하지 않습니다. POST·PUT·DELETE 처리 후에는 303으로 결과 페이지로 이동시키면 새로고침 시 요청이 다시 전송되는 것을 방지할 수 있습니다.
같은 이동이라도 처리 계층이 다르며, 여러 방식을 섞으면 동작 순서를 예측하기 어렵습니다.
| 방식 | 실행 시점 | 특징 |
|---|---|---|
| HTTP 리다이렉트 | 가장 먼저 | 서버가 3xx로 응답, 가장 권장 |
JavaScript(window.location) | HTML 로드 완료 전 | JS 활성 클라이언트에서만 동작 |
HTML <meta http-equiv="Refresh"> | 페이지 로드 후 | HTML 콘텐츠에서만 동작 |
주요 용도는 도메인 정규화(example.com → www.example.com), HTTPS 강제(http:// → https://), URL 구조 변경 시 기존 링크와 SEO 유지입니다.
리다이렉트가 서로를 가리켜 끝나지 않는 **순환(redirect loop)**을 만들면 요청이 완료되지 않습니다. MDN에 따르면 이 경우 서버는 500 Internal Server Error를 응답할 수 있고, 브라우저는 "리디렉션이 종료되지 않는다"는 오류 화면을 표시합니다.
[Observation] HTTP 리다이렉트와 HTML meta 리다이렉트를 혼용하지 말고, 리다이렉트 체인이 순환을 만들지 않는지 확인합니다. 리다이렉트는 최소한으로 유지하는 것이 성능에 유리합니다.