프라이버시 프록시 디버깅, 왜 이렇게 어려웠나?
Oblivious HTTP(OHTTP)는 사용자의 요청 정보와 대상 정보를 분리하여 프라이버시를 보장하는 프로토콜입니다. 하지만 이 프로토콜을 실제로 디버깅하는 과정은 매우 복잡합니다. 요청이 릴레이(Relay), 게이트웨이(Gateway), 타겟(Target)을 거치는 동안 여러 단계의 암호화와 복호화가 발생하고, 각 단계마다 잠재적인 실패 지점이 존재하기 때문입니다.
Cloudflare의 프라이버시 팀은 Apple Private Relay, Microsoft Edge Secure Network VPN 등 대규모 서비스에 OHTTP를 운영하면서 디버깅의 어려움을 겪었습니다. 특히 다음과 같은 문제들이 반복적으로 발생했습니다.
- 커스텀 클라이언트 필요: 고객사마다 특정 배포 환경을 테스트하기 위해 일회성 스크립트를 작성해야 했습니다.
- 근본 원인 파악 어려움: 문제가 발생했을 때, 우리 시스템의 버그인지 고객 시스템의 버그인지 파악하는 데 많은 시간이 소요되었습니다.
- 바이너리 데이터 분석의 어려움: OHTTP는 바이너리 HTTP(BHTTP)를 기반으로 하는데, 이 데이터를 직접 분석하는 것은 매우 번거롭고 휴먼 에러가 발생하기 쉬웠습니다.
이러한 문제를 해결하기 위해 Cloudflare는 모든 프라이버시 프로토콜을 하나의 도구로 통합하고, 직관적인 인터페이스를 제공하며, 각 프로토콜 단계를 순서대로 보여주는 CLI 도구를 개발하게 되었습니다. 그것이 바로 pvcli입니다.

pvcli: 한 줄로 끝나는 OHTTP 디버깅
pvcli는 curl에서 많은 영감을 받아 설계되었습니다. 따라서 curl을 사용해 본 개발자라면 누구나 쉽게 적응할 수 있습니다. 가장 큰 특징은 복잡한 OHTTP 요청을 단 한 줄의 명령어로 처리할 수 있다는 점입니다.
# OHTTP 요청 실행 예시 (릴레이, 게이트웨이, 타겟 지정)
pvcli -vvv --ohttp \
--first-hop https://relay-cloudflare.ohttp.info \
--proxy https://gateway.ohttp.info \
-X POST \
--header "content-type: application/json" \
--data '{"test":1}' \
https://target.ohttp.info/anything
이 명령어 하나로 OHTTP의 전체 프로세스(공개키 가져오기, 이진 HTTP 인코딩, 암호화, 릴레이 전송, 게이트웨이 복호화 등)가 처리됩니다. -v 옵션을 추가하면 상세한 로그를 확인할 수 있어, 문제가 발생한 단계를 정확히 파악하는 데 도움이 됩니다.
# 더 많은 로그 확인
pvcli -v --http3 https://cloudflare.com/cdn-cgi/trace
# 가장 상세한 로그 확인
pvcli -vvv --http3 https://cloudflare.com/cdn-cgi/trace
또한, 릴레이에 전달할 헤더나 mTLS 인증 설정도 간단하게 지원합니다.
# 릴레이에 전달할 커스텀 헤더 설정
pvcli -vvv --ohttp \
--first-hop https://relay-cloudflare.ohttp.info \
--first-hop-header "authorization: Bearer relay-token" \
--proxy https://gateway.ohttp.info \
-X POST \
--header "content-type: application/json" \
--data '{"test":1}' \
https://target.ohttp.info/anything
# mTLS 인증을 통한 릴레이 접근
pvcli -vvv --ohttp \
--first-hop https://relay-cloudflare.ohttp.info \
--first-hop-client ./relay-client.pem \
--first-hop-key ./relay-client.key \
--proxy https://gateway.ohttp.info \
-X POST \
--header "content-type: application/json" \
--data '{"test":1}' \
https://target.ohttp.info/anything
설치 방법
# Rust 설치 (미설치 시)
curl https://sh.rustup.rs -sSf | sh
# pvcli 설치
cargo install --git https://github.com/cloudflareresearch/pvcli

pvcli의 한계와 주의사항
pvcli는 아직 개발 초기 단계이며, 몇 가지 한계점이 존재합니다.
- 지원 프로토콜 제한: 현재는 OHTTP와 HTTP/3 프록시를 지원하지만, MASQUE와 Privacy Pass는 아직 개발 중입니다.
- 커뮤니티 의존성: 오픈소스 프로젝트이므로, 기능 추가 및 버그 수정 속도는 커뮤니티의 참여에 달려 있습니다.
- Rust 의존성: Rust 환경이 필요하므로, 다른 언어 기반 개발자에게는 진입 장벽이 될 수 있습니다.
또한, pvcli는 디버깅 도구이지, 운영 환경에서 사용하기 위한 프로덕션 클라이언트가 아니라는 점을 명심해야 합니다. 실제 서비스에 OHTTP를 적용할 때는 공식 라이브러리나 SDK를 사용하는 것이 안전합니다.
국내 개발 생태계에서의 적용 맥락
국내에서도 프라이버시 보호에 대한 중요성이 점점 커지면서, OHTTP와 같은 기술에 대한 관심이 높아지고 있습니다. 특히, 금융, 의료, 통신 등 개인정보를 다루는 산업 분야에서 pvcli와 같은 도구를 활용한 프로토콜 검증이 유용할 수 있습니다. 하지만 아직 국내에는 OHTTP를 실제 서비스에 적용한 사례가 많지 않기 때문에, pvcli를 통해 프로토콜을 학습하고 테스트하는 것이 좋은 출발점이 될 수 있습니다.
다음 단계 학습 방향
pvcli를 사용해 보면서 OHTTP의 동작 원리를 이해했다면, 다음 단계로는 직접 OHTTP 서버(릴레이, 게이트웨이)를 구축해 보는 것을 추천합니다. Cloudflare의 ohttp 관련 오픈소스 프로젝트나 RFC 9458 문서를 참고하면 더 깊이 있는 학습이 가능합니다.

결론: 프라이버시 프로토콜 개발의 새로운 기준
Cloudflare가 공개한 pvcli는 단순한 CLI 도구를 넘어, 복잡한 프라이버시 보호 프로토콜의 개발 경험을 혁신적으로 개선한 사례입니다. 바이너리 데이터를 수동으로 파싱하고, 일회성 스크립트를 작성하던 과거와 달리, 이제는 표준화된 도구를 통해 더 빠르고 정확하게 디버깅할 수 있게 되었습니다.
이 프로젝트는 프라이버시 기술이 더 많은 개발자에게 열려야 한다는 Cloudflare의 철학을 잘 보여줍니다. 앞으로 pvcli가 지원하는 프로토콜이 확장되고 커뮤니티가 활성화된다면, 더 많은 서비스에서 안전하고 투명한 프라이버시 보호 기능을 구현하는 데 기여할 것입니다.