
curlは1998年にスウェーデンのダニエル・スティンバーグ(Daniel Stenberg)が公開した、URLでデータを送受信するためのコマンドラインツール兼ライブラリです。名称は「Client for URLs」を縮めたものとされ、HTTPだけでなくFTP・SMTP・LDAP・TFTP・SCPなど数十のプロトコルを扱えます。ライブラリ部分のlibcurlは、世界中のアプリケーション・組み込み機器・OSに組み込まれており、地球上で最も使われているネットワーククライアントの一つに数えられます。本記事ではcurlの基本設計と進化、そしてそれが果たしている役割を整理します。
この記事の目次
- curlを構成する三層
- 個人プロジェクトからInternet基盤へ
- 実務での使われ方
- wget・httpie・Postmanとの位置関係
- まとめ
curlを構成する三層

curlは三層構造で捉えると分かりやすいツールです。最上層がコマンドライン版で、「curl https://example.com」と打てば本文を取りに行き、-Iでヘッダ取得、-X POST -d ...でフォーム送信、-H 'Authorization: Bearer ...'でヘッダ追加、--cacert/--cert/--keyでTLS証明書指定、--http2/--http3でプロトコル選択といった具合に、ありとあらゆるHTTPの動作を引数で制御できます。
中間層が本体のlibcurlで、Cで書かれた共有ライブラリとして提供されます。アプリケーションはlibcurlをリンクするだけで、堅牢なネットワーク機能を手に入れられ、HTTPS、リトライ、リダイレクト追跡、TLS設定、Cookie処理などを標準仕様に従って任せられます。最上層には各言語向けバインディングが用意され、Python/Ruby/PHP/Goなどから利用可能ですが、現代ではOS自体(macOS、Windows 10以降)や、デバイス(テレビ、自動車、ゲーム機)にもlibcurlが組み込まれており、Daniel Stenberg自身の表現を借りれば「世界で100億台規模で動いているソフトウェア」になっています。
個人プロジェクトからInternet基盤へ

curlの起源は、Daniel Stenbergが1996年にIRCボットでドル相場を取得するために書いた「httpget」という小さなツールでした。その後FTP対応を加えて「urlget」、複数プロトコル対応にして「curl」と改称し、1998年3月20日に最初のリリースを公表しています。「Bag of bytes is bag of bytes」という、プロトコルに依らないバイト列を扱う設計思想は最初から一貫しており、HTTP・HTTPS・FTPなどを同じインターフェイスで使えました。
2000年代に入るとlibcurlとして分離され、世界中のアプリケーション・OS・組み込み機器に取り込まれていきます。AppleはmacOSとiOS、MicrosoftはWindows 10、GoogleはAndroid、自動車メーカーは車載システム、家電メーカーはテレビとセットトップボックスに搭載し、Daniel Stenberg氏のもとには企業からの謝意と寄付が集まる構造になっています。HTTP/2への対応は2014年、HTTP/3とQUICへの対応は2019年から段階的に進められており、Internet標準が動くたびにcurlも追従しているのが特徴です。
実務での使われ方

実務で最もよく見るcurlの使い方は、シェルスクリプトやCI/CDからのAPI呼び出しです。「curl -X POST -H 'Content-Type: application/json' -d '{"..."}' https://api.example.com/...」というワンライナーは、ほぼあらゆる自動化ジョブのどこかに登場します。Dockerfileでもパッケージのダウンロードやスクリプトの取得にcurlが使われ、GitHub Actions・GitLab CI・Argo Workflowsといったジョブの中でも、外部Webhookやデプロイ通知の発火手段としてほぼ標準です。
障害対応では-Iや-vが頼りになり、TLSバージョン、提示された証明書、応答ヘッダ、リダイレクト先などを生の形で確認できます。「curl -v https://example.com/ 2>&1 | grep -E 'subject|issuer|verify'」のような呪文で証明書の検証経路を追ったり、「curl --http2 -I」「curl --http3 -I」でプロトコル切替の挙動を比較したりと、Webサーバー・ロードバランサー・CDNを横断するトラブルの切り分けに常用されます。tcpdumpと組み合わせれば、アプリ視点とネットワーク視点を同時に見ながら原因を絞り込める強力な組み合わせになります。
wget・httpie・Postmanとの位置関係

wgetとの違いはしばしば話題になりますが、要点は二つあります。wgetは「ファイルを取得して保存する」のが主目的で、再帰的ダウンロードやサイトミラーリングが得意。一方curlは「URLでデータを送受信する」を主目的に、入出力の柔軟さやプロトコルの広さで勝ります。ヘッダ操作、Cookie制御、HTTP/3、libcurlとしての組み込み利用など、APIクライアントとして使うならcurlのほうが圧倒的に多用途です。
HTTPieはPython製の対話的なCLIで、JSON前提のリクエストや色付き出力が読みやすく、curlの代替として人気があります。RustベースのxhはHTTPie互換ながら高速で、Apple Silicon上でも軽快に動きます。PostmanやInsomniaのようなGUIクライアントは試行錯誤に強い一方、シェルスクリプトや自動化に組み込みやすいのは依然curlで、「GUIで試したリクエストを最終的にcurlコマンドにコピーしてスクリプト化する」という流れが定番です。30年近くにわたって積み重ねられた教材と互換性は、新興ツールが容易に追いつけない資産になっています。
まとめ
curlは小さな個人プロジェクトから出発し、libcurlとして地球規模のソフトウェア基盤へ育った稀有なオープンソースです。API呼び出し・障害調査・自動化スクリプトのいずれを取っても最初に手が伸びる定番ツールであり、コマンドの引数を一通り覚えておくと、Web開発・運用・組み込み・データ収集と幅広い場面で生涯使い続けられます。
※本記事はIT用語辞典の手書きドラフトです。公開前に最新情報・出典を確認のうえ加筆修正してください。

コメント