인터넷은 점점 더 빠르고 안전한 방향으로 진화하고 있습니다. HTTP/3와 QUIC는 이러한 변화를 이끄는 최신 웹 프로토콜로, 더 빠른 데이터 전송과 안정적인 연결을 제공합니다. 이를 활용하려면 curl
같은 도구에 HTTP/3 지원을 추가하는 것이 필수적입니다. 이번 글에서는 Ubuntu 24.04 환경에서 curl
을 HTTP/3와 QUIC 지원으로 컴파일하는 방법을 단계별로 소개합니다. 기본적인 터미널 명령어만 알면 누구나 따라 할 수 있으니, 최신 기술을 직접 경험해 보고 싶다면 지금 시작해 보세요!
curl이란?
curl
은 다양한 네트워크 프로토콜을 통해 데이터를 주고받을 수 있는 강력한 명령줄 도구입니다. HTTP, FTP, SMTP 등 수십 가지 프로토콜을 지원하며, 웹 개발자, 시스템 관리자, 테스트 엔지니어들이 API 호출, 파일 다운로드, 웹사이트 테스트 등에 자주 사용합니다. 기본 설치로는 HTTP/1.1과 HTTP/2를 지원하지만, 이번 가이드에서는 최신 HTTP/3와 QUIC 기능을 활성화하는 방법을 다룹니다.
우분투 24.04 초기 설치 후 curl 버전 확인
→ http3가 없으면 진행.
curl -V
http3가 없는것을 확인.
curl 8.5.0 (x86_64-pc-linux-gnu) libcurl/8.5.0 OpenSSL/3.0.13 zlib/1.3 brotli/1.1.0 zstd/1.5.5 libidn2/2.3.7 libpsl/0.21.2 (+libidn2/2.3.7) libssh/0.10.6/openssl/zlib nghttp2/1.59.0 librtmp/2.3 OpenLDAP/2.6.7
Release-Date: 2023-12-06, security patched: 8.5.0-2ubuntu10.6
Protocols: dict file ftp ftps gopher gophers http https imap imaps ldap ldaps mqtt pop3 pop3s rtmp rtsp scp sftp smb smbs smtp smtps telnet tftp
Features: alt-svc AsynchDNS brotli GSS-API HSTS HTTP2 HTTPS-proxy IDN IPv6 Kerberos Largefile libz NTLM PSL SPNEGO SSL threadsafe TLS-SRP UnixSockets zstd
STEP #1 시스템 업데이트
apt update && apt upgrade -y
STEP #2 의존성 설치
apt install -y build-essential git curl libssl-dev libnghttp2-dev libbrotli-dev python3 python3-pip cmake autoconf libtool automake libpsl-dev
각 의존성 패키지에 대한 간략한 소개
build-essential:
- 컴파일에 필요한 기본 도구 모음(GCC, make, libc-dev 등).
- 소스 코드를 빌드할 때 필수.
git:
- 버전 관리 시스템.
- GitHub에서 curl과 quiche 소스를 다운로드하는 데 사용.
curl:
- 명령줄 데이터 전송 도구.
- 설치 과정에서 자체 테스트나 확인에 유용할 수 있음.
libssl-dev:
- OpenSSL 개발 라이브러리.
- TLS/SSL 지원에 필요 (BoringSSL 대체로 사용되지만 호환성 유지를 위해 설치).
libnghttp2-dev:
- HTTP/2 프로토콜 라이브러리 개발 파일.
- HTTP/3와 직접 관련은 없지만, 일부 의존성에서 사용 가능.
libbrotli-dev:
- Brotli 압축 라이브러리 개발 파일.
- HTTP 압축 지원에 필요.
python3:
- 파이썬 3 인터프리터.
- 빌드 스크립트나 도구 실행에 사용.
python3-pip:
- 파이썬 패키지 관리자.
- 추가 파이썬 모듈 설치에 필요할 수 있음.
cmake:
- 크로스 플랫폼 빌드 시스템.
- quiche나 BoringSSL 빌드에 사용 가능.
autoconf:
- configure 스크립트 생성 도구.
- 소스 빌드 시 자동 설정 파일 생성에 필요 (중복 설치됨).
libtool:
- 라이브러리 빌드 및 링크 도구.
- autoreconf와 함께 동작해 공유 라이브러리 처리.
automake:
- Makefile 자동 생성 도구.
- autoconf와 함께 사용해 빌드 환경 설정.
libpsl-dev:
- curl의 도메인 처리 기능에 필요.
- Public Suffix List 라이브러리 개발 파일.
패키지 기능별로 구분
카테고리 | 패키지 | 설명 |
---|---|---|
빌드 도구 | build-essential | 컴파일러(GCC)와 기본 빌드 도구(make, libc-dev 등) 모음. |
cmake | 크로스 플랫폼 빌드 시스템, 복잡한 프로젝트 빌드 관리. | |
소스 관리 및 네트워크 | git | GitHub에서 소스 코드 다운로드 및 버전 관리. |
curl | 명령줄 데이터 전송 도구, 설치 과정에서 자체 테스트에 유용. | |
HTTP 관련 라이브러리 | libnghttp2-dev | HTTP/2 지원 라이브러리, HTTP/3와 직접 관련 없으나 호환성 유지에 필요. |
libbrotli-dev | Brotli 압축 지원, HTTP 데이터 압축에 사용. | |
libpsl-dev | Public Suffix List 처리, curl의 도메인 파싱 기능에 필요. | |
암호화 및 TLS | libssl-dev | OpenSSL 개발 파일, TLS/SSL 지원 (BoringSSL 대체로 사용되지만 호환성 유지를 위해 설치). |
자동화 도구 | autoconf | configure 스크립트 생성, 소스 빌드 환경 자동화 (중복 설치됨). |
automake | Makefile 생성, autoconf와 함께 빌드 환경 설정. | |
libtool | 공유 라이브러리 빌드 및 링크 도구, autoreconf와 함께 사용. | |
파이썬 환경 | python3 | 파이썬 3 인터프리터, 빌드 스크립트 실행에 필요. |
python3-pip | 파이썬 패키지 관리자, 추가 모듈 설치 지원. |
STEP #3 Cloudflare Quiche 설치
Quiche란?
“Quiche”는 Cloudflare에서 개발한 오픈소스 라이브러리로, QUIC 프로토콜과 HTTP/3를 구현합니다. QUIC는 기존 TCP를 대체하는 UDP 기반의 전송 프로토콜로, 더 빠르고 안정적인 네트워크 연결을 제공합니다. HTTP/3는 이를 기반으로 한 최신 웹 프로토콜입니다. curl을 HTTP/3 지원으로 컴파일할 때, Quiche는 QUIC 계층을 처리하며 BoringSSL과 함께 TLS 암호화를 제공합니다.
Quiche를 GitHub에서 클론
cd /usr/local/src
git clone --recursive https://github.com/cloudflare/quiche
Quiche 0.23.2는 최소 1.80.0 이상의 버전을 요구합니다. 따라서 Rust를 최신 버전으로 업데이트해야 빌드가 가능
Rustup 설치
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
별도로 설치경로를 지정하지 않을경우 ‘엔터’를 눌러 진행.
root@663bbb4a90826:/usr/local/src# curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
info: downloading installer
Welcome to Rust!
This will download and install the official compiler for the Rust
programming language, and its package manager, Cargo.
Rustup metadata and toolchains will be installed into the Rustup
home directory, located at:
/root/.rustup
This can be modified with the RUSTUP_HOME environment variable.
The Cargo home directory is located at:
/root/.cargo
This can be modified with the CARGO_HOME environment variable.
The cargo, rustc, rustup and other commands will be added to
Cargo's bin directory, located at:
/root/.cargo/bin
This path will then be added to your PATH environment variable by
modifying the profile files located at:
/root/.profile
/root/.bashrc
You can uninstall at any time with rustup self uninstall and
these changes will be reverted.
Current installation options:
default host triple: x86_64-unknown-linux-gnu
default toolchain: stable (default)
profile: default
modify PATH variable: yes
1) Proceed with standard installation (default - just press enter)
2) Customize installation
3) Cancel installation
설치 후 환경 변수를 적용
source $HOME/.cargo/env
Rust 업데이트
rustup update
Rust 업데이트 후 버전을 확인
rustc --version
Rust 버전 출력예시
rustc 1.85.0 (4d91de4e4 2025-02-17)
참고 : 만약 quiche가 정확히 1.80을 요구한다면, 해당 버전을 설치할 수도 있습니다.
rustup install 1.80.0
rustup default 1.80.0
Rust로 빌드
cd /usr/local/src/quiche
cargo build --package quiche --release --features ffi,pkg-config-meta,qlog
빌드 과정 예시 :
root@663bbb4a90826:/usr/local/src/quiche# cargo build --package quiche --release --features ffi,pkg-config-meta,qlog
Updating crates.io index
Locking 302 packages to latest compatible versions
Adding clap v3.2.25 (available: v4.5.31)
Adding env_logger v0.10.2 (available: v0.11.6)
Adding inquire v0.6.2 (available: v0.7.5)
Adding ipnetwork v0.20.0 (available: v0.21.1)
Adding mio v0.8.11 (available: v1.0.3)
Adding nix v0.26.4 (available: v0.29.0)
Adding rand v0.8.5 (available: v0.9.0)
Adding sfv v0.9.4 (available: v0.10.4)
Adding thiserror v1.0.69 (available: v2.0.12)
Downloaded autocfg v1.4.0
Downloaded equivalent v1.0.2
Downloaded either v1.14.0
Downloaded deranged v0.3.11
Downloaded fnv v1.0.7
Downloaded darling v0.20.10
Downloaded darling_macro v0.20.10
Downloaded cdylib-link-lines v0.1.5
..............( 생략 )
Compiling intrusive-collections v0.9.7
Building [======================> ] 46/53: quiche(build)
빌드 완료 메세지
Finished `release` profile [optimized + debuginfo] target(s) in 2m 24s
중요 : 아래 세 명령은 Quiche 빌드 후 생성된 라이브러리(libquiche.so, libcrypto.a, libssl.a)를 curl이 인식할 수 있는 형태와 경로로 준비하는 과정입니다.
① Quiche 빌드 과정에서 생성된 libquiche.so 파일에 libquiche.so.0이라는 이름의 simbolic link(심볼릭 링크)를 만듭니다.
ln -s libquiche.so target/release/libquiche.so.0
② Quiche는 BoringSSL(BoringSSL은 Google의 OpenSSL 포크)을 의존성으로 포함하고 있으며, curl이 BoringSSL의 라이브러리(libcrypto.a, libssl.a)를 찾을 수 있도록 이 디렉토리를 준비합니다
mkdir quiche/deps/boringssl/src/lib
③ Quiche 빌드 결과물에서 libcrypto.a와 libssl.a 파일을 찾아 quiche/deps/boringssl/src/lib/ 폴더에 강제로 심볼릭 링크를 생성
ln -vnf $(find target/release -name libcrypto.a -o -name libssl.a) quiche/deps/boringssl/src/lib/
STEP #4 cURL 컴파일
curl 소스를 다운로드하고, quiche와 BoringSSL을 사용해 HTTP/3 지원으로 빌드
cd /usr/local/src
git clone https://github.com/curl/curl
cd curl
autoreconf -fi
./configure LDFLAGS="-Wl,-rpath,$PWD/../quiche/target/release" \
--with-openssl=$PWD/../quiche/quiche/deps/boringssl/src \
--with-quiche=$PWD/../quiche/target/release
make
make install
ldconfig
설치확인
curl --version | grep HTTP3
버전 기능에 ‘http3’ 가 보입니다.!
Features: alt-svc AsynchDNS HSTS HTTP3 HTTPS-proxy IPv6 Largefile libz NTLM PSL SSL threadsafe UnixSockets
STEP #5 HTTP/3 사이트 테스트
curl -I --http3 https://techplay.blog
HTTP/3 200
마치며…
수많은 빌드 방법을 시도한 끝에 성공적인 결과를 얻었습니다. 이 설치 과정은 여러 번의 반복을 통해 완벽히 작동하는 것으로 확인되었지만, 경험에 의존한 부분이 많아 주의가 필요한 작업이기도 합니다. 작은 단계 하나라도 놓치거나 버전 차이로 인해 빌드나 컴파일 과정에서 오류가 발생할 수 있으니, 신경 써서 진행해야 합니다. 만약 문제가 생기면 아래 댓글로 알려주세요!