Jigsaw(ジグソー)は、W3Cが1996年5月に開発を始めたJava製のWebサーバです。HTTP/1.1の仕様を実装して確かめるための実験台として作られ、最終版は2007年4月10日公開の2.2.6です。この記事では、W3Cの公式文書と配布物をもとにJigsawの設計と版の変遷を整理し、いまも動いているテストページと、Java 25で起動した結果を示します。JavaのProject JigsawやGoogleのJigsawとは別物です。
まとめ:Jigsawの正体と今の扱い
- JigsawはW3Cの公式Webサーバで、W3CのActivity Statementは「HTTP/1.1に完全準拠したモジュール構造の実験プラットフォーム」と位置づけています。開発はINRIAを拠点とする少人数のチームで、Yves Lafonが率いました。
- 最終版は2.2.6(2007年4月10日)です。HTTP/2(2015年)より前に開発が止まっているため、現在の本番サーバの候補にはなりません。
- 設計の核は、URIごとの「リソース」オブジェクトに、プロトコル別の処理を担う「フレーム」と、認証などを差し込む「フィルタ」を付ける構造です。ファイルかCGIかの二択で考える当時のサーバと違い、任意のJavaオブジェクトをHTTPで公開できます。
- 配布物の2.2.6は2026年10月7日時点でも取得でき、md5は配布ページの値と一致しました。取得時はgzipのまま受け取る指定が要ります。
- 2.2.6はJava 25でも起動し、条件付きGETや部分取得などHTTP/1.1の基本動作をそのまま観察できました。既定の管理者はadmin/adminで、TRACEも有効なので、外部に公開する環境では起動しないでください。
- いま実際に使われているのは、サーバ本体よりHTTPクライアントとMIME型のライブラリです。W3CのCSSバリデータは、ビルド時にMaven Centralから
jigsaw-2.2.6.jarを取得しています。
Jigsawの成り立ち:HTTP/1.1検証用のJava製サーバ
W3CのJigsawホームページは、JigsawをW3Cのオープンソースプロジェクトとして紹介し、開始時期を1996年5月としています。役割は「HTTP 1.1のサンプル実装」と、その上に載る各種機能の実験です。
実装者は、W3Cが1999年に出したHTTP/1.1に関するプレスリリースに名前が出ています。Yves Lafon、Benoit Mahé、Anselm Baird-Smithの3名で、通常のサーバとプロキシの両方を実装しました。同じリリースは、JigsawとクライアントライブラリのlibwwwがHTTP/1.1の最初期の実装に数えられ、提案標準RFC 2068の誤りを見つける役割を果たしたと書いています。
Javaを選んだ理由は公式FAQに書かれています。スレッドとガベージコレクションを移植性のある形で使え、サーバの構成を動的に変えられるからです。Javaでは遅いのではという問いに対しては、性能評価でCERNサーバと少なくとも同等だったと答えています。
Activity Statementは、実用のサーバとしてより、研究者が拡張して試せる土台として作る方針を明記しています。読みやすいコード、拡張APIの仕様、利用者向けより開発者向けのマニュアルを重視するという内容です。研究や教育の場でHTTPサーバの内部を読む教材としての価値は、この方針から来ています。
Jigsawの版履歴:1.0alpha1から最終版2.2.6まで
W3Cのリリースノートから、機能が大きく変わった版を抜き出しました。1998年初めまでは、W3C会員向けの版を一般公開の約1か月前に出す運用でした。
| 版 | 公開日 | 主な変更 |
|---|---|---|
| 1.0alpha1 | 1996年5月1日(会員向け) | 最初の版 |
| 1.0alpha5 | 1997年2月13日 | サーブレットAPI対応、ポート80での運用 |
| 2.0alpha1 | 1998年1月31日 | リソースとフレームの新モデル |
| 2.0.0 | 1998年12月24日 | 2.0系の正式版 |
| 2.1.0 | 1999年9月9日 | JDK 1.2が必須に |
| 2.0.5 | 2000年7月5日 | JSP、Servlet 2.2 |
| 2.2.0 | 2001年3月13日 | WebDAV、XML形式の設定保存 |
| 2.2.1 | 2002年4月8日 | TidyPutFilter、jigshell |
| 2.2.2 | 2003年1月8日 | SSL対応 |
| 2.2.5 | 2005年6月8日 | HTTPクライアント部の作り直し |
| 2.2.6 | 2007年4月10日 | 最終版(安定性の修正) |
公開日は2.1.0(1999年9月9日)、2.0.4(2000年1月21日)、2.1.1(2000年3月6日)、2.0.5(2000年7月5日)の順で、2.0系と2.1系が並行していました。これは版番号の決まりによるものです。リリースノートは、真ん中の数字が奇数の版は「不安定」ではなく機能がそろっていない実験版だと説明しています。2.1系で試した機能を2.2.0で安定版に取り込む流れでした。
1.0alpha5のポート80対応は、FAQによるとネイティブコード(SolarisでテストされたlibUnix.so)を使い、-userと-groupで指定した一般ユーザーとして動かす仕組みです。2.2.0のWebDAV対応はActivity Statementでも主要な新機能として挙がっており、同じ版の新機能としてRFC 2616準拠のキャッシュも並んでいます。Digest認証のフィルタは2.0.2、ACLのフィルタは2.0.3で機能一覧に載っています。2.2.1で入ったTidyPutFilterは、PUTで書き込まれたHTMLやXHTMLをHTML Tidyで検証するフィルタです。Tidy自体の使い方はHTML Tidyとは?HTMLの整形・タグ修正の使い方とインストール【5.8.0で実測】で扱っています。
Jigsawの設計:リソース・フレーム・フィルタ・インデクサの関係
W3Cの設計文書(Internal design of Jigsaw 2.0)によると、Jigsawでは配信するURIごとに、内容を生成するJavaオブジェクトが1つ対応します。2.0でこのオブジェクトの持ち方が変わり、プロトコルに依存しない部分と依存する部分が分かれました。
| 部品 | 持つもの | 例 |
|---|---|---|
| リソース | 実体の情報(サイズ、更新日時) | FileResource、DirectoryResource |
| フレーム | 特定プロトコルで配信する処理 | HTTPFrame、CgiFrame |
| フィルタ | 配信前後のリクエスト・応答の加工 | GenericAuthFilter |
| インデクサ | 拡張子やディレクトリ名からリソースを自動生成 | cgi-binにCGI用の設定 |
1.0ではFileResourceなどの基本リソースがHTTPと強く結びついていました。2.0ではリソースを素の情報だけにし、HTTPで配信するための情報はHTTPFrameに移しています。動機はActivity Statementにあり、HTTP/1.1と当時検討中だったHTTP-NGを同じ構成で両方配信し、性能を比べるためでした。フィルタもリソースではなくプロトコルのフレームに付きます。HTTPの認証はHTTPに固有で、ほかのプロトコルでは使えないためです。
リソースの管理は中央のResourceStoreManagerが受け持ちます。リソースへのアクセスはResourceReferenceをロックして行い、ロック中はそのリソースが削除・アンロード・変更されないことが保証されます。設計文書に載っている使い方は次のとおりです。rrの取得は省略された説明用の断片なので、そのままではコンパイルできません。
ResourceReference rr = ...; // コンテナから取得した参照(取得処理は省略)
try {
Resource res = rr.lock();
// ロック中は削除・アンロード・他者による変更が起きない
} catch (InvalidResourceException ex) {
// リソースが削除されていた
} finally {
rr.unlock();
}
メモリから追い出されたリソースは、rr.lock()の時点で読み直されます。リソースの設定はJigXMLというXML形式で保存されます。Apacheのhttpd.confのように人が書く設定ファイルではなく、管理ツールで操作したオブジェクトの状態を書き出したものです。
Jigsawの主な機能:HTTP/1.1・コンテンツネゴシエーション・WebDAV・サーブレット
W3Cの機能一覧と、2.2.6に同梱のANNOUNCEファイルに挙がっている機能を整理します。
| 分類 | 機能 |
|---|---|
| HTTP | HTTP/1.1準拠、1.0/0.9、PUT、ファイルアップロード |
| 交渉 | コンテンツネゴシエーション |
| 認証 | Basic認証、Digest認証、ACL |
| 動的生成 | Servlet 2.2(2.3は一部)、JSP、CGI、SSI |
| 運用 | バーチャルホスト、キャッシュ付きプロキシ、SSL |
| その他 | WebDAV、PICS、ICP、HTTP Extension Framework |
PICSはコンテンツに格付けラベルを付けるW3Cの仕様で、Jigsawはラベルを配るラベルビューローと、文書にラベルを付けて配信する機能の両方を実装していました。ICPはプロキシ同士がキャッシュの有無を問い合わせるプロトコルで、RFC 2186によると、南カリフォルニア大学のPeter Danzigらが研究プロジェクトHarvestの階層キャッシュのために開発したものです。W3C自身の仕様だけでなく、当時のWebで検討されていたプロトコルを広く実装する実験台だったことがわかります。
W3C社内での利用もActivity Statementに書かれています。CSSバリデータはJigsawのサーブレットとして作られ、W3Cサイトの更新にはJigEditによるバージョン管理付きの編集が使われました。2002年5月からはW3Cのメーリングリストアーカイブのサーバにもなっています。同じ時期にW3Cが作った編集ツールには、文書をHTTPのPUTでサーバへ保存するブラウザ兼エディタもあります。経緯はAmayaとは?W3C製Webエディタ兼ブラウザの機能・歴史と開発終了後の扱いで扱っています。
Jigsaw 2.2.6をJava 25で起動する手順
配布物の取得とチェックサムの確認
2.2.6の配布物は、ホームページのリンク先(jigsaw.w3.org/Distrib/)から2026年10月7日時点でも取得できました。中にはJavaのソース、コンパイル済みのjar、ドキュメント、サンプルのサーバルートが入っています。取得には1つ注意があります。サーバはtar.gzをContent-Type: application/x-tarとContent-Encoding: gzipで返すため、curlにAccept-Encodingを付けないと解凍済みのtar(約42MB)が届き、配布ページのmd5と一致しません。
curl -s -H "Accept-Encoding: gzip" -o jigsaw_2.2.6.tar.gz https://jigsaw.w3.org/Distrib/jigsaw_2.2.6.tar.gz
md5 jigsaw_2.2.6.tar.gz # Linuxでは md5sum
# c848e06d7851ca0d243fd8bdef4c7765 なら配布ページの値と一致
このとおり取得した約6.3MBのgzipは、配布ページのmd5(c848e06d7851ca0d243fd8bdef4c7765)と一致しました。一致を確かめてから展開してください。
Installと起動のコマンド
OpenJDK 25.0.4.1(macOS)で、公式のインストール手順のとおりに起動できました。
tar xzf jigsaw_2.2.6.tar.gz
cd Jigsaw/Jigsaw
CP=../classes/jigsaw.jar:../classes/jigadmin.jar:../classes/sax.jar:../classes/xp.jar:../classes/servlet.jar:../classes/xerces.jar:../classes/Tidy.jar:.
java -cp "$CP" Install
java -cp "$CP" org.w3c.jigsaw.Main -root "$(pwd)"
Installが設定ファイルを生成し、Mainの起動で次の2行が出ます。8001番がWebサーバ、8009番が管理サーバです。
JigAdmin[2.2.6]: serving at http://<ホスト名>:8009/
Jigsaw[2.2.6]: serving at http://<ホスト名>:8001/
手元のJigsaw 2.2.6が返すHTTP/1.1の応答
起動したサーバにcurlで送った結果です。応答ヘッダはServer: Jigsaw/2.2.6でした。
| リクエスト | 結果 |
|---|---|
| GET / | 200、Content-LocationがOverview.html |
| If-None-Match(取得したETag) | 304 Not Modified |
| If-Modified-Since(Last-Modified) | 304 Not Modified |
| Range: bytes=0-9 | 206、Content-Range: bytes 0-9/3236 |
| OPTIONS / | Allow: HEAD,GET,OPTIONS,TRACE |
| POST・DELETE(静的ファイル) | 405とAllow |
| TRACE / | 200、Content-Type: message/http |
| HTTP/1.0で接続 | HTTP/1.1で応答、Connection: keep-alive,close |
| GET /servlet/HelloWorld | 200、chunkedでHTMLを返す |
| 存在しないパス | 404 |
条件付きGET、部分取得、405時のAllowヘッダ、HTTP/1.0クライアントへの応答と、HTTP/1.1の基本動作が既定設定のまま観察できます。サーブレットの出力がchunkedになるのは、生成時点で長さが決まらない応答を分割して送るためです。前段に中継を挟まずに直接つなぐので、Connectionやチャンク化のようなホップ間の挙動もJigsaw本体のものとして見られます。各ステータスコードの意味はHTTPステータスコード一覧とcurlエラーコード一覧|違い・確認方法で確認できます。
TRACEが既定で有効な点は、公開サーバなら塞ぐべき設定です。TRACEはリクエストをそのまま返すため、ほかの脆弱性と組み合わせてCookieなどのヘッダを読み取る攻撃(クロスサイトトレーシング)に使われた経緯があります。
管理GUI(JigAdmin)と既定の管理者
8009番の管理サーバは、admin/adminで認証してもGETに501を返しました。FAQによると、管理サーバは素のHTTPではなくHTTPの変種で話すため、ブラウザではなくJigAdminで接続します。JigAdminはSwingのJFrameで作られたGUIの管理ツールで、JDK 1.2以上が必要です。前の章と同じJigsaw/Jigsawディレクトリで、jigadmin.jarを含めたCPを使って起動します。
java -cp "$CP" org.w3c.jigadmin.Main -root "$(pwd)" http://localhost:8009
このコマンドでJigAdminのクラスが読み込まれ、Swingの画面の初期化まで進むことを確認しました(画面の操作そのものは今回試していません)。リソースやフレームの追加、インデクサの設定、属性の変更はこのツールから行います。8001番側の/Admin/はBasic認証(realm=”admin”)で守られた管理用ページで、admin/adminで200が返りました。
試すときに必ず押さえる点が2つあります。1つ目は既定の管理者です。FAQにあるとおりログイン名・パスワードはadmin/adminで、配布物のconfig/auth/admin.dbにパスワードが平文のまま書かれています。2つ目は、最終版が2007年でセキュリティ修正が出ていないことです。ローカルの検証や教材の範囲にとどめ、外部から到達できるネットワークでは起動しないでください。Webサーバを公開するときの一般的な対策はWebサーバーのセキュリティ対策|IPA20ヶ条と優先順位づけにまとめています。
Jigsawの現在:CSSバリデータに残るHTTPライブラリ
サーバとしてのJigsawは2007年で止まりましたが、コードの一部は現役です。W3CのCSSバリデータのリポジトリ(2026年10月4日にもコミットあり)のbuild.xmlは、Maven Centralからorg/w3c/jigsaw/jigsaw/2.2.6/jigsaw-2.2.6.jarをダウンロードしてビルドします。ソースを見ると、jar側から使っているのは次のようなクラスです(org.w3c.www.mimeはバリデータ自身のリポジトリにも同名のソースがあるため除外しています)。
org.w3c.www.http.HttpFactoryとHttpAcceptCharsetList:リクエストのAccept-Charsetヘッダの解析org.w3c.www.protocol.http.HttpManager:自動テスト(autotest)でHTTPリクエストを送るクライアントorg.w3c.tools.resources.ProtocolException:検証処理の例外処理
READMEには今も「Jigsaw Powered」のバッジが貼られています。Maven Centralに登録されているJigsawはorg.w3c.jigsaw:jigsawの2.2.6だけで、POMのライセンス欄はW3C Software Licenseです。配布物のCOPYRIGHTファイルはW3C IPR SOFTWARE NOTICEで、目的を問わず無償で使用・複製・改変できます。条件は、複製物や派生物にNOTICEの全文を載せること、既存の権利表示や条件を残すこと、W3Cのファイルを変更した場合はその内容と日付を示すことです。
開発当時のソースはdev.w3.orgのCVSで公開されていました。W3CのGitHub組織にw3c/Jigsawというリポジトリは無く(GitHub APIで404)、GitHub上の非公式コピーを使う場合は、配布物の版番号やチェックサムと照合できるかを先に確かめてください。ソースを読むなら、md5を照合できる配布物のsrc/か、Maven Centralのソースjarが確実です。
ApacheやNginxとの比較:本番に使わない理由と研究で読む価値
| 項目 | Jigsaw | Apache httpd | nginx |
|---|---|---|---|
| 実装言語 | Java | C | C |
| 最終更新 | 2007年4月(2.2.6) | 2026年も更新中 | 2026年も更新中 |
| HTTP/2 | 非対応 | 対応 | 対応 |
| 設定の持ち方 | オブジェクトをJigXMLで保存 | テキストの設定ファイル | テキストの設定ファイル |
| 拡張の単位 | Javaのクラス | Cのモジュール | Cのモジュール |
本番のWebサーバとしてJigsawを選ぶ理由はありません。HTTP/2は2015年の仕様で、2007年に開発が止まったJigsawには実装がありません。SSLの実装はJava標準のSSLContextに乗る作りですが、Jigsaw側の修正は2007年の2.2.6が最後で、現在のTLS設定での動作は検証されていません。JavaでHTTPサーバが必要なら、現行のサーブレットコンテナを選ぶのが妥当です。WindowsのIISを含めた現役サーバの使い分けはIISとは?Windows標準Webサーバーの構造・設定とApache・nginxとの使い分けを実装者向けに解説を参照してください。
研究や教育で使う場面はあります。HTTP/1.1のキャッシュ、ネゴシエーション、Digest認証、WebDAVを、仕様策定者の近くにいたチームが1つのJavaコードベースで実装しており、Javaを読める人なら、URIからリソース、フレーム、フィルタへと処理が渡る流れを、クラスの継承関係のまま追えます。手元で起動すればホップ間の挙動まで含めてパケットを観察できます。読むときは、2.0の設計文書で全体の部品関係をつかんでから、org.w3c.jigsaw.frames.HTTPFrameとフィルタの実装に進むと迷いません。
よくある質問
JigsawとJavaのProject Jigsawは同じものですか?
別物です。Project JigsawはOpenJDKでJava 9のモジュールシステムを開発したプロジェクトの名前で、W3CのWebサーバとは関係がありません。モジュールシステムの使い方はJavaモジュールシステムとは?module-info.javaの書き方とパッケージとの違いで解説しています。Google社内のJigsaw(Perspective APIなどを手がけるチーム)やSalesforceが買収した連絡先データベースのJigsawとも別です。
W3CのJigsawは今もダウンロードできますか?
できます。2026年10月7日時点で、ホームページから2.2.6のzipとtarが取得でき、Maven Centralにもorg.w3c.jigsaw:jigsaw:2.2.6のjarとソースjarがあります。ただし最終版は2007年4月10日公開で、それ以降の更新はありません。
Jigsawの管理画面の初期パスワードは何ですか?
FAQによると、管理ツールJigAdminの既定のログイン名とパスワードはどちらもadminです。配布物のconfig/auth/admin.dbに平文で保存されています。管理サーバ(既定は8009番)はブラウザから開けないため、JigAdminのGUIから接続します。
JigsawはHTTP/2やHTTP/3に対応していますか?
対応していません。最終版の2.2.6はHTTP/2の仕様(2015年)より前に公開されており、対応するのはHTTP/1.1、1.0、0.9です。
Jigsawは誰が開発したのですか?
W3Cが開発し、主にINRIA(フランス国立情報学自動制御研究所)を拠点とするチームが担いました。1999年のW3Cのプレスリリースは、実装者としてYves Lafon、Benoit Mahé、Anselm Baird-Smithの3名を挙げています。Activity StatementではYves Lafonが活動のリーダーです。