curl SSL, TLS & 프록시 설정 가이드

curl에서 HTTPS 인증서, TLS 버전, 프록시 및 사용자 정의 DNS 해석을 구성하는 것은 안전한 API 통신, CI/CD 파이프라인, 네트워크 문제 디버깅에 필수적입니다. 이 가이드는 로컬 개발을 위해 -k로 인증서 검사를 비활성화하는 것부터 --cert로 상호 TLS를 설정하고 SOCKS5 프록시를 통해 트래픽을 라우팅하는 것까지 모든 SSL, TLS, 프록시, 네트워크 플래그를 다룹니다. 각 옵션에는 명확한 설명, 보안 고려사항, 바로 복사할 수 있는 예제가 포함되어 있습니다.

SSL & 프록시 플래그 빠른 참조

-kSSL/TLS

안전하지 않은 연결 허용 — 모든 SSL 검증 건너뛰기

--cacertSSL/TLS

특정 CA 번들에 대해 서버 인증서 검증

--certSSL/TLS

상호 TLS 인증을 위한 클라이언트 인증서 제공

--keySSL/TLS

클라이언트 인증서의 개인 키 파일 제공

--tlsv1.2SSL/TLS

연결에 TLS 버전 1.2 이상 사용

--tlsv1.3SSL/TLS

연결에 TLS 버전 1.3 이상 사용

--ssl-reqdSSL/TLS

연결에 SSL/TLS 요구 (사용 불가 시 실패)

--ciphersSSL/TLS

연결에 사용할 SSL 암호 지정

--cert-typeSSL/TLS

클라이언트 인증서 유형 지정 (PEM, DER, ENG, P12)

--pinnedpubkeySSL/TLS

서버 공개 키 고정 및 검증 (HPKP 스타일)

-x프록시

지정된 프록시 서버를 통해 모든 트래픽 라우팅

--socks5프록시

SOCKS5 프록시를 통해 연결 라우팅

--proxy-user프록시

프록시 서버의 사용자명:비밀번호 제공

--noproxy프록시

프록시를 거치지 않아야 할 호스트 목록

--socks5-hostname프록시

프록시를 통한 DNS 해석을 사용하는 SOCKS5 프록시

--proxy-cacert프록시

HTTPS 프록시 자체를 검증하기 위한 CA 인증서

--resolve네트워크

특정 host:port 쌍을 사용자 정의 IP 주소에 매핑

--connect-to네트워크

URL이 지정하는 것과 다른 host:port에 연결

--local-port네트워크

연결의 로컬 포트 번호 또는 범위 설정

--interface네트워크

특정 네트워크 인터페이스에 연결 바인딩

--dns-servers네트워크

시스템 기본값 대신 사용자 정의 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/data

curl --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/secure

curl --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/secure

curl --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-reqd

연결에 SSL/TLS 요구 (사용 불가 시 실패)

--ciphers

연결에 사용할 SSL 암호 지정

--cert-type

클라이언트 인증서 유형 지정 (PEM, DER, ENG, P12)

--pinnedpubkey

서버 공개 키 고정 및 검증 (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/data

curl --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/data

curl --proxy-user: 프록시 인증

기능
--proxy-user (또는 -U) 플래그는 프록시 서버에 인증 자격 증명을 보냅니다. 형식은 user:password입니다. 이는 서버 인증(-u)과 별개입니다.
사용 시기
프록시 서버가 인증을 요구할 때 필요합니다 — 기업 및 엔터프라이즈 네트워크 환경에서 일반적입니다. 자격 증명은 대상 서버가 아닌 프록시로 전송됩니다.
$ curl -x http://proxy.corp.com:3128 -U user:pass https://external-api.com/data

curl --noproxy: 특정 호스트에 대해 프록시 우회

기능
--noproxy 플래그는 프록시를 우회하고 직접 연결해야 하는 호스트, 도메인 또는 IP 주소의 쉼표로 구분된 목록을 지정합니다. 와일드카드 지원: *.example.com은 모든 하위 도메인과 일치합니다.
사용 시기
localhost, 내부 서비스 또는 특정 도메인을 프록시에서 제외하기 위해 사용하세요. 환경 변수를 통해 프록시가 전역적으로 설정되어 있지만 일부 호스트(로컬 서비스 등)는 직접 접근이 필요할 때 중요합니다. 모든 호스트에 대해 프록시를 우회하려면 *를 사용하세요.
$ curl -x http://proxy:8080 --noproxy "localhost,127.0.0.1,*.internal.com" https://localhost:3000/api

추가 프록시 옵션

--socks5-hostname

프록시를 통한 DNS 해석을 사용하는 SOCKS5 프록시

--proxy-cacert

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/health

curl --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

추가 네트워크 옵션

--local-port

연결의 로컬 포트 번호 또는 범위 설정

--interface

특정 네트워크 인터페이스에 연결 바인딩

--dns-servers

시스템 기본값 대신 사용자 정의 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/health

SSH 터널을 통한 SOCKS5 프록시

ssh -D로 SOCKS5 프록시를 생성하고 --socks5를 사용하여 curl 트래픽을 라우팅하세요. 배스천 호스트를 통해 내부 서비스에 접근하는 데 유용합니다.

$ curl --socks5 localhost:1080 https://internal-api.example.com/status

curl 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_proxyhttps_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를 사용하세요.