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によって通信が暗号化されるHTTPShttps://)を利用し、通信経路での盗聴リスクを排除してください。

3. POST送信にはCSRF対策を施す

POSTメソッドを使ったフォーム送信では、CSRF(クロスサイト・リクエスト・フォージェリ)という攻撃への対策が必須です。

  • 攻撃の概要: 悪意のあるサイトを経由して、ユーザーが意図しない操作(例: 勝手に商品の購入や退会手続きなど)をサーバーに実行させてしまう攻撃です。
  • 対策: CSRFトークン(フォーム送信のたびに発行される使い捨ての秘密の文字列)をフォームに埋め込み、サーバー側でそのトークンが正しいものか検証することで、不正なリクエストをブロックします。

これらのセキュリティ対策は、ユーザーに安全にサービスを利用してもらうために、Web開発者として絶対に怠ってはならない基本中の基本です。


まとめ

本記事では、Web通信の根幹であるGETメソッドとPOSTメソッドの基本、それぞれの違い、そしてPHPでの具体的な使い方について解説しました。

メソッド役割データの送信場所適した用途セキュリティ
GETデータの取得・閲覧URLのクエリパラメータページ表示、検索、フィルタリング機密情報には不向き
POSTデータの送信・作成・更新HTTPリクエストボディフォーム送信、ログイン、データ登録機密情報に適している(HTTPS必須)

この2つのメソッドの役割と使い分けをマスターすることは、Web開発の学習における大きな一歩となります。