307 Temporary Redirect
사용법
307 Temporary Redirect 상태 코드는 대상 리소스를 다른 URL에서 사용할 수 있음을 나타냅니다. 클라이언트는 Location 헤더에 지정된 URL로 새 요청을 보내며, 요청 메서드를 바꾸는 것은 허용되지 않습니다. 이는 클라이언트가 POST에서 GET으로 전환하는 것을 허용하는 302 상태 코드와 다릅니다.
요청 메서드를 바꾸는 동작을 원한다면 303 상태 코드가 권장되는 대안입니다. 예를 들어 POST 폼 제출을 확인 페이지로 리다이렉트할 때는 303을 사용하고 GET으로 후속 요청을 보냅니다.
클라이언트는 새 URL로 정확히 동일한 메서드, 헤더, 본문을 반복해 보내야 합니다. 서버는 리다이렉트된 요청을 평소대로 처리합니다. 307 Temporary Redirect는 지속적인 것이 아니므로, 이후 요청은 원래 URL을 사용해 임시 변경 여부를 다시 확인해야 합니다.
영구적인 대응물은 308로, 요청 메서드를 동일하게 보존하면서 이동이 영구적임을 알리고 클라이언트가 저장된 링크를 갱신하게 합니다.
이 응답은 기본적으로 캐시할 수 없습니다. 리다이렉트를 캐시 가능하게 하려면 Cache-Control이나 Expires 헤더를 추가하세요.
307 Temporary Redirect 상태 코드는 Strict-Transport-Security 헤더나 HSTS 프리로드 목록을 통해 HSTS 정책이 선언된 경우 내부 리다이렉트 역할도 합니다. 클라이언트는 서버와 통신하지 않고 이 상태 코드를 사용해 HTTP에서 HTTPS를 쓰는 보안 연결로 리다이렉트합니다.
참고
브라우저는 HSTS를 통해 HTTP를 HTTPS로 전환할 때 개발자 도구에 “307 Internal Redirect”를 생성합니다. 이 리다이렉트는 네트워크 요청 없이 전적으로 브라우저 안에서 일어납니다. 개발자 도구에는 Non-Authoritative-Reason: HSTS 헤더가 나타납니다. HTTP와 HTTPS 사이의 307 리다이렉트 루프는 HSTS와 서버 측 리다이렉트 규칙이 충돌한다는 뜻입니다. 서버가 HTTP 포트에서만 리다이렉트하도록 하세요.
참고
303은 원래 메서드와 상관없이 후속 요청이 GET을 사용하도록 강제하므로, POST 이후 리다이렉트의 표준입니다. 307은 원래 메서드와 본문을 보존합니다. 클라이언트는 동일한 POST/PUT/PATCH를 새 URL로 다시 보냅니다.
SEO 영향
강한 신호인 301/308과 달리, Google은 307을 리다이렉트 대상이 선호 URL이라는 약한 신호로 취급합니다. Google은 원본 URL이나 대상 URL 중 하나를 색인합니다. 307을 장기간 그대로 두면 결국 영구 리다이렉트로 취급될 수 있으므로, 영구적인 변경에는 308이 더 적합합니다.
예시
클라이언트가 리소스를 요청하고, 그 리소스를 다른 위치에서 사용할 수 있으므로 서버는 307 Temporary Redirect로 응답합니다.
요청
GET /news.html HTTP/1.1
Host: example.com
응답
HTTP/1.1 307 Temporary Redirect
Location: http://example.com/breaking/news.html
코드 참고
.NET
HttpStatusCode.TemporaryRedirect
Rust
http::StatusCode::TEMPORARY_REDIRECT
Rails
:temporary_redirect
Go
http.StatusTemporaryRedirect
Symfony
Response::HTTP_TEMPORARY_REDIRECT
Python3.5+
http.HTTPStatus.TEMPORARY_REDIRECT
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_TEMPORARY_REDIRECT
Angular
@angular/common/http/HttpStatusCode.TemporaryRedirect