발생 상황
server를 띄운 후, Postman으로 요청보냈을 때 GET요청은 물론 POST, PUT, PATCH 등의 HTTP 메서드 요청이 모두 GET으로 호출되는 현상을 발견했습니다.... 처음보는 현상이라 당황하고 어디서부터 디버깅을 시작해야할지 막막했는데요.
api 서버의 프록시에도 GET요청으로 가득한 것을 보며 이것은 요청부터가 GET으로 출발했다는 생각이 들었습니다.
발생 원인
- `HTTPS`를 지원하는 서버에 `http`로 접근하게 되면 `HTTPS` 로 리다이렉트될 때 메서드가 변환되어 호출되는 현상이었습니다.
좀 헤맸지만 아주 간단한 이유였습니다.
🤔 왜 변환이 되는 것일까?
먼저 포스트맨의 `Automatically follow redirects` 옵션을 끈 뒤, 다시 `http` 프로토콜로 요청 보내보면 301응답을 통해 리다이렉트가 유도되는 것을 확인할 수 있습니다.
서버측에서 `HTTP` 를 `HTTPS`로 리다이렉트를 하면서 3xx 응답으로 브라우저에게 다시 요청하게끔 하는 것인데요.
문제는 `301 Moved Permanently` 로 리다이렉션을 넘겨줄 때 `GET`, `HEAD`가 아닌 요청은 변경될 수 있으므로 주의해야 합니다.
If the 301 status code is received in response to a request other than GET or HEAD, the user agent MUST NOT automatically redirect the request unless it can be confirmed by the user, since this might change the conditions under which the request was issued.
Note: When automatically redirecting a POST request after receiving a 301 status code, some existing HTTP/1.0 user agents will erroneously change it into a GET request.
301 상태 코드가 GET 또는 HEAD 이외의 요청에 대한 응답으로 수신되는 경우, 사용자 에이전트는 요청이 발행된 조건이 변경될 수 있으므로 사용자가 확인할 수 없는 한 요청을 자동으로 리디렉션해서는 안 됩니다.
참고: 301 상태 코드를 수신한 후 POST 요청을 자동으로 리디렉션할 때, 일부 기존 HTTP/1.0 사용자 에이전트는 해당 요청을 GET 요청으로 잘못 변경할 수 있습니다.
- 출처 : https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.2
대처
저는 API를 호출할 때 `HTTPS`로 바꿔주는 것으로 해결하였습니다.
만약 `HTTP` 요청도 `GET`, `HEAD` 외의 메서드에 대해서 리다이렉션해야 한다면 308 응답을 사용하는 것을 추천합니다.
참고:
명세에서는 리디렉션를 수행할 때 메서드와 본문이 변경되지 않아야 한다고 하지만, 모든 사용자 에이전트가 이 요구사항을 충족하지 않습니다.
`301` 코드는 `GET`과 `HEAD` 메서드의 응답으로만 사용하고, `POST` 메서드에 대해서는 메서드 변경이 명시적으로 금지된 308 Permanent Redirect 사용이 바람직합니다.
- 출처 : https://developer.mozilla.org/ko/docs/Web/HTTP/Status/301
단 주의할 사항은 일부 브라우저에서 308 코드를 비표준 방식으로 사용한다는 것입니다.
Note: This status code is much younger (June 2014) than its sibling codes and thus might not be recognized everywhere. See Section 4 of [RFC7538] for deployment considerations.
- 출처 : https://httpwg.org/specs/rfc9110.html#status.300
301 | 308 | |
영구적으로 리다이렉션 | ✅ | ✅ |
메소드 유지 | `GET`, `HEAD` only | ✅ |
Refs.
https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.2
https://developer.mozilla.org/ko/docs/Web/HTTP/Status/301
https://httpwg.org/specs/rfc9110.html#status.300