【入門編】HTTPメソッドの冪等性(Idempotency)の定義と実装上の注意 – HTTPプロトコル・通信規格実践ガイド

「何度押しても大丈夫?」HTTPの冪等性(べきとうせい)を郵便配達で理解しよう

こんにちは!ネットワークの世界へようこそ。
インフラエンジニアとして現場を歩いていると、「なぜかデータが二重に登録されてしまった」「ブラウザの更新ボタンを連打したら注文が重複した」という相談をよく受けます。

これ、実はHTTPプロトコルの「冪等性(べきとうせい)」という概念を知るだけで、劇的に防げるトラブルなんです。

今日は、小難しい仕様書の言葉を一度置いておいて、私たちの身近な「郵便配達」に例えながら、この大事なルールを紐解いていきましょう!

—

1. 「冪等性」って、要するに何?

いきなり漢字で「冪等(べきとう)」なんて書かれると身構えてしまいますよね。でも、意味はとてもシンプルです。

「何度同じ操作を繰り返しても、結果が同じであること」

これだけです。
もしあなたが「100円を振り込む」という操作を5回繰り返したら、500円減ってしまいますよね。これは「何度やっても同じ結果(100円の減少)」にはならないので、冪等ではありません。

一方で、「この書類を破棄してください」という指示ならどうでしょう?
1回破棄しても、2回目に「破棄してください」と言われても、すでに書類はないので状態は変わりません。これが「冪等」です。

—

2. HTTPメソッドと「郵便」の役割分担

Webの世界では、ブラウザ(あなた)とサーバー(郵便局)の間で、メソッドという「伝言カード」を使ってやり取りをします。主なメソッドを見ていきましょう。

GET(情報を読み取る:結果は変わらない)

図書館で本を借りるのではなく「閲覧する」イメージです。何度ページをめくっても、本の内容は変わりませんよね。だからGETは「冪等」です。

PUT(情報を上書きする:結果は変わらない)

「この住所の表札を『山田』に変えてください」という指示です。1回やっても、10回やっても、最終的に表札が「山田」であることに変わりはありません。だからPUTも「冪等」です。

DELETE(情報を消去する:結果は変わらない)

「この手紙を燃やしてください」という指示です。1回燃やしてしまえば、2回目以降は「もう燃えていて何もない」という状態で止まります。だからDELETEも「冪等」です。

POST(情報を新しく作る:結果は変わる!)

ここが最大の注意点です!POSTは「冪等ではありません」。
「この注文書を新しい注文として受理してください」という指示は、5回送れば5回分、新しい注文が作成されてしまいます。これが「冪等ではない」ということの正体です。

—

3. 実装上の注意:なぜ「二重送信」は起きるのか?

インフラの現場でよくあるのが、ネットワークの遅延によるリトライ(再送)です。

1. あなたが注文ボタンを押す(POST)
2. サーバーまで信号が届くが、少し重くて返事が遅れている
3. あなたは「あれ?送れてないかな?」と思って、もう一度ボタンを押す
4. サーバーには2つの注文が届いてしまい、二重決済が発生する

これを防ぐための、プロの知恵が「トークン(目印)」の利用です。

サーバー側の実装例(擬似コード)

二重送信を防ぐために、サーバー側で「この注文は一度受け取ったよ!」という記録を残すのが定石です。

// サーバー側の処理イメージ
async function handleOrder(request) {
const transactionId = request.headers[‘X-Transaction-ID’]; // クライアントが発行したユニークなID

// このIDが既にデータベースにあるか確認
const isAlreadyProcessed = await database.check(transactionId);

if (isAlreadyProcessed) {
// すでに処理済みなら、新しい注文は作らずに「成功」の結果だけを返す
return { status: 200, message: “既に処理済みです” };
}

// 初めての注文なら、データベースに保存する
await database.saveOrder(request.body, transactionId);
return { status: 201, message: “注文を受け付けました” };
}

このように、「クライアント側で一意なIDを発行し、サーバー側でそれをチェックする」という仕組みを組み込むことで、POSTのような非冪等な操作でも、安全にリトライできるようになります。

—

最後に:一歩ずつ理解を深めよう

「冪等性」という言葉、最初は難しく聞こえたかもしれませんが、こうして見ると「何度やっても結果が壊れないように設計する」という、エンジニアとしての誠実な気配りそのものだと思いませんか?

  • GET/PUT/DELETE は「何度やっても安心」
  • POST は「慎重に、一度きりになるよう工夫する」

この基本を頭の片隅に置いておくだけで、あなたの作るアプリケーションやインフラ設計は、驚くほど信頼性の高いものになりますよ。

今日の学びが、あなたのエンジニアライフの一助になれば幸いです。何か詰まったら、またいつでもここに戻ってきてくださいね!

コメント

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