
curl의 종료 코드 0만으로 HTTP 요청이 업무상 성공했다고 판단하지 마세요. HTTP 404 응답을 정상적으로 받았을 때 기본 curl은 0으로 끝날 수 있습니다. HTTP 오류를 실패로 처리하면서 본문도 남기려면 지원 버전의 --fail-with-body와 응답 코드를 함께 확인하세요.
원인: 통신 처리 결과와 HTTP 의미를 하나로 본다
프로세스가 응답을 받는 데 성공했다는 판단과, 서버가 요청한 자원을 제공했다는 판단은 다릅니다. HTTP 4xx·5xx와 연결·DNS·TLS 실패를 같은 오류로 처리하면 잘못된 재시도나 배포 성공 판정으로 이어질 수 있습니다. 자동화에서는 종료 상태와 HTTP 코드와 본문을 각각 기록하는 편이 원인을 좁히기 쉽습니다.
| 조회 방식 | HTTP 404의 처리 | 본문 처리 |
| 기본 curl | 종료 코드 0 가능 | 응답 본문 출력 |
| --fail | 일반적으로 종료 코드 22 | 오류 본문 출력 억제 |
| --fail-with-body | 종료 코드 22 | 오류 본문도 보존 |
1. 버전과 승인된 시험 주소를 준비한다
--fail-with-body는 curl 7.76.0에 추가됐습니다. 설치된 curl --version과 해당 버전의 도움말을 확인하세요. 아래 주소는 자신이 준비한 로컬 시험 서버의 존재하지 않는 경로로 바꿔야 하는 예시입니다. 서버가 없으면 연결 실패를 시험하게 되므로 404 검증과 다른 결과가 나옵니다.
curl --version
curl -sS -w '\nhttp=%{http_code}\n' \
'http://127.0.0.1:8080/missing'
curl -sS --fail-with-body -w '\nhttp=%{http_code}\n' \
'http://127.0.0.1:8080/missing'
2. 로컬 HTTP 시험에서 분리된 두 결과
2026년 10월 22일 macOS curl 8.7.1과 127.0.0.1에만 연결된 별도 Python 임시 HTTP 서버로 시험했습니다. 서버는 GET 요청에 404와 fixture missing 본문을 돌려주도록 구성했습니다. 기본 curl의 프로세스 종료 코드는 0, --fail-with-body는 22였고 두 경우 모두 HTTP 404를 관찰했습니다. 후자에서도 본문이 남았습니다. 외부 서버·실제 서비스의 인증·TLS·재시도 동작을 시험한 결과는 아닙니다.
3. 스크립트의 성공 조건을 따로 정의한다
셸의 종료 코드는 해당 명령 직후 보존하고, 파이프라인·다른 명령 실행 뒤의 값으로 대체하지 마세요. HTTP 응답 코드도 별도 변수나 제한된 로그로 기록합니다. 프로세스 성공과 HTTP 성공을 확인한 뒤에도 JSON의 업무 결과가 성공인지 등 서비스의 계약을 추가로 검토해야 할 수 있습니다. 모든 자동화에 200 하나만 정답으로 고정하지 말고 해당 API의 성공 응답 범위를 따르세요.
인증·재시도·본문 보관 시 주의
--fail과 --fail-with-body는 대안인 옵션이며 함께 조합하는 방식이 아닙니다. 공식 문서가 경고하는 인증 응답 등 예외를 확인하고 단일 옵션을 완전한 업무 판정기로 취급하지 마세요. TLS 검증을 끄거나 비밀번호·토큰을 출력해 해결하지 않습니다. 응답 본문에는 민감정보가 있을 수 있으므로 보관 위치·내용과 권한을 제한하세요. 실패 코드를 얻었다는 이유로 결제·등록 같은 요청을 무조건 재전송하지 말고, 중복 실행 위험과 Retry-After 등 서버 조건을 따로 확인합니다.
FAQ
HTTP 404도 curl 종료 코드가 0일 수 있나요? 기본 동작에서는 가능합니다. 통신 처리 결과와 HTTP 의미를 따로 봐야 합니다.
--fail과 --fail-with-body를 같이 쓰나요? 서로 대안인 옵션입니다. 본문을 남길지에 따라 하나를 선택하세요.
오류면 무조건 재시도하면 되나요? 아닙니다. 404·권한·인증·429 등 원인과 요청의 중복 실행 위험을 구분하세요.
공식 출처와 관련 글
자료 확인일: 2026년 10월 22일. macOS의 격리된 임시 환경에서만 아래 설명의 시험을 수행했습니다. 운영 저장소·외부 서버 변경이나 AWS 배포·성능·요금 시험은 하지 않았습니다.
'소프트웨어개발' 카테고리의 다른 글
| git diff가 비어 있는데 변경이 남을 때: 작업 트리·인덱스·HEAD 비교 (0) | 2026.10.23 |
|---|---|
| CloudFront 캐시 정책과 오리진 요청 정책: 캐시 키와 추가 전달값 구분 (0) | 2026.10.23 |
| CloudTrail Event history와 Trail 선택: 조회 기간·이벤트 유형·보존 책임 구분 (0) | 2026.10.23 |