외주 프로젝트를 진행하다가 클라이언트 개발자에게서 자꾸 에러가 난다는 얘기를 들었다.
그런데 포스트맨으로 테스트 해보니 아무리 해도 멀쩡히 잘 되는 것이다. HTTP 메소드가 다른 것도 아니고, 원인을 찾다가 한 가지 나와 다른 점을 발견했다.
- 클라이언트 개발자의 URL
http://11.11.11.11/users/test- 내가 사용한 URL
https://api.test.com/users/test
클라이언트 개발자가 사용한 URL대로 테스트 해보니 역시 오류가 났다. 내용은 GET 메소드를 받을 수 없는 HTTP 405 에러다.
리다이렉트 설정도 해놨는데 왜 에러가 날까??
https://api.test.com/users/test
-> 정상적인 응답 (HTTP 200/OK)
http://11.11.11.11/users/test
-> 서버 내부에서 https://api.test.com 으로 리다이렉션
-> HTTP 메소드가 GET으로 변경 (‼️여기서 문제 발생)
-> 에러 응답 (HTTP 405/Method Not Allowed)
# http Redriection
server {
listen 80;
return 301 $scheme://www.example.com$request_uri;
}
# http Redriection
server {
listen 80;
return 308 $scheme://www.example.com$request_uri;
# -> 308 리다이렉션은 일부 브라우저에서 동작하지 않는다.
# 하지만 해당 서버는 REST API 용도로만 사용하는 서버기 때문에 큰 문제가 없었다
}
문제를 급히 해결하고 HTTP 리다이렉션에 대한 정의를 다시 알아보았다. 역시나 기본이 중요하니까 다시 살펴보자
영원히 지속되는 리다이렉션으로 원래의 URL을 더 이상 사용하지 않게 하는 리다이렉션이다. 서버 단에서 주로 설정하고 검색 엔진 로봇이 알 수 있다.
일시적인 방법으로 웹 어플리케이션이나 자바스크립트 상에서 처리하는 리다이렉션이다. 서버에서는 리다이렉션 URL을 응답으로 보내주게 되고, 이를 클라이언트에서 받아 새로운 주소로 다시 요청을 보내야 한다.
일시적인 리다이렉션이 많아질 경우 서버에 호출이 많이 발생하여 성능이 저하될 수 있다.
영구적인 리다이렉션에 대해 잘 알았더라면 바로 해결할 간단한 문제였다.
단, 해당 서버는 REST API 용도로만 사용했기에 호환성 문제가 없었으나 일부 브라우저에서는 307, 308 리다이렉션이 동작하지 않으니 사용에 유의할 필요는 있다!