HTTPメソッド (GET / POST)
HTTP Methods (GET / POST)
概要(サマリー)
HTTPメソッド(GET / POST)は、ブラウザがWebサーバーへHTTPリクエスト(通信によるお願い)を送る際、「どのような目的の操作を行いたいか」を示すための通信の分類マークである。
郵便で例えるなら、封筒の表に「カタログをください(GET)」や「荷物をお届けします(POST)」と大きくスタンプを押すようなものである。Webサーバーはそのマークを見て、データを単に画面に返すだけなのか、あるいはデータベースに新しく登録するのかを判断して処理を行う。
詳細解説
HTTPメソッドとは何か(通信の操作目的マーク)
HTTP通信において、ブラウザやアプリからサーバーに対して送るお願いが「HTTPリクエスト」である。
サーバー側は、受け取ったリクエストが「どのような性質の要求か」を素早く判別する必要がある。そのためにリクエストの先頭に添えられる「操作指示マーク」がHTTPメソッドである。
HTTPには複数のメソッドが定義されているが、Web開発において特に基本となるのが GET(ゲット) と POST(ポスト) である。
GETメソッド(データを安全に取得する)
GET メソッドは、サーバーから「データを取得する(見せてほしい)」ときに使用する。
- 主な用途:ホームページを表示する、ブログの記事を読む、検索窓にキーワードを入れて検索する、など。
- 特徴:仕様上は、サーバー側のデータを書き換えたり破壊したりしない「安全な操作(参照のみ)」として扱われる。
- パラメータの送信方法:サーバーへ検索ワードなどの追加情報を送りたい場合、URLの末尾に
?q=cat&limit=10のように情報をくっつけて送信する。これを「クエリパラメータ(URLパラメータ)」と呼ぶ。
POSTメソッド(データを送信・登録する)
POST メソッドは、サーバーへ「新しいデータを送信し、登録や処理を行ってもらう」ときに使用する。
- 主な用途:ユーザー新規登録フォームを送信する、ブログに新しい記事を投稿する、ECサイトで注文を確定させる、など。
- 特徴:サーバーのデータベースに新しいレコードを書き込んだり、ファイルを保存したりする「状態を変化させる操作」である。
- パラメータの送信方法:URLの末尾ではなく、通信の「封筒の中身」にあたる「リクエストボディ(メッセージボディ)」に情報を入れて送信する。そのため、URLには送信内容が表示されにくい。
GETとPOSTの決定的な違い(URLパラメータとボディ)
GETとPOSTは、データの送り方と通信の目的が根本的に異なる。
- GET(URLに情報を載せるハガキ):
- データは主にURL(アドレスバー)に含まれる。
- URLの文字数制限(ブラウザやサーバーによる)があるため、大量のデータやファイルは送れない。
- URLごと「お気に入り(ブックマーク)」に登録したり、履歴に残したりできる。
- POST(本文に情報を入れる封筒):
- データはリクエストの内部(ボディ)に入れて送られる。
- GETより大きなデータを扱いやすく、画像や動画ファイルの送信にも使われる。
- ページをブックマークしても、送信したデータごと保存することはできない(再読み込みすると「フォーム再送信の確認」という警告が出る)。
以下は、HTMLフォームにおけるGETとPOSTの書き方の対比パターンである。
GETの場合(検索フォームなどに推奨)
<!-- 検索キーワードを送信するフォーム -->
<form action="/search" method="GET">
<input type="text" name="query">
<button type="submit">検索</button>
</form>
送信すると、URLは /search?query=入力値 になる。
POSTの場合(ログインや登録フォームに推奨)
<!-- パスワードを伴うログインフォーム -->
<form action="/login" method="POST">
<input type="text" name="username">
<input type="password" name="password">
<button type="submit">ログイン</button>
</form>
送信しても、URLは /login のままであり、パスワードはURLに露出しない。
AIコーディングとの関係
AIにフロントエンド(画面)とバックエンド(API)の通信コードを生成してもらう際、GETとPOSTの仕様設計をAIとすり合わせることは重要である。
API通信コードの自動生成
AIに「ReactからバックエンドのExpressサーバーに、新しいブログ記事を登録する通信処理を書いてください」と依頼すると、AIは method: 'POST' を指定した fetch コードと、サーバー側でそれを受け取る app.post('/api/posts', ...) というハンドラーコードのたたき台を生成してくれる。通信の目的を正しく伝えれば、適切なメソッドを選びやすくなる。
脆弱なGET設計の防止
AIは時として、パスワードの変更やログイン情報の送信処理に、不適切な GET メソッドを使用するコードを生成してしまうことがある。これはセキュリティ上の脆弱性となるため、開発者が気づいて修正させる必要がある。
- 指示の例:「ログイン処理の通信において、ユーザー情報がURLパラメータとして露出するのを防ぎたいです。通信を
POSTメソッドに変更し、リクエストボディにJSON形式でデータを詰めて送信するように、フロントエンドとサーバー側のコードを修正してください。」
よくある勘違い
POSTを使えばセキュリティは完璧に安全?
「POSTはURLにデータが映らないから、セキュリティは完璧で盗聴も防げる」というのは大きな誤解である。
POSTデータはURLに表示されないだけで、通信そのものは暗号化されていない限り、インターネットの通り道で中身を盗み見られる危険がある。
盗聴を防ぐためには、HTTPメソッドの選択(GET/POST)だけでなく、通信全体を暗号化する「SSL / TLS(HTTPS通信)」を導入する必要がある。HTTPS通信を利用していれば、GETのパラメータもPOSTのボディデータも通信経路上では暗号化される。ただし、GETの場合は暗号化されていても「ブラウザの閲覧履歴」や「サーバーのアクセスログ」にURLパラメータがテキストで残ることがあるため、個人情報やパスワードの送信にGETを使うべきではない。
GETリクエストではデータを送信できない?
「GETはデータを受け取るだけで、こちらからデータを送ることはできない」と思うかもしれないが、これも誤りである。
前述の通り、URLの末尾に ?name=taro&age=20 のようにパラメータを付与することで、サーバーへデータを送信することができる。
ただし、送れるデータの量に限界があること、履歴に残りやすいこと、ファイル送信には向かないことなどの制約があるため、「検索ワードなど、URLに残っても問題になりにくいデータ」に限定して使用する。
GETとPOST以外のメソッドは使われていない?
一般的なWebサイト(HTMLの <form> タグ)ではGETとPOSTしか使えないが、モダンなWebアプリ(API開発やJavaScriptによる通信)では、さらに細かく目的を分けたHTTPメソッドが頻繁に使われている。
- PUT(プット):既存のデータを新しい内容で丸ごと「置き換える(更新する)」ときに使う。
- PATCH(パッチ):データの一部だけを「部分的に書き換える(更新する)」ときに使う。
- DELETE(デリート):特定のデータを「削除する」ときに使う。
これらを使い分けて構築されたAPIを、一般的に「REST API」と呼ぶ。
情報ソース
まとめ
- HTTPメソッドは、通信リクエストが「どのような目的の操作か」をサーバーに伝えるマーク。
GETはデータの取得(参照)に使い、データは主にURLパラメータとして送られる。POSTはデータの登録・処理に使い、データはリクエストボディに入れて送られる。- セキュリティを高めるためには、メソッドの使い分けに加え、HTTPSによる通信全体の暗号化も必要である。
より詳しくAIに聞いてみよう
- HTTPのGETリクエストで送信できるデータの最大文字数(長さ)の制限について教えてください。
- フォームを送信した後にブラウザの戻るボタンを押した際、「フォーム再送信の確認」というポップアップが出る原因を説明してください。
- REST APIを設計する際、データの更新に PUT メソッドと PATCH メソッドをどのように使い分ければよいですか?
- JavaScriptの
fetchAPIを使って、サーバーにJSONデータを POST 送信するための最小限のテンプレートコードを書いてください。 - AIコーディングで「ログイン機能」を実装してもらう際、通信内容がハッカーに盗聴されないようにするための最善のインフラ構成とコード設計を教えてください。