GET 요청이 POST로 전환되는 이유 (OpenFeign, Spring)

나는 GET으로 보냈는데 왜 POST로 갈까? (feat. OpenFeign 기여)

카테고리

프로그래밍/소프트웨어 개발

서브카테고리

웹 개발

대상자

Spring 프레임워크와 OpenFeign을 사용하는 개발자, HTTP 요청/응답 메커니즘 이해가 필요한 중급 이상 개발자

핵심 요약

  • GET 요청에 @RequestParam 등 HTTP 바인딩 어노테이션이 누락되면 OpenFeign은 내부적으로 HttpURLConnection을 통해 POST로 요청 전환
  • HttpURLConnection은 GET 요청에 Body가 포함되면 RFC 7231 호환성 유지 차원에서 자동으로 POST로 메서드 변경
  • Apache HttpClient 5 사용 시 GET 메서드 유지 가능, 또는 @RequestParam 추가로 문제 해결

섹션별 세부 요약

1. 문제 현상

  • A 서버에서 @GetMapping을 사용한 FeignClient로 B 서버 API 호출 시 405 Method Not Allowed 발생
  • A 서버 로그는 GET 요청으로 기록되지만, B 서버는 POST 요청으로 처리
  • 요청 Body에 파라미터가 포함되었음

2. 원인 분석

  • @RequestParam 등 바인딩 어노테이션이 누락된 GET 메서드는 OpenFeign의 내부 HTTP 클라이언트(HttpURLConnection)가 Body를 처리하지 못해 POST로 자동 전환
  • HttpURLConnection은 GET 요청에 Body가 포함되면 RFC 7231 호환성을 위해 POST로 메서드 변경
  • Feign 자체는 메서드 변경하지 않고, Java 표준 클라이언트의 동작에 의존

3. 해결 방안

  • GET 요청에 @RequestParam 또는 @PathVariable 등 HTTP 바인딩 어노테이션 추가
  • Apache HttpClient 5 사용 시 GET 메서드 유지 가능 (의존성 추가 필요)
  • OpenFeign의 spring-cloud-openfeign 라이브러리에 경고 로그 기능 추가 (Issue #1191, PR #1194 기여)

4. 추가 고려사항

  • Spring Cloud OpenFeign 2022.0.0 이후로는 신규 기능 개발 중단 (크리티컬 버그 수정만 진행)
  • DEBUG 로그 수준에서 HttpURLConnection의 POST 전환 로그 확인 가능

결론

  • GET 요청 시 반드시 @RequestParam, @PathVariable 등 HTTP 바인딩 어노테이션을 명시해야 함
  • HttpURLConnection 대신 Apache HttpClient 5 사용 시 메서드 변경 방지 가능
  • OpenFeign의 spring-cloud-openfeign 라이브러리에 경고 로그 기능 추가로 개발자 오류 예방 가능