WEB開発の基本を学ぶ上で非常に重要となる、HTTP通信(WebサーバーとWebブラウザ間で行われるデータ通信のルール)の根幹をなすGETメソッドとPOSTメソッドについて解説します。
💡 POSTとGETとは?Web通信における役割を理解しましょう
Webサイトの閲覧やフォームからのデータ送信など、普段インターネット上で行っている操作の裏側では、Webブラウザ(例:Chrome、Safari)とWebサーバーの間でデータのやり取りが常に行われています。このデータ通信の際に、「どのようにデータを送るか」という通信方法を定めているのが、GETメソッドとPOSTメソッドという2つの主要なHTTPメソッド(通信手段)です。
これらのメソッドは、Web開発における基本的な「データの取得」や「データの送信」といった処理を行う上で欠かせない役割を担っています。
📄 HTTPメソッド(GET/POST)の基本概念
HTTP(HyperText Transfer Protocol)メソッドは、クライアント(Webブラウザ)がサーバーに対して「何をしたいか」を伝えるための動詞のようなものです。GETとPOSTの他にも、データを更新するPUTや、データを削除するDELETEなどがありますが、Web開発の初学者がまず理解すべきなのは、このGETとPOSTの2つです。
- GETメソッド: 主にWebサーバーから情報を取得(取得・閲覧)したいときに使われます。例えば、Webサイトのトップページを表示したり、検索結果を表示したりする際などに利用されます。
- POSTメソッド: 主にWebサーバーへ情報を送信(登録・作成・更新)したいときに使われます。例えば、お問い合わせフォームで入力したデータを送信したり、ログイン情報を送ったりする際などに利用されます。
🔎 POSTとGETの「違い」は?データの送信方法とセキュリティ
GETとPOSTはどちらもデータの送受信に使われますが、データの送信方法とセキュリティの面で大きな違いがあります。この違いを理解することが、Web開発の実践において非常に重要になります。
🔗 データの送信方法の違い:URLとリクエストボディ
GETとPOSTの最も大きな違いは、「どこにデータを格納して送信するか」という点です。
| 特徴 | GETメソッド | POSTメソッド |
| データの送信場所 | URLの末尾(クエリパラメータ) | HTTPリクエストボディ(本体) |
| 送信データのサイズ制限 | あり(URLの長さによる制限) | ほぼなし(サーバー設定による) |
| ブックマーク | 可能(URLにデータが含まれるため) | 不可 |
| データの可視性 | 高い(URLで見えてしまう) | 低い(通常は見えない) |
クエリパラメータとは、URLの末尾に「?」の後に続くkey=value形式のデータのことです。
https://example.com/search?q=Web開発 の場合、「q=Web開発」の部分がクエリパラメータです。
リクエストボディとは、HTTPリクエストの「本文」にあたる部分で、ユーザーには通常見えません。POSTメソッドでは、ここにフォームの入力データなどが格納されて送信されます。
🔒 セキュリティと機密性の違い
- GETメソッドのセキュリティ:
- データがURLにそのまま表示されるため、パスワードなどの機密性の高いデータの送信には絶対に使用してはいけません。
- URLが履歴に残ったり、ログに記録されたり、他人に簡単に見られてしまうリスクがあります。
- POSTメソッドのセキュリティ:
- データはリクエストボディに格納され、URLには表示されません。このため、機密性の高いデータ(ログイン情報、クレジットカード情報など)を送信する際に適しています。
- ただし、POSTメソッドであっても、通信自体が暗号化されていないHTTP通信(
http://で始まるURL)の場合は、通信経路で盗聴されるリスクがあります。より安全なHTTPS通信(https://で始まるURL)を利用することがWeb開発では必須です。
💻 URLと$_GET:GETメソッドでデータを受け取る仕組みと使い方(PHP)
WebブラウザからGETメソッドで送信されたデータは、PHPでは$_GETというスーパーグローバル変数(どこからでもアクセスできる特殊な変数)を通して受け取ることができます。
🌟 $_GETの仕組み
GETメソッドでは、URLのクエリパラメータ(?以降の部分)にデータが格納されます。PHPの$_GETは、このクエリパラメータの値を連想配列(キーと値のペアでデータを保持する配列)として自動的に保持しています。
📝 GETメソッドの実践的なコード例
URLが https://example.com/item.php?id=100&color=red の場合、PHP側で利用できる $_GET の中身は次のようになります。
// $_GET の中身
[
'id' => '100',
'color' => 'red'
]
item.phpというファイルで、URLから商品ID(id)を受け取り、その商品情報を表示する例です。
<?php
// ユーザーが送信したGETデータを受け取る
// isset()関数で、指定したキー('id')が存在するかを確認します
if (isset($_GET['id'])) {
$item_id = htmlspecialchars($_GET['id']); // XSS対策のため無害化
echo "## 商品詳細(ID: {$item_id})";
echo "<p>これはID: {$item_id} の商品ページです。</p>";
// 実際の開発では、このIDを使ってデータベースから商品情報を取得します
} else {
echo "<p>表示する商品IDが指定されていません。</p>";
}
?>
ポイント: 受け取ったデータ(
$_GET['id'])は、そのまま画面に表示するとXSS(クロスサイトスクリプティング)というセキュリティ上の脆弱性につながる可能性があるため、htmlspecialchars()関数を使って無害化(サニタイズ)してから使用することが基本です。
📥 フォームと$_POST:POSTメソッドで安全にデータを送信する方法(PHP)
POSTメソッドは、主にHTMLのフォームを使ってデータをサーバーに送信するために利用されます。送信されたデータは、PHPでは$_POSTというスーパーグローバル変数を通して受け取ります。
🌟 $_POSTの仕組み
HTMLの<form>タグでmethod="post"を指定し、ボタンが押されると、入力データがHTTPリクエストボディに格納されてサーバーに送られます。PHPの$_POSTは、このボディ内のフォームデータを連想配列として保持しています。
📝 POSTメソッドの実践的なコード例
お問い合わせフォームを作成し、送信された名前(user_name)とメッセージ(message)を受け取る例です。
1. HTMLフォームの作成 (contact_form.html)
<form action="contact_receive.php" method="post">
<label for="name">お名前:</label>
<input type="text" id="name" name="user_name" required><br><br>
<label for="msg">メッセージ:</label>
<textarea id="msg" name="message" required></textarea><br><br>
<input type="submit" value="送信する">
</form>
2. PHPでデータを受け取る (contact_receive.php)
<?php
// POSTでデータが送信されたかを確認
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// isset()でデータが存在するか確認し、htmlspecialchars()でサニタイズ
$user_name = isset($_POST['user_name']) ? htmlspecialchars($_POST['user_name']) : '未入力';
$message = isset($_POST['message']) ? htmlspecialchars($_POST['message']) : '未入力';
echo "## 送信完了しました";
echo "<p>お名前: {$user_name}</p>";
echo "<p>メッセージ:</p>";
echo "<p>{$message}</p>";
// 実際の開発では、この後データベースへの保存処理などを行います
} else {
echo "<p>フォームからの正しいアクセスではありません。</p>";
}
?>
ポイント: POSTメソッドによるフォーム送信では、
$_SERVER['REQUEST_METHOD']を使って、リクエストが本当にPOSTメソッドで行われたかを確認すると、直接URLにアクセスされた場合(GETメソッド)と区別できて便利です。
⚖️ POSTとGETの「使い分け」:どんな時にどちらを選ぶべきか
Web開発でGETとPOSTのどちらを使うか迷った際は、その操作が「データの取得・表示」なのか、それとも「データの登録・変更」なのかを基準に考えると明確になります。
🛒 GETメソッドを選ぶべきケース
データの取得や表示のみを行い、サーバー上のデータの内容が変わらない(副作用がない)操作で利用します。
- Webページの閲覧: トップページ、一覧ページ、詳細ページの表示。
- 検索: 検索キーワードを送信し、結果一覧を受け取る。
- フィルタリング/ソート: データを絞り込んだり、並び替えたりする。
📝 POSTメソッドを選ぶべきケース
サーバー上のデータの内容を変更・作成する操作や、機密性の高い情報を送信する操作で利用します。
- フォームの送信: お問い合わせ、会員登録、ログイン、商品の購入手続き。
- データの新規作成: 掲示板への書き込み、ブログ記事の投稿。
- データの更新/削除: プロフィールの編集、コメントの削除(これらの操作はPUT/DELETEが使われることもありますが、WebフォームではPOSTが一般的です)。
重要な原則(べき等性): GETメソッドは「何度実行しても結果が変わらない(べき等性)」操作に使うのが望ましいとされています。POSTメソッドは、実行するたびに新しいデータが作成される(データベースに二重登録されるなど)可能性があるため、べき等性がない操作に使われます。
PHPでPOSTとGETを使う際の注意点:セキュリティ対策は必須です
Web開発の初心者が特に注意すべき、GETとPOST利用時のセキュリティに関するポイントを解説します。
1. 入力値の無害化(サニタイズ)を徹底する
$_GETや$_POSTから受け取ったユーザーの入力データは、必ずhtmlspecialchars()などの関数を使ってサニタイズ(無害化)してから画面に表示するようにしてください。
- 目的: XSS(クロスサイトスクリプティング)という攻撃を防ぐためです。悪意のあるスクリプト(プログラムコード)が入力された場合、それを無害化せずに表示すると、閲覧者に被害が及ぶ可能性があります。
2. 機密情報にはPOSTとHTTPSを利用する
パスワードや個人情報、決済情報などの機密情報を送信する際は、以下の2点を必ず守ってください。
- POSTメソッドを利用する: URLに情報が表示されるGETメソッドは絶対に使用しないでください。
- HTTPS通信を利用する: HTTPではなく、TLS/SSLによって通信が暗号化されるHTTPS(
https://)を利用し、通信経路での盗聴リスクを排除してください。
3. POST送信にはCSRF対策を施す
POSTメソッドを使ったフォーム送信では、CSRF(クロスサイト・リクエスト・フォージェリ)という攻撃への対策が必須です。
- 攻撃の概要: 悪意のあるサイトを経由して、ユーザーが意図しない操作(例: 勝手に商品の購入や退会手続きなど)をサーバーに実行させてしまう攻撃です。
- 対策: CSRFトークン(フォーム送信のたびに発行される使い捨ての秘密の文字列)をフォームに埋め込み、サーバー側でそのトークンが正しいものか検証することで、不正なリクエストをブロックします。
これらのセキュリティ対策は、ユーザーに安全にサービスを利用してもらうために、Web開発者として絶対に怠ってはならない基本中の基本です。
まとめ
本記事では、Web通信の根幹であるGETメソッドとPOSTメソッドの基本、それぞれの違い、そしてPHPでの具体的な使い方について解説しました。
| メソッド | 役割 | データの送信場所 | 適した用途 | セキュリティ |
| GET | データの取得・閲覧 | URLのクエリパラメータ | ページ表示、検索、フィルタリング | 機密情報には不向き |
| POST | データの送信・作成・更新 | HTTPリクエストボディ | フォーム送信、ログイン、データ登録 | 機密情報に適している(HTTPS必須) |
この2つのメソッドの役割と使い分けをマスターすることは、Web開発の学習における大きな一歩となります。