Nginx 리다이렉트 설정으로 인한 POST → GET 변환 문제와 해결기

haazz·2025년 4월 13일

🥑 문제 상황

서비스 배포 후, POST 요청을 보냈는데 예상과 다르게 GET 요청으로 서버에 도달하는 문제가 발생했습니다. 특히, 프론트엔드에서 로그인이나 글 작성과 같은 POST 요청을 보내도 서버에서는 이를 GET 요청으로 처리해 오류가 발생하였습니다.

처음에는 프론트엔드의 Axios 설정이나 Spring Security의 필터에서의 리다이렉트 문제일 것으로 판단하고 해당 부분을 계속 수정했지만, 문제는 해결되지 않았습니다.

🥑 원인 분석

문제는 Nginx에서 HTTP 요청을 HTTPS로 리다이렉트하는 과정에서 발생했습니다.
303 응답이 POST를 GET으로 바꾸는 것을 간과하고 있었습니다.

아래는 Nginx 코드와 시퀀스 다이어그램입니다:

server {
    listen 80;
    server_name ... ...;

    location / {
        return 303 https://$host$request_uri;
    }
}

🥑 해결 방법

이 문제를 해결하기 위해서는 아래와 같은 방법들이 있습니다:

  1. 303을 307(Temporary Redirect) 또는 308(Permanent Redirect)으로 변경

    • 이 상태 코드는 HTTP 메서드를 유지하여 리다이렉트합니다.
    • POST → POST, PUT → PUT이 보장됩니다.
  2. Frontend에서 response를 받아 직접 redirect 수행

    • Frontend에서 redirect 횟수를 0으로 하고 직접 redirect를 수행할 수 있습니다.
    • 하지만, 불필요한 코드 수정이 너무 많이 필요해서 선택하지 않았습니다.
  3. Frontend에서 요청을 HTTPS로 확실히 보내기

    • 사실 프론트엔드에서 프로토콜을 확인하고 요청을 정확히 보내는 것이 가장 바람직해 보였습니다.
    • .env 파일과 배포환경에서 요청 URL을 명확히 설정

따라서 Nginx에서의 리다이렉트 코드는 삭제하고, Frontend의 환경변수를 명확히 수정하여 문제를 해결하였습니다.

profile
Developers who create benefit social values

0개의 댓글