curl SSL, TLS & 프록시 설정 가이드
curl에서 HTTPS 인증서, TLS 버전, 프록시 및 사용자 정의 DNS 해석을 구성하는 것은 안전한 API 통신, CI/CD 파이프라인, 네트워크 문제 디버깅에 필수적입니다. 이 가이드는 로컬 개발을 위해 -k로 인증서 검사를 비활성화하는 것부터 --cert로 상호 TLS를 설정하고 SOCKS5 프록시를 통해 트래픽을 라우팅하는 것까지 모든 SSL, TLS, 프록시, 네트워크 플래그를 다룹니다. 각 옵션에는 명확한 설명, 보안 고려사항, 바로 복사할 수 있는 예제가 포함되어 있습니다.
SSL & 프록시 플래그 빠른 참조
안전하지 않은 연결 허용 — 모든 SSL 검증 건너뛰기
특정 CA 번들에 대해 서버 인증서 검증
상호 TLS 인증을 위한 클라이언트 인증서 제공
클라이언트 인증서의 개인 키 파일 제공
연결에 TLS 버전 1.2 이상 사용
연결에 TLS 버전 1.3 이상 사용
연결에 SSL/TLS 요구 (사용 불가 시 실패)
연결에 사용할 SSL 암호 지정
클라이언트 인증서 유형 지정 (PEM, DER, ENG, P12)
서버 공개 키 고정 및 검증 (HPKP 스타일)
지정된 프록시 서버를 통해 모든 트래픽 라우팅
SOCKS5 프록시를 통해 연결 라우팅
프록시 서버의 사용자명:비밀번호 제공
프록시를 거치지 않아야 할 호스트 목록
프록시를 통한 DNS 해석을 사용하는 SOCKS5 프록시
HTTPS 프록시 자체를 검증하기 위한 CA 인증서
특정 host:port 쌍을 사용자 정의 IP 주소에 매핑
URL이 지정하는 것과 다른 host:port에 연결
연결의 로컬 포트 번호 또는 범위 설정
특정 네트워크 인터페이스에 연결 바인딩
시스템 기본값 대신 사용자 정의 DNS 서버 사용 (c-ares)
curl -k: SSL 인증서 오류 무시
- 기능
-k(또는--insecure) 플래그는 모든 SSL/TLS 인증서 검증을 비활성화합니다. curl은 서버 인증서가 신뢰할 수 있는 CA에 의해 서명되었는지, 호스트 이름이 일치하는지, 인증서가 만료되었는지 확인하지 않습니다.- 사용 시기
- 자체 서명 인증서를 사용하는 로컬 개발 또는 테스트 환경에서만 사용하세요. 스테이징/프로덕션에서는 실제 CA 인증서와 함께
--cacert를 사용하세요 — 더 안전하고 명시적입니다.
$ curl -k https://localhost:8443/api/health프로덕션 스크립트나 CI/CD 파이프라인에서 -k를 절대 사용하지 마세요. 모든 인증서 검증을 비활성화하여 중간자 공격에 취약해집니다. 대신 --cacert를 사용하여 특정 CA를 신뢰하세요.
curl --cacert: 사용자 정의 CA 인증서 사용
- 기능
--cacert플래그는 시스템의 기본 신뢰 저장소 대신 PEM 형식의 특정 CA(인증 기관) 번들 파일에 대해 서버의 SSL 인증서를 검증하도록 curl에게 지시합니다.- 사용 시기
- 서버가 시스템 신뢰 저장소에 없는 사설 또는 내부 CA가 서명한 인증서를 사용할 때 사용하세요. 기업 환경, Kubernetes 클러스터, 내부 PKI가 있는 Docker 설정에서 일반적입니다.
$ curl --cacert /path/to/corporate-ca.pem https://internal-api.example.com/datacurl --cert: 클라이언트 인증서 (상호 TLS)
- 기능
--cert플래그는 상호 TLS(mTLS)를 위한 클라이언트 측 인증서를 제공합니다. mTLS에서는 서버와 클라이언트 모두 서로의 신원을 확인하기 위해 인증서를 제시합니다. 인증서 파일은 PEM 또는 PKCS#12 형식이어야 합니다.- 사용 시기
- 서버가 클라이언트 인증서 인증을 요구할 때 필요합니다 — 은행 API, 정부 서비스, IoT 디바이스 통신, 제로 트러스트 아키텍처에서 일반적입니다. 키가 인증서 파일에 내장되어 있지 않는 한 항상
--key와 함께 사용하세요.
$ curl --cert client.pem --key client-key.pem https://mtls-api.example.com/securecurl --key: 클라이언트 인증서 개인 키
- 기능
--key플래그는--cert로 제공된 클라이언트 인증서와 쌍을 이루는 개인 키 파일을 지정합니다. 키는 인증서와 일치해야 합니다. 키가 비밀번호로 보호된 경우 curl이 암호를 묻습니다(또는--pass를 사용).- 사용 시기
- 항상
--cert와 함께 사용하세요. 개인 키가 이미 인증서 파일에 내장되어 있다면(PKCS#12 / .p12 파일에서 일반적)--key를 생략할 수 있습니다.
$ curl --cert client.pem --key client-key.pem --cacert server-ca.pem https://api.example.com/securecurl --tlsv1.2: TLS 1.2 최소 강제
- 기능
--tlsv1.2플래그는 SSL/TLS 핸드셰이크의 최소 허용 버전으로 TLS 1.2를 사용하도록 curl에 강제합니다. 이전 프로토콜(TLS 1.0, 1.1, SSLv3)은 거부됩니다.- 사용 시기
- 최소 보안 표준을 강제하기 위해 사용하세요. TLS 1.2는 PCI-DSS 준수에 필요하며 모든 최신 서버에서 지원됩니다. 대부분의 최신 curl 빌드는 이미 기본적으로 TLS 1.2+를 사용하지만, 이 플래그로 명시적으로 설정할 수 있습니다.
$ curl --tlsv1.2 -v https://secure.example.com/api 2>&1 | grep 'SSL connection'curl --tlsv1.3: TLS 1.3 최소 강제
- 기능
--tlsv1.3플래그는 가장 빠르고 안전한 TLS 버전인 TLS 1.3을 사용하도록 curl에 강제합니다. TLS 1.3은 핸드셰이크에서 추가 왕복을 제거하고(0-RTT 지원) 모든 구식 암호 모음을 제거합니다.- 사용 시기
- 서버가 TLS 1.3을 지원하고 최고의 성능과 보안을 원할 때 사용하세요. 참고: TLS 1.3은 OpenSSL 1.1.1+ 또는 호환 가능한 TLS 라이브러리가 필요합니다. 아직 모든 서버가 지원하는 것은 아닙니다.
$ curl --tlsv1.3 https://modern-api.example.com/data추가 SSL/TLS 옵션
연결에 SSL/TLS 요구 (사용 불가 시 실패)
연결에 사용할 SSL 암호 지정
클라이언트 인증서 유형 지정 (PEM, DER, ENG, P12)
서버 공개 키 고정 및 검증 (HPKP 스타일)
curl -x: HTTP/HTTPS 프록시 사용
- 기능
-x(또는--proxy) 플래그는 지정된 프록시 서버를 통해 모든 curl 트래픽을 라우팅합니다. 형식은[protocol://]host[:port]입니다. 지원되는 프록시 프로토콜: HTTP, HTTPS, SOCKS4, SOCKS5.- 사용 시기
- 기업 프록시 서버, Fiddler, Charles, mitmproxy 같은 도구를 사용한 디버깅, 지리적 제한 테스트, 또는 직접 인터넷 접근이 불가능한 경우에 사용하세요.
http_proxy/https_proxy환경 변수를 대신 설정할 수도 있습니다.
$ curl -x http://proxy.example.com:8080 https://api.example.com/datacurl --socks5: SOCKS5 프록시 사용
- 기능
--socks5플래그는 TCP 연결에 SOCKS5 프록시를 사용하도록 curl에게 지시합니다. HTTP 프록시와 달리 SOCKS5는 TCP 수준에서 작동하며 HTTP뿐 아니라 모든 프로토콜을 처리할 수 있습니다. DNS 해석은 기본적으로 로컬에서 수행됩니다; 프록시를 통해 DNS를 해석하려면--socks5-hostname을 사용하세요.- 사용 시기
- SSH 터널(
ssh -D), Tor 네트워크 접근, 또는 프록시가 비 HTTP 프로토콜을 처리해야 할 때 사용하세요. SOCKS5는 UDP를 지원하고 선택적으로 DNS를 처리할 수 있어 HTTP 프록시보다 더 유연합니다.
$ curl --socks5 localhost:1080 https://api.example.com/datacurl --proxy-user: 프록시 인증
- 기능
--proxy-user(또는-U) 플래그는 프록시 서버에 인증 자격 증명을 보냅니다. 형식은user:password입니다. 이는 서버 인증(-u)과 별개입니다.- 사용 시기
- 프록시 서버가 인증을 요구할 때 필요합니다 — 기업 및 엔터프라이즈 네트워크 환경에서 일반적입니다. 자격 증명은 대상 서버가 아닌 프록시로 전송됩니다.
$ curl -x http://proxy.corp.com:3128 -U user:pass https://external-api.com/datacurl --noproxy: 특정 호스트에 대해 프록시 우회
- 기능
--noproxy플래그는 프록시를 우회하고 직접 연결해야 하는 호스트, 도메인 또는 IP 주소의 쉼표로 구분된 목록을 지정합니다. 와일드카드 지원:*.example.com은 모든 하위 도메인과 일치합니다.- 사용 시기
- localhost, 내부 서비스 또는 특정 도메인을 프록시에서 제외하기 위해 사용하세요. 환경 변수를 통해 프록시가 전역적으로 설정되어 있지만 일부 호스트(로컬 서비스 등)는 직접 접근이 필요할 때 중요합니다. 모든 호스트에 대해 프록시를 우회하려면
*를 사용하세요.
$ curl -x http://proxy:8080 --noproxy "localhost,127.0.0.1,*.internal.com" https://localhost:3000/api추가 프록시 옵션
프록시를 통한 DNS 해석을 사용하는 SOCKS5 프록시
HTTPS 프록시 자체를 검증하기 위한 CA 인증서
curl --resolve: 사용자 정의 DNS 해석
- 기능
--resolve플래그는 특정host:port쌍에 대해 사용자 정의 IP 주소를 제공하여 DNS 조회를 완전히 우회합니다. 형식은host:port:address입니다. 여러 개의--resolve항목을 제공할 수 있습니다.- 사용 시기
- DNS 전파 전 테스트, 로드 밸런서 뒤의 특정 백엔드 확인, 또는 SSL 인증서 검증을 위해 실제 호스트 이름이 필요한 로컬 개발에 필수적입니다.
/etc/hosts편집과 달리 이것은 요청별이고 포트별입니다.
$ curl --resolve api.example.com:443:127.0.0.1 https://api.example.com/healthcurl --connect-to: 다른 호스트로 연결 리다이렉트
- 기능
--connect-to플래그는 HTTP 요청(Host헤더와 SNI 포함)에 대해 원래 URL을 유지하면서 TCP 연결을 다른host:port쌍으로 리다이렉트합니다. 형식:HOST1:PORT1:HOST2:PORT2.- 사용 시기
- DNS나
/etc/hosts를 수정하지 않고 로드 밸런서 뒤의 특정 백엔드 서버를 테스트하기 위해 사용하세요.--resolve와 달리 이것은 host:port를 host:port에 매핑하며(IP가 아닌), 대상도 호스트 이름을 가질 때 유용합니다.
$ curl --connect-to api.example.com:443:backend1.internal:8443 https://api.example.com/health추가 네트워크 옵션
연결의 로컬 포트 번호 또는 범위 설정
특정 네트워크 인터페이스에 연결 바인딩
시스템 기본값 대신 사용자 정의 DNS 서버 사용 (c-ares)
실제 SSL & 프록시 시나리오
이 예제들은 개발, CI/CD, 프로덕션 환경에서 일반적인 보안 및 네트워킹 작업을 처리하기 위해 여러 플래그를 결합합니다.
로컬호스트에서 HTTPS 테스트
자체 서명 인증서로 로컬 개발할 때 --resolve를 --cacert(또는 빠른 테스트를 위해 -k)와 결합하세요. hosts 파일을 수정하지 않고 적절한 SSL/SNI를 위한 실제 호스트 이름을 사용할 수 있습니다.
$ curl --resolve myapp.local:443:127.0.0.1 --cacert local-ca.pem https://myapp.local/api/status상호 TLS (클라이언트 인증서 인증)
일부 API는 서버와 클라이언트 모두 인증서를 제시할 것을 요구합니다. 완전히 검증된 양방향 TLS 연결을 설정하기 위해 --cert, --key, --cacert를 제공하세요.
$ curl --cert client.pem --key client-key.pem --cacert server-ca.pem https://mtls-api.example.com/data인증을 사용한 기업 프록시
필수 프록시 서버가 있는 기업 네트워크에서 프록시 자격 증명을 위해 -x를 -U와 결합하세요. 내부 서비스를 프록시에서 제외하기 위해 --noproxy를 추가하세요.
$ curl -x http://proxy.corp.com:3128 -U user:pass --noproxy "*.internal.corp" https://external-api.com/data내부 CA를 사용하는 Docker 컨테이너
Docker의 서비스가 내부 CA의 인증서를 사용할 때, CA 인증서를 컨테이너에 마운트하고 --cacert로 참조하세요. 인증서 체인을 여전히 검증하므로 -k보다 안전합니다.
$ curl --cacert /etc/ssl/certs/internal-ca.crt https://service.docker.internal:8443/healthSSH 터널을 통한 SOCKS5 프록시
ssh -D로 SOCKS5 프록시를 생성하고 --socks5를 사용하여 curl 트래픽을 라우팅하세요. 배스천 호스트를 통해 내부 서비스에 접근하는 데 유용합니다.
$ curl --socks5 localhost:1080 https://internal-api.example.com/statuscurl SSL & 프록시에 대한 자주 묻는 질문
curl에서 SSL 인증서 검증을 건너뛰려면 어떻게 하나요?
curl -k URL 또는 curl --insecure URL을 사용하세요. 모든 인증서 검사 — 만료, 호스트 이름 불일치, 신뢰할 수 없는 CA를 비활성화합니다. 로컬 개발에서만 사용하세요. 프로덕션에서는 실제 CA 인증서와 함께 --cacert를 사용하세요.
curl에서 자체 서명 인증서를 신뢰하게 하려면 어떻게 하나요?
curl --cacert /path/to/ca.pem URL을 사용하여 자체 서명 인증서에 서명한 CA 인증서를 지정하세요. 인증서 체인을 여전히 검증하므로 -k보다 안전합니다 — 특정 CA만 신뢰합니다.
curl이 사용하는 TLS 버전을 확인하려면 어떻게 하나요?
curl -v URL을 실행하고 상세 출력에서 * SSL connection using TLSv1.x / CipherSuite 라인을 찾으세요. 특정 버전을 강제하려면 --tlsv1.2 또는 --tlsv1.3을 사용하세요.
상호 TLS(mTLS)란 무엇이며 curl에서 어떻게 사용하나요?
상호 TLS는 서버와 클라이언트 모두 인증서를 제시해야 합니다. 사용법: curl --cert client.pem --key client-key.pem --cacert server-ca.pem URL. --cert/--key 쌍은 클라이언트를 인증하고, --cacert는 서버를 검증합니다.
curl에서 HTTP 프록시를 사용하려면 어떻게 하나요?
curl -x http://proxy:port URL을 사용하세요. HTTPS 프록시의 경우: curl -x https://proxy:port URL. 또는 http_proxy 및 https_proxy 환경 변수를 설정하세요 — curl이 자동으로 감지합니다.
curl에서 SOCKS5 프록시를 사용하려면 어떻게 하나요?
로컬 DNS 해석의 경우 curl --socks5 host:port URL을 사용하거나, 프록시를 통한 DNS 해석(개인정보 보호/Tor에 중요)을 위해 curl --socks5-hostname host:port URL을 사용하세요. SSH 터널 예: ssh -D 1080 user@bastion, 그 후 curl --socks5 localhost:1080 URL.
curl에서 프록시 서버에 인증하려면 어떻게 하나요?
curl -x http://proxy:port -U user:password URL을 사용하세요. -U (또는 --proxy-user) 플래그는 프록시에 자격 증명을 보냅니다. 이는 대상 서버에 인증하는 -u와 별개입니다.
curl에서 특정 호스트를 프록시에서 제외하려면 어떻게 하나요?
--noproxy "localhost,127.0.0.1,*.internal.com"을 사용하거나 NO_PROXY 환경 변수를 설정하세요. 와일드카드 지원(*.example.com). 단일 요청에 대해 프록시를 완전히 우회하려면 --noproxy "*"를 사용하세요.
curl에서 로컬호스트의 HTTPS를 테스트하려면 어떻게 하나요?
빠른 테스트: curl -k https://localhost:8443/. 적절한 검증: curl --resolve myapp.local:443:127.0.0.1 --cacert local-ca.pem https://myapp.local/. --resolve 방식은 인증서 호스트 이름이 올바르게 일치하도록 합니다.
curl에서 특정 호스트에 대한 DNS 해석을 재정의하려면 어떻게 하나요?
curl --resolve host:port:IP URL을 사용하세요. 예: curl --resolve api.example.com:443:192.168.1.100 https://api.example.com/. 해당 host:port 쌍에 대해서만 DNS를 우회합니다 — /etc/hosts를 편집할 필요 없습니다.
curl에서 'SSL certificate problem: certificate has expired' 오류를 해결하려면 어떻게 하나요?
서버 인증서가 만료되었습니다. 해결 방법: (1) 서버에서 인증서를 갱신, (2) CA 번들을 업데이트: curl --cacert /path/to/updated-ca.pem URL, (3) 테스트 전용: curl -k URL. 만료 확인: curl -v URL 2>&1 | grep expire.
프로덕션에서 curl --insecure (-k)를 사용해도 안전한가요?
아니요. -k 플래그는 모든 인증서 검증 — 만료, 호스트 이름, 신뢰 체인을 비활성화합니다. 이는 연결을 중간자 공격에 취약하게 만듭니다. 프로덕션 및 CI/CD 파이프라인에서는 항상 특정 CA 인증서와 함께 --cacert를 사용하세요.