HTTP 메소드를 리다이렉트 하면 GET 메소드가 된다?

Do_Doolly·2022년 12월 1일
0
post-thumbnail

외주 프로젝트를 진행하다가 클라이언트 개발자에게서 자꾸 에러가 난다는 얘기를 들었다.

그런데 포스트맨으로 테스트 해보니 아무리 해도 멀쩡히 잘 되는 것이다. HTTP 메소드가 다른 것도 아니고, 원인을 찾다가 한 가지 나와 다른 점을 발견했다.

클라이언트 개발자가 사용한 URL대로 테스트 해보니 역시 오류가 났다. 내용은 GET 메소드를 받을 수 없는 HTTP 405 에러다.

리다이렉트 설정도 해놨는데 왜 에러가 날까??


문제상황

정상적인 POST 메소드 호출

https://api.test.com/users/test

-> 정상적인 응답 (HTTP 200/OK)

리다이렉션 POST 메소드 호출

http://11.11.11.11/users/test

-> 서버 내부에서 https://api.test.com 으로 리다이렉션

-> HTTP 메소드가 GET으로 변경 (‼️여기서 문제 발생)

-> 에러 응답 (HTTP 405/Method Not Allowed)

Nginx 서버 설정

# 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 리다이렉션

문제를 급히 해결하고 HTTP 리다이렉션에 대한 정의를 다시 알아보았다. 역시나 기본이 중요하니까 다시 살펴보자

리다이렉션 정의

  • URL 리다이렉션 혹은 URL 포워딩은 페이지 단위의 실제 리소스, 폼 등을 다른 URL로 링크를 존속시키는 기술
  • 크게 세 가지로 분류됨
    • 영구적인 리다이렉션 : 완전히 다른 URL로 이동시키는 리다이렉션
    • 일시적인 리다이렉션 : 사이트 유지관리가 진행중 상태에서 리다이렉션
    • 특수 리다이렉션 : 파일 업로드 시 진행 페이지 등

영구적인 리다이렉션

영원히 지속되는 리다이렉션으로 원래의 URL을 더 이상 사용하지 않게 하는 리다이렉션이다. 서버 단에서 주로 설정하고 검색 엔진 로봇이 알 수 있다.

유스 케이스

  • http -> https 리다이렉션
  • 회사명을 변경하거나 새로운 도메인으로 이동한 기존 사이트

301, 308 리다이렉션[1]

  • 301 리다이렉션 : GET 메소드를 제외하고 다른 메소드는 변경될 수 있음
  • 308 리다이렉션 : 메소드와 본문이 변하지 않음

일시적인 리다이렉션

일시적인 방법으로 웹 어플리케이션이나 자바스크립트 상에서 처리하는 리다이렉션이다. 서버에서는 리다이렉션 URL을 응답으로 보내주게 되고, 이를 클라이언트에서 받아 새로운 주소로 다시 요청을 보내야 한다.

일시적인 리다이렉션이 많아질 경우 서버에 호출이 많이 발생하여 성능이 저하될 수 있다.

유스 케이스

  • 링크는 유지하되 일시적으로 다른 내용을 표시할 때

302, 303, 307 리다이렉션[2]

  • 302 리다이렉션 : GET 메소드를 제외하고 다른 메소드는 변경될 수 있음
  • 303 리다이렉션 : GET을 제외한 다른 메소드는 GET 메소드로 변경됨
  • 307 리다이렉션 : 메소드와 본문이 변하지 않음

특수 리다이렉션

  • 304 리다이렉션 : 로컬 캐시에 복사된 페이지로 리다이렉트

결론

영구적인 리다이렉션에 대해 잘 알았더라면 바로 해결할 간단한 문제였다.

단, 해당 서버는 REST API 용도로만 사용했기에 호환성 문제가 없었으나 일부 브라우저에서는 307, 308 리다이렉션이 동작하지 않으니 사용에 유의할 필요는 있다!


& 링크모음

[1] : 영속적인 리다이렉션
[2] : 일시적인 리다이렉션
Redirections in HTTP

profile
생각하면 복잡하니까 일단 해보자

0개의 댓글