서론

웹 서비스를 위해 사용되는 HTTP 프로토콜에는 3XX 상태 코드로 이루어지는 redirect 응답이 존재합니다. 이러한 redirect 응답은 클라이언트를 다른 URI에 접속하도록 하기 위해 사용되며, 이를 받은 클라이언트는 조건에 따라 해당 redirect 응답을 따라갑니다. 하지만 HTTP 프로토콜의 redirection에는 모호함이 존재합니다. 바로 클라이언트가 사용한 메소드를 보존할지(method-preserving)에 관한 것입니다. 본 문서에서는 RFC 문서와 함께 이러한 내용을 살펴봅니다.

예상 독자는 HTTP redirect 구현을 직접 하시는, 혹은 하실 분(HTTP 라이브러리를 구현한다거나…). 그리고 이런 자세한 내용에 관심이 많으신 분입니다.

본론

redirect 응답을 받은 클라이언트에게는 크게 두 가지 선택지가 있습니다. 바로 요청시 사용한 메소드를 보존하여 다음 요청에도 그대로 사용할지, 아니면 GET으로 변경하여 요청할지에 관한 것입니다. RFC 1945 HTTP /1.0 섹션 9-3은 301 상태코드와 302 상태코드에 대해 보존하도록 정의되었습니다. 즉, POST 요청에 대해 Redirect로 응답했다면 클라이언트는 POST로 따라가야 합니다.

하지만 이러한 표준과는 달리 현실적으로는 보존하지 않고 GET으로 변경하는 경우가 많아졌습니다. 왜냐하면, 예를 들어 POST 요청에 대한 응답으로 평범한 웹페이지를 redirect로서 응답했을때, 이를 GET으로 접근해야 했기 때문입니다. 그리고 시간이 지나며 결국 GET으로 변경하는 쪽으로 수렴하였습니다.

RFC7538의 상태코드 307과 308은 이러한 method 보존 문제를 명확히 하기 위해 나중에 추가되었고, 본래 메소드를 보존해야 했던 301과 302는 POST 요청이 GET으로 조정되는 것을 허용하게 되었습니다.