【入門編】HTTP/1.1のVaryヘッダーの重要性 – HTTPプロトコル・通信規格実践ガイド

なぜ「あの人」には別の画面が見えるの?HTTPの「Varyヘッダー」が握るキャッシュの秘密

Webサイトを見ていて、「あれ、さっきまでスマホ版が表示されていたのに、PCからアクセスしたらレイアウトが崩れている…?」なんて経験はありませんか?

実はこれ、Webブラウザとサーバーの間にいる「キャッシュサーバー(CDN)」が、ちょっとした勘違いをしていることが原因かもしれません。今日は、インターネットという広大な世界で、郵便配達員が「誰に何を届けるべきか」を見失わないための重要ルール、「Vary(ヴェアリー)ヘッダー」について、一緒に紐解いていきましょう。

—

そもそも「キャッシュ」って何をしているの?

まず、基本のお話から。Webサイトを閲覧するとき、私たちのブラウザは「このページのデータちょうだい!」とサーバーに手紙(リクエスト)を出します。

しかし、毎回毎回、遠く離れたサーバーに手紙を出すのは大変ですよね。そこで、私たちの近所(あるいはネットワークの要所)には「キャッシュサーバー」という名の「自動販売機」や「保管所」が設置されています。

1. 初回: キャッシュサーバーが「本物のサーバー」からデータをもらってきて、手元にコピーを置く。
2. 2回目以降: 別の誰かが同じページを求めたら、本物のサーバーまで行かずに、手元のコピーをサッと渡す。

これがあるおかげで、インターネットは爆速で動いているのです。

—

そこで立ちはだかる「Varyヘッダー」の壁

さて、ここからが本題です。もし、「スマホでアクセスした人」と「PCでアクセスした人」で、全く別のWebページを表示させたい場合はどうすればいいでしょうか?

サーバーは、リクエストを受け取ったときに「おっ、この人はスマホだな。スマホ用のレイアウトを送ろう」と判断します。でも、キャッシュサーバーは「一度覚えたデータ」を使い回すのが仕事です。

もし、キャッシュサーバーが「PCの人」からのリクエストに対して、「スマホ用のデータ」を渡してしまったら……大変なことになりますよね。

ここで登場するのが「Varyヘッダー」です。これは、サーバーからキャッシュサーバーへの「注意書き」です。

> 「このデータはね、受け取った手紙の中の『User-Agent(ブラウザの種類)』という項目によって中身が変わるから、そこをちゃんと確認してから渡してね!」

というメモを添えるイメージです。

—

不適切な設定が招く「キャッシュ汚染」の恐怖

もしこのVaryヘッダーを正しく設定しなかったらどうなるでしょうか?

例えば、最初にアクセスしたのが「スマホ」だったとします。キャッシュサーバーは「このURLのデータはこれだ!」とスマホ用の画面を保存します。次に「PC」からアクセスが来ても、キャッシュサーバーは「もう持ってるよ!」とスマホ用の画面を渡してしまいます。

これを現場では「キャッシュ汚染(Cache Poisoning)」と呼びます。間違ったデータがキャッシュとして居座り、世界中のユーザーに誤った情報が配られ続ける……インフラエンジニアとしては冷や汗が止まらない状況です。

—

具体的な設定を見てみよう

実際に、サーバー側でどのように設定されているかを見てみましょう。Webサーバー(ApacheやNginxなど)の設定ファイルで、以下のような指示を出します。

Nginxの設定例

「User-Agent(ブラウザの種類)によって中身が変わるよ」と伝えます
add_header Vary “User-Agent”;

「Cookie(ログイン状態など)によっても変わる可能性があるよ」という場合
add_header Vary “User-Agent, Cookie”;

  • Vary: User-Agent
  • スマホかPCかを判断基準にする場合に設定します。
  • Vary: Cookie
  • ログインしているユーザー用と、そうでないユーザー用で画面を分ける場合に必要です。

注意点: 闇雲に何でもかんでもVaryに追加すればいいわけではありません。あまりに細かく設定しすぎると、キャッシュサーバーが「種類が多すぎて覚えきれない!」とキャッシュを諦めてしまい、結局サーバーの負荷が減らない……という本末転倒な事態にもなります。

—

まとめ:一歩ずつ理解していこう

Varyヘッダーを理解することは、インターネットの「交通整理」のルールを理解することに似ています。

1. キャッシュは「使い回し」の達人。
2. でも、人によって中身が違うページがある。
3. 「見分けるポイントはここだよ!」と教えてあげるのがVaryヘッダー。

もし実務で「特定のブラウザだけ表示がおかしい」「キャッシュをクリアしたら直った」という現象に出会ったら、まずはこのVaryヘッダーの設定を疑ってみてください。

ネットワークの世界は、こうした小さな「メモ書き」の積み重ねで、複雑で巨大な情報を正しく届けているんです。今日から少しだけ、ブラウザの向こう側にある「見えない配送ルート」に思いを馳せてみてくださいね。

皆さんのエンジニアライフが、よりスムーズなものになりますように!

コメント

タイトルとURLをコピーしました