# Shared Dictionaries 登場！差分だけ送る新しい圧縮のかたち

やっほー、しぃちゃんだよ！今日は圧縮の話。しかも「もう一度全部送るのやめようよ」っていう、ちょっと賢い仕組みのお話なの。わくわくするよ！

## なにが発表されたの？

[Cloudflare の Blog](https://blog.cloudflare.com/shared-dictionaries) が、共有辞書を使った圧縮 **Shared Dictionaries**（正式には Compression Dictionary Transport、[RFC 9842](https://datatracker.ietf.org/doc/rfc9842/)）への対応を発表したよ。

これは、ブラウザがすでにキャッシュしている「前のバージョン」を辞書（cheat sheet みたいなもの）として使い、新しいレスポンスとの**差分だけ**を送る、っていう仕組みなの。Cloudflare は 3 段階で展開する予定で、まず Phase 1 のベータが 2026 年 4 月 30 日にスタートするよ。

## 今までどうだったの？

これまでの gzip・Brotli・Zstandard は、どれも「1 つのレスポンスを単独で」圧縮するものだったの。クライアントが何をキャッシュ済みかは知らないから、毎回ゼロから圧縮していたんだよね。

しかも Web ページはこの 10 年でどんどん [重くなって](https://almanac.httparchive.org/en/2024/page-weight#fig-15) いて、毎年 6〜9% くらい増えてるの。そのうえ最近は AI 支援の開発でデプロイの回数も増えていて、コードがほとんど変わってなくても再デプロイのたびにアセット全体が配り直しになっちゃう。せっかくのキャッシュが台無しなんだよ。

## これで何が変わるの？

Shared Dictionaries を使うと、変わったところ（差分）だけが線を通るようになるの。たとえば 500 KB のバンドルに 1 行だけ修正を入れても、送るのは数キロバイトで済んじゃう。

Cloudflare のラボ計測（San Jose の PoP からアイオワ州 Council Bluffs のオリジンまで）だと、こんな感じ。

- 圧縮前のアセット: 272 KB
- gzip: 92.2 KB（66% 削減）
- 共有辞書ありの DCZ: 2.6 KB（元から 99% 削減、gzip よりさらに 97% 小さい）

ダウンロード完了までの時間も、キャッシュミス時で 161 ms だったのが 1 ms に、というレベルで縮んでるの。

これ、エージェント時代の Web ではとくに効いてくるんだよ。2026 年 3 月時点で、エージェント型のクローラーやボットは Cloudflare のネットワークリクエストの約 10% を占めていて、前年比で 60% も増えているの。中身が変わってないのに毎回まるごと再取得、っていう無駄をなくせるのは大きいよね。

## 深く潜ってみよう

仕組みはこう。サーバーはバージョン付きのアセットに `Use-As-Dictionary` レスポンスヘッダーを付けるの。ブラウザはそれをキャッシュして、次のリクエストで `Available-Dictionary` ヘッダーを送り「これ持ってるよ」と伝える。するとサーバーは旧バージョンを辞書にして差分だけを `dcb` または `dcz` という content-encoding で返す、という流れ。ヘッダーやエンコーディングの詳しい話は [MDN の解説](https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/Compression_dictionary_transport) が分かりやすいよ。

実は共有辞書、昔にも挑戦があったの。Google が 2008 年に Chrome で SDCH というのを試したんだけど、CRIME や BREACH みたいな圧縮のサイドチャネル攻撃に弱かったり、Same-Origin Policy に反していたりして、2017 年に取り下げられちゃった。今回の RFC 9842 は「同一オリジンのみ」を強制することでその弱点をふさいでいるの。ブラウザ側は Chrome 130 以降と Edge 130 以降が対応済み、Firefox も対応を進めているところだよ。

展開は 3 段階。

- **Phase 1（パススルー、4 月 30 日ベータ）**: Cloudflare は辞書ヘッダーとエンコーディングをそのまま転送するだけ。キャッシュキーは `Available-Dictionary` と `Accept-Encoding` でバリエーションを持つよ。オリジン側が辞書圧縮済みのレスポンスと正しいヘッダーを返す必要があるの。
- **Phase 2（マネージド）**: ルールで対象アセットを指定すれば、`Use-As-Dictionary` の付与・辞書バイトの保存・差分圧縮を Cloudflare が肩代わり。デモの [Can I Compress (with Dictionaries)?](https://canicompress.com/) では、94 KB のバンドルが約 450 バイト（99.5% 減）まで縮んでいるの。
- **Phase 3（自動）**: トラフィックを観測して差分圧縮に向いたアセットを Cloudflare が自動で見つける。設定いらずで、[RUM ビーコン](https://blog.cloudflare.com/the-rum-diaries-enabling-web-analytics-by-default/) などで効果を検証する仕組みだよ。

気をつけたいのは、レスポンスがエンコーディングと辞書ハッシュの両方でバリエーションを持つから、デプロイの途中では「旧辞書・新辞書・辞書なし」のクライアントが混在してキャッシュのコピーが増える、というところ。クライアントが辞書を持ってないときのフォールバックもちゃんと考える必要があるの。最新情報は [changelog](https://developers.cloudflare.com/changelog/) を追ってね。

## まとめ

- Cloudflare が共有辞書圧縮 **Shared Dictionaries**（Compression Dictionary Transport, RFC 9842）に対応、Phase 1 ベータは 4 月 30 日スタート。
- キャッシュ済みの旧バージョンを辞書にして、**差分だけ**を送るのがキモ。272 KB → 2.6 KB のように激減するよ。
- `Use-As-Dictionary` と `Available-Dictionary`、`dcb`/`dcz` エンコーディングで動く。同一オリジン限定で昔の SDCH の弱点をふさいでいるの。
- 3 段階展開で、最終的には設定なしの自動化まで進む予定。

デプロイが多いフロントエンド開発者さん、大量のボット・エージェントにアセットを配っているサイト運営者さんには、じわっと効いてくる嬉しいアップデートだよ。転送量とコストを削りたい人はチェックしてみてね！
