Java | Web 基礎・HTTP・REST:HTTP 基礎 - 安全なメソッド

Java Java
スポンサーリンク

「安全なメソッド」を一言でいうと

HTTP でいう「安全なメソッド」は、
「サーバー側の状態を変えないメソッド」 のことです。

何回呼んでも、DB の中身が変わらない。
新しいデータも増えないし、削除もされない。
つまり “読むだけ” のメソッド が「安全なメソッド」です。


安全なメソッドの代表:GET と HEAD

GET は「読むだけ」の代表選手

GET は、すでに何度も出てきた通り、
「この URL の情報を見せて」とサーバーにお願いするメソッドです。

ユーザー一覧を表示する
ユーザー詳細を表示する
検索結果を取得する

こういった処理は、
サーバー側の状態を変えずに、情報を返すだけ ですよね。

だから GET は「安全なメソッド」です。

同じ GET /users/1 を 1 回呼んでも、10 回呼んでも、
ユーザーが増えたり減ったりはしません。
(もちろん、裏で別の処理が走ってユーザー情報が変わることはありますが、
それは GET のせいではない、という意味です。)

HEAD は「GET のボディなし版」

HEAD は、
「GET と同じことをするけど、ボディはいらない。ヘッダだけ返して」
というメソッドです。

例えば、

ファイルが存在するかだけ知りたい
サイズだけ知りたい

といったときに使われます。

HEAD も、
サーバー側の状態を変えないので「安全なメソッド」です。


「安全」と「冪等」は似てるけど別物

安全=状態を変えない

安全なメソッドとは、
「サーバー側の状態を変えない」 メソッドです。

GET や HEAD は、
どれだけ呼んでも DB の中身を変えない前提なので、安全です。

冪等=何回やっても最終状態が同じ

冪等なメソッドとは、
「同じ操作を何回繰り返しても、最終的な状態が変わらない」 メソッドでした。

PUT や DELETE は、
サーバーの状態を変えますが、
同じリクエストを何回送っても「最終状態」は同じなので、冪等です。

ここがポイントです。

安全なメソッド
→ 状態を変えない(=そもそも“書き込み”をしない)

冪等なメソッド
→ 状態は変えるけど、同じ操作を繰り返しても結果は変わらない

だから、

GET:安全 & 冪等
PUT:安全ではない & 冪等
DELETE:安全ではない & 冪等
POST:安全ではない & 冪等でもない(ことが多い)

という整理になります。


なぜ「安全なメソッド」が重要なのか

ネットワークやブラウザが「勝手に呼んでもいい前提」になる

安全なメソッドは、
「呼んでも状態が変わらない」前提なので、
ブラウザや中継サーバー、検索エンジンのクローラなどが
勝手に呼んでも大丈夫 という扱いになります。

例えば、

ブラウザの「リンク先を事前に読み込む」機能
検索エンジンのクロール
キャッシュの更新確認

こういった仕組みは、
「GET は安全である」という前提に立っています。

もし GET に「削除」や「登録」のような副作用を持たせてしまうと、
これらの仕組みが勝手に GET を叩いたときに、
意図せずデータが消えたり増えたりしてしまいます。

だから、
「状態を変える処理を GET に乗せない」
というのは、HTTP の世界ではかなり強いお作法です。

キャッシュの前提にもなる

安全なメソッド(特に GET)は、
キャッシュしやすい、という特徴もあります。

「読むだけ」であることが分かっているから、
中継サーバーや CDN は、
GET のレスポンスを保存しておいて、
次回同じリクエストが来たときに再利用できます。

もし GET が「状態を変える」メソッドだったら、
キャッシュはとても危険になります。


Java 開発者視点で「安全なメソッド」をどう意識するか

画面表示・検索・詳細表示は「安全」であるべき

Java(Spring)で API や画面を作るとき、
まずこう自問してみてください。

「この処理は、サーバー側の状態を変えるか?」

変えないなら、
GET(=安全なメソッド)で設計するのが基本です。

一覧表示
詳細表示
検索結果表示
ダウンロード(ただのファイル配布)

こういったものは、
すべて「安全な GET」であるべき です。

「安全じゃないのに GET にしていないか?」を常に疑う

例えば、こんな URL を見たら要注意です。

GET /deleteUser?id=1
GET /doPayment?amount=1000

技術的には動きますが、
HTTP 的には完全にアウトです。

削除や決済は、
サーバー側の状態をガッツリ変える操作なので、
安全なメソッドではありません。

こういう処理は、
DELETE や POST など「安全ではないメソッド」で設計する必要があります。


初心者向けまとめ:安全なメソッドを自分の言葉で説明するなら

あなたの言葉で整理すると、こうなります。

安全なメソッドとは、
「サーバー側の状態を変えない“読むだけ”のメソッド」のこと。

代表は GET と HEAD。
GET は画面表示・一覧・詳細・検索など、
「見るだけ」の処理に使うべきで、
削除や登録などの“書き込み”を乗せてはいけない。

安全と冪等は似ているけれど別物で、
安全=状態を変えない、
冪等=何回やっても最終状態が同じ、
という違いを意識しておくと、HTTP メソッド設計の軸がぶれなくなる。

もしよければ、
今あなたが思い浮かべている機能を一つ挙げて、
「これは安全なメソッドで実装すべきか? それとも状態を変えるか?」
を一緒に仕分けしてみよう。
その感覚が育つと、API 設計の怖さがかなり減るから。

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