「何度押しても大丈夫?」HTTP/1.1のGETメソッドが持つ「安全」と「冪等」の正体
Webエンジニアとして一歩踏み出した皆さん、こんにちは。
ブラウザのURL欄にアドレスを入力して「Enter」を押すとき、あるいはリンクをクリックするとき、裏側で何が起きているか考えたことはありますか?
実は、その裏側で主役として働いているのが「HTTP」という通信ルールです。そして、その中でも一番の働き者である「GETメソッド」には、Webの世界を壊さないための「鉄の掟」が定められています。
今日は、その掟である「安全(Safe)」と「冪等(Idempotent)」という概念について、一緒に紐解いていきましょう。
—
郵便配達で例える「GETメソッド」の役割
「GET」という言葉を直訳すると「取得する」ですよね。その名の通り、GETメソッドはサーバーに対して「この情報を見せて!」とお願いするだけの行為です。
これを郵便配達に例えてみましょう。
- GETメソッド: 「ポストに入っている手紙の中身を『見せてもらう』」行為です。
- POSTメソッド: 「ポストに新しい手紙を『投函する』」行為です。
さて、ポストの中身を覗き込む(GET)だけなら、何度繰り返しても手紙の内容は変わりませんよね? これがWebの世界における「安全」と「冪等」の感覚です。
1. 「安全(Safe)」とは?
「安全」とは、「サーバー側の状態を一切変えない」という約束事です。
GETリクエストを100回送ろうが1,000回送ろうが、サーバーのデータベースが書き換わったり、何かが消えたりすることはありません。ただ単に「情報を取ってくるだけ」という安心感、これが「安全」です。
2. 「冪等(Idempotent)」とは?
少し難しい名前ですが、要は「何度やっても結果が同じ」ということです。
先ほどの郵便の例で言えば、「ポストの中身を見る」という行為を1回やっても、10回やっても、目の前にある手紙の中身(結果)は常に同じです。これが「冪等性」です。
もしこれが「ポストに手紙を入れる(POST)」だとどうでしょう。1回やれば1通ですが、10回やれば10通の手紙が届いてしまいますよね。これは冪等ではありません。
—
なぜこの「掟」が重要なのか?
「そんなの当たり前じゃない?」と思うかもしれませんが、ネットワークの現場では、このルールが守られていないと大惨事になります。
例えば、Webブラウザの「戻る」ボタンを押したときを想像してください。もしGETメソッドが「ボタンを押すたびにデータが書き換わる(安全ではない)」仕様だったら、「戻る」ボタンを押すたびに、前のページの内容が変わったり、二重注文が発生したりする恐ろしいWebサイトになってしまいます。
ブラウザは「GETリクエストは安全で冪等である」という前提を信じているからこそ、安心してリクエストを再送できるのです。
—
実装時の注意点:エンジニアとしての良心
では、私たちがWebアプリを作る際、具体的に何に気をつけるべきでしょうか。
一番のタブーは、「GETリクエストの中に、状態を変化させる処理を混ぜること」です。例えば、以下のようなコードは絶対に書いてはいけません。
// 【絶対にやってはいけない例】
// GETでアクセスしただけで、データベースの値を更新してしまうコード
app.get(‘/delete-user’, (req, res) => {
// URLにアクセスしただけでユーザーを削除する処理
// これだと、クローラーが巡回しただけでユーザーが消えてしまう!
db.users.delete(req.query.id);
res.send(‘削除しました’);
});
GETはあくまで「見るだけ」の場所です。もし「削除する」「登録する」といった変更を伴う操作が必要なら、それは必ずPOSTやDELETEといった別のメソッドを使うのがルールです。
開発中のデバッグで意識したいこと
ブラウザの「ネットワークタブ」を開いて、リクエストを確認してみてください。
自分の書いたGETリクエストが「安全」かつ「冪等」に保たれているか、サーバー側で何か勝手な書き換えを行っていないか。この意識を持つだけで、あなたはもう一人前のインフラ・バックエンドエンジニアです。
—
まとめ:ネットワークの信頼は「ルール」でできている
HTTP/1.1で定義された「GETメソッドは安全かつ冪等であるべき」という仕様は、Webという巨大な仕組みを壊さないための、先人たちによる知恵です。
- 安全: サーバーの状態を壊さない(Read Only)。
- 冪等: 何度実行しても同じ結果が返る。
この二つを意識するだけで、あなたの作るサービスは、ユーザーにとっても、ブラウザにとっても、そしてネットワークにとっても「優しい」ものになります。
難しいプロトコルの仕様書を丸暗記する必要はありません。まずは「これは郵便の中身を覗くだけの行為かな?」と、身近な行動に置き換えて考えてみてください。そうすれば、パケットが駆け巡るWebの世界が、もっと鮮明に見えてくるはずですよ!
コメント