【入門編】 Last-ModifiedヘッダーとIf-Modified-Sinceによるキャッシュ検証 – Web APIアーキテクチャ・データ連携実践ガイド

こんにちは!ネットワークの深淵を愛するプロトコルスペシャリストです。

今日は、Web APIの通信における「無駄を省くための賢いやり取り」についてお話しします。特に、「一度見た情報を、もう一度取りに行くのは面倒だよね」という、キャッシュの基本原則に焦点を当ててみましょう。

通信の世界は、実は郵便配達と非常によく似ています。一緒に紐解いていきましょう。

—

なぜ「キャッシュ」が大切なの?

想像してみてください。あなたは毎朝、遠くのオフィスから届く「重要書類」を待ちわびています。ところが、その書類の内容は、先週から全く変わっていません。

それなのに、毎日毎日、重たい封筒を届けてもらっていたら……配達員さんも大変ですし、あなたも開封の手間がかかりますよね。

Webの世界でも同じです。サーバー(配達員)からクライアント(あなた)へ、毎回同じデータを送るのは、帯域幅(道路)の無駄遣いです。そこで登場するのが、「中身が変わったか確認する仕組み」です。

タイムスタンプで確認する:Last-Modified と If-Modified-Since

Webサーバーとブラウザは、次のような会話をしています。

1. 初回: 「この書類、いつ作成されたもの?」→ 「2023年10月1日だよ」とサーバーが教える(これが Last-Modified ヘッダー)。
2. 二回目以降: 「2023年10月1日以降に、中身は新しくなった?」とブラウザが尋ねる(これが If-Modified-Since ヘッダー)。

もし中身が変わっていなければ、サーバーは「変わってないよ!」とだけ伝えて、書類そのものは送りません。ブラウザは手元の古いデータをそのまま表示します。これで通信量は劇的に減りますよね。

—

ETag(イー・タグ)という「指紋」の存在

先ほどのタイムスタンプ方式には、一つ弱点があります。それは「時計のズレ」です。サーバーの時計とクライアントの時計が微妙に違うと、正しく判定できません。

そこで実務でよく使われるのが ETag です。これはデータの中身をハッシュ化した「指紋」のようなものです。

  • タイムスタンプ: 「更新日時はいつ?」
  • ETag: 「中身の指紋はこれだけど、今も同じ?」

ETag は中身が変われば確実に変わるため、非常に信頼性が高いのです。基本的には ETag があればそちらを優先し、Last-Modified は補佐として使うのが、現代のWeb API設計の定石です。

—

実践:Python (Flask) でのキャッシュ制御実装例

では、実際にAPIを作る際にどう書くか、シンプルな例を見てみましょう。

from flask import Flask, make_response, request
import hashlib

app = Flask(__name__)

@app.route('/data')
def get_data():
    content = "これは最新のデータです。"
    # 内容から指紋(ETag)を作成
    etag = hashlib.md5(content.encode()).hexdigest()
    
    # クライアントが持っている指紋と比較
    if_none_match = request.headers.get('If-None-Match')
    
    if if_none_match == etag:
        # 指紋が同じなら、データは送らず「304 Not Modified」を返す
        return '', 304
    
    # 違うならデータを送信
    response = make_response(content)
    response.set_etag(etag)
    return response

このコードのポイント

  • 304 Not Modified というステータスコードは、「あなたの持っているデータで正解ですよ」というサーバーからの合図です。
  • このコードを実装するだけで、ネットワーク負荷を劇的に下げることができます。

—

運用上の注意:時計は世界共通で合わせよう

Last-Modified を使う場合に絶対忘れてはいけないのが、サーバーの時刻同期です。

インフラエンジニアの現場では、NTP(Network Time Protocol)という仕組みを使ってサーバーの時計を正確に保ちます。もしサーバーの時計が数秒でもズレていると、If-Modified-Since の判定が狂い、本来は更新されているのにキャッシュが表示されてしまう……なんていう、原因究明が難しいバグに繋がります。

まとめ:一歩ずつ理解していきましょう!

1. Last-Modified は「更新日時」で判断する、昔ながらの親切な仕組み。
2. ETag は「指紋」で判断する、より確実な現代の標準。
3. 304 Not Modified は、通信を賢く節約するための合言葉。

これらを意識するだけで、あなたの作るAPIは「ネットワークに優しい、美しいAPI」へと一歩近づきます。最初は難しく感じるかもしれませんが、パケットが「中身、変わってないよね?」「変わってないよ!」と会話している様子をイメージしてみてください。

さあ、次はあなたのAPIでも、この賢い通信を実装してみませんか?

コメント

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