본문 바로가기
Spring

Postmans 포스트맨 / Curl을 통해 보내는 request

by 코딩균 2021. 10. 4.

spring boot를 통해 API 개발을 하다가 예상치 못한 문제를 만났다

 

이슈

회원가입 등 DB에 insert를 진행하는 JPA 로직이 포함되어 있는 API는 모두 POSTMAN(포스트맨)을 통해서 request를 보낼 때와 터미널의 Curl을 이용해서 보낼때 response가 다르다는 이슈였다.

 

포스트맨을 통해 request & response를 점검한 후에 view document - API 명세서 자동 생성기를 통해서 프론트엔드 담당 친구에게 주는 방식으로 작업을 하고 있었다. 

postman에서 직접 request 생성 후 정상 response 받은 결과

포스트 맨을 통해 API에 요청을 보내면 정상 response가 돌아오지만 

 

postman에서 자동생성한 API 명세서 안의 curl 명령어

API 명세서에 써져있는 curl을 가지고 터미널에서 request를 보내면

curl을 통해 request 보냈을 때 받은 response

위와 같이 500 error를 받게되었다. 

왜 같은 API인데 POSTMAN에서 보내는 것과 Curl을 통해 보내는 것의 response가 다른가 특히 insert 로직이 포함된 API 만 말이다!!!!

 

원익 분석 & 생각

select 가 들어간 logic은 curl에서도 문제없이 postman과 같은 정상 response를 받았기 때문에 아래와 같이 두가지 생각을 했다

  • POST 방식의 db에 무엇인가를 insert하는 request 이니 Spring Security에서 좀 더 철저하게 파라미터들을 살펴보나보다..?

로그를 살펴 보았을 때,

springsecurity가 무언가 태클거는 듯한 느낌의 로그

spring security가 무언가 계속 오류를 내뱉는 것 같았다. 또한 firewall에서 RequestRejectException을 계속 예외로 던지고 있어서 controller에 가기 전에 막힌다는 생각을 했다. 

(하지만 Spring Security가 어떻게 돌아가는지 1도 모르기 때문에 정확한 예외의 의미는 알 수 없었고)

parameter가 잘못되었고 JSON 형식의 body를 넘겨준 것을 미리 firewall에서 거르는구나 정도 유추할 수 있었다. 

 

찝찝한 해결

request body에 초점을 맞추니 Postman이 만들어주는 API 명세서를 의심하게 되었다. 그러고 명세서에 적혀있는 Curl 명령어를 보니, --data--raw 해서 raw data를 보내주고 있었고, json이라고 알려주는 명령어도 없었다. 

그래서 Curl 명령어를 찾아서 json 형식의 data body를 보내주는 Post method 방식의 http request를 생성해보았다.

 

curl -X POST http://dev.homekiri.site/web/users/sign-in -H 'Content-Type: application/json' -d '{"email":"kiyoon73234234223422@hanmail.net","pwd" : "rldbsrla1!", "nickName" : "디디다다e00l2333334445555"}'

 

어처구니 없게도 Postman API 명세서에서 Curl 명령어를 잘못 쓴것이 맞았다.  물론 나보다 더 똑똑하신 분들이 만든 거라서 내가 POSTMAN이 만들어준 Curl 명령어를 잘못쓰는 것도 있겠지만 무튼 Curl 명령어를 통째로 바꾸는 식으로 해결했다

 

로그인 같은 POST 방식을 정보를 보내서 DB에서 Select하는 로직 같은 경우는 Curl이 raw data로 request 넣어도 잘 동작하는 것은 왜 인지 모르는 찝찝함을 남겼다. Spring firewall이 insert 로직이 포함된 API 같은 경우는 header에서 data type 체크를 더 확실하게 하는 구나 정도로 추측한다

 

정리

  • Spring security 혹은 spring의 firewall이 request로 들어오는 data type 까지 체크하고 exception을 내보낸다?
  • insert 로직이 들어있는 API는 좀 더 깐깐하게(raw 데이터 중에서 json형식인지?!) spring이 살펴본다?