HTTP 307 Temporary Redirect
엄격한 임시 리디렉션: 다른 URL로 이동하되, 요청을 보낸 그대로 정확히 반복해야 합니다.
HTTP 307의 의미
HTTP 307 Temporary Redirect는 302와 유사하게 동작하지만 한 가지 보장이 추가됩니다. 클라이언트는 동일한 메서드와 본문으로 새 URL에 요청을 반복해야 합니다. 리다이렉트된 POST는 그대로 POST로 유지되며, 어떤 것도 은연중에 GET으로 변환되지 않습니다.
브라우저는 내부적으로도 307을 생성합니다. 사이트가 HSTS 프리로드 목록에 있으면 브라우저는 서버와 통신 없이 스스로 http://를 https://로 업그레이드하며, DevTools에는 “307 Internal Redirect”로 표시됩니다.
307 응답이 발생하는 일반적인 원인
- API가 POST/PUT 요청을 일시적으로 다른 엔드포인트로 리다이렉트하는 경우입니다.
- HSTS: 브라우저가 내부적으로 http://를 https://로 업그레이드하는 경우입니다(DevTools에는 307로 표시됨).
- 로드 셰딩(load shedding)이나 유지보수 기간 동안 쓰기 요청을 대기 엔드포인트로 재라우팅하는 경우입니다.
개발자를 위한 모범 사례
- 리다이렉트된 요청에 반드시 유지되어야 하는 본문이 있을 때는 항상 307을 사용하세요.
- 메서드를 보존하는 영구 이동에는 대신 308을 사용하세요.
- 클라이언트가 전체 본문을 다시 전송한다는 점을 기억하세요. 가능하다면 처음부터 올바른 URL을 클라이언트에 알려주어, 매우 큰 업로드에 307을 사용하는 것은 피하세요.
응답 예시
HTTP/1.1 307 Temporary Redirect Location: https://api.example.com/v2/orders Retry-After: 0
자주 묻는 질문
302와 307의 차이는 무엇인가요?
둘 다 임시적이지만, 307은 요청 메서드 변경을 금지합니다. 즉 POST는 그대로 POST로 반복됩니다. 302는 과거에 브라우저가 GET으로 전환하는 경우가 있었습니다.
DevTools에 “307 Internal Redirect”가 표시되는 이유는 무엇인가요?
브라우저가 서버에 연락하지 않고 스스로 요청을 HTTPS로 업그레이드한 경우입니다(HSTS). 이는 합성된(synthetic) 307로 표시됩니다.
307의 영구 버전이 존재하나요?
예, 308 Permanent Redirect가 있습니다. 메서드를 보존한다는 규칙은 동일하지만, 캐시와 검색 엔진은 이 이동을 영구적인 것으로 취급합니다.