GETとPOSTとは?
Webの世界では、ブラウザとサーバーの間でデータをやり取りする際にHTTPメソッドと呼ばれる「通信の種類」を指定します。その中で最も基本的かつ頻繁に使われるのがGETとPOSTです。
ひとことで言えば、GETは「データをもらう(取得する)」ためのメソッド、POSTは「データを送る(送信する)」ためのメソッドです。レストランに例えるなら、GETは「メニューを見せてください」というリクエスト、POSTは「この注文をお願いします」というリクエストです。
GETリクエストの特徴
GETは、サーバーからデータを取得するためのメソッドです。私たちが普段Webサイトを閲覧しているとき、ほとんどのリクエストはGETです。
GETの主な特徴:
・パラメータがURL(アドレスバー)に表示される(例:?search=キーワード&page=2)
・ブラウザの履歴やブックマークに残る
・キャッシュされる(同じURLは再読み込みせず保存したデータを使える)
・URLの長さに制限がある(ブラウザによるが約2,000〜8,000文字)
・べき等性がある(何回実行しても同じ結果が返る)
GETは「読み取り専用」の操作に適しています。検索、一覧表示、詳細ページの表示、フィルタリングなど、サーバー上のデータを変更しない操作で使います。
POSTリクエストの特徴
POSTは、サーバーにデータを送信して処理を依頼するためのメソッドです。フォームの送信、ログイン、ファイルのアップロードなどで使われます。
POSTの主な特徴:
・パラメータがリクエストボディに含まれる(URLには表示されない)
・ブラウザの履歴に残らない
・キャッシュされない(毎回サーバーに新しいリクエストが送られる)
・送信データのサイズに実質的な制限がない
・べき等性がない(同じリクエストを複数回送ると、複数回処理される可能性がある)
POSTは「データを変更する」操作に適しています。新規登録、更新、削除、ファイルアップロード、決済処理など、サーバー上のデータに影響を与える操作で使います。
GETとPOSTの5つの決定的な違い
違い①:データの送り方
GETはパラメータをURLのクエリ文字列(?key=value)として送ります。そのため、ブラウザのアドレスバーに送信内容が丸見えになります。POSTはリクエストボディにデータを格納するため、URLには表示されません。ただし、これは「暗号化」ではないので、POSTでも通信を傍受すれば内容は読めます。セキュリティにはHTTPS(TLS/SSL)が必要です。
違い②:データサイズの制限
GETはURLに含めるため、ブラウザやサーバーのURL長制限(一般的に2,000〜8,000文字)に縛られます。POSTはリクエストボディを使うため、理論上はサイズ制限がなく、大量のテキストデータやファイルの送信が可能です。
違い③:キャッシュとブックマーク
GETリクエストの結果はブラウザにキャッシュされ、同じURLのブックマーク・共有も可能です。「この検索結果を友達に共有したい」という場面でGETが便利な理由です。POSTの結果はキャッシュされず、ブックマークもできません。フォーム送信後に「戻る」ボタンを押すと「フォームの再送信」の警告が表示されるのはこのためです。
違い④:べき等性(Idempotency)
GETはべき等です。同じGETリクエストを100回送っても、サーバーの状態は変わりません。POSTは非べき等です。同じPOSTリクエストを2回送ると、商品が2個注文されたり、コメントが2件投稿されたりする可能性があります。ECサイトで「注文確定」ボタンを連打してはいけない理由がここにあります。
違い⑤:セキュリティ上の考慮
GETはURLにパラメータが含まれるため、ブラウザ履歴、サーバーログ、リファラーヘッダーなどに情報が残ります。パスワードや個人情報をGETで送るのは厳禁です。POSTはURLにデータが残りませんが、それだけでは安全とは言えません。真のセキュリティにはHTTPS通信、CSRF対策、入力値のバリデーションが必要です。
実務での使い分け判断フローチャート
迷ったら以下の順序で判断しましょう。まず「サーバーのデータを変更するか?」を考えます。変更しない(読み取りのみ)ならGET、変更するならPOSTです。次に「送信データにパスワードや個人情報が含まれるか?」を確認します。含まれるなら必ずPOST(+HTTPS)です。最後に「URLを共有・ブックマークさせたいか?」を考えます。させたいならGET、不要ならPOSTです。
他のHTTPメソッドとの関係
実はHTTPメソッドはGETとPOSTだけではありません。RESTful APIの設計では、PUT(データの更新・置換)、PATCH(データの部分更新)、DELETE(データの削除)も使います。しかし、HTMLフォームが標準でサポートしているのはGETとPOSTのみです。そのため、Webアプリケーションでは「表示系はGET、それ以外はPOST」という使い分けが広く定着しています。
ちなみに、HTTPメソッドの使い分けと同じくらい重要なのが、APIのセキュリティ設計です。リクエストを送ったユーザーが「誰であるか」と「何を許可されているか」を正しく制御する方法は認証と認可の違いを参照してください。
まとめ
GETは「データを取得する」ためのメソッドで、パラメータがURLに表示され、キャッシュやブックマークが可能です。POSTは「データを送信する」ためのメソッドで、データはリクエストボディに含まれ、サイズ制限がほぼありません。この使い分けの原則は「読み取りならGET、変更ならPOST」。Web開発の最も基本的かつ重要な知識のひとつです。


コメント