GETかPOSTか、気分で決めていませんか。
Webサイトで「送信」ボタンを押した瞬間、あなたの入力したデータは旅に出ます。
その旅のスタイルには、2つの種類があります。
「GET」と「POST」です。
もしあなたがこの2つを適当に選んでいるとしたら、あなたは今すぐ本記事を熟読すべきです。
使い分けを間違えることは、セキュリティ上の自殺行為に等しいからです。
今日はこの2つの通信方式を、郵便物に例えて完全に理解していただきます。
GET:中身丸見えの「年賀状」
GET送信は、データを「URLの後ろ」にくっつけて送る方式です。
Googleで検索した時のURLを見てください。「search?q=猫」のような文字がついていますよね?これがGETです。
これは、郵便で言えば「年賀状(ハガキ)」のようなものです。
宛名(URL)のすぐ横に、通信内容が書いてある。
配達員(プロバイダやサーバー管理者)は、その内容を読み放題です。
もしあなたが、パスワードである「123456」をGETで送ったらどうなるか。
URL欄にpassword=123456と表示されます。
後ろに立っている上司にも、ブラウザの履歴を見た家族にも、通信ログを見たエンジニアにも、あなたのパスワードは筒抜けです。
- メリット(ブックマークできる)
URLに情報が含まれているので、「猫の検索結果」を保存したり、友人にLINEで送ったりできます。 - デメリット(丸見え)
機密情報の送信には絶対に使えません。 - デメリット(量に限界がある)
ハガキのスペースが限られているように、送れる文字数に制限があります。
POST:厳重に封をした「現金書留」
対するPOST送信は、データを「通信のボディ(内部)」に隠して送る方式です。
URLには何も表示されません。
これは「現金書留」や「厚手の封筒」です。
宛名(URL)だけが見えていて、中身は封筒の中に隠蔽されています。
配達員も中身を見ることはできません(基本的には)。
パスワードやクレジットカード番号、長文のブログ記事などを送るときは、GETではなく必ずこちらを使います。
- メリット(隠蔽性)
URLに表示されないため、覗き見されにくい。 - メリット(大容量)
封筒なので、分厚いデータや画像ファイルも送れます。 - デメリット(ブックマークできない)
URLに情報が含まれていないため、そのページを保存しても「入力画面」に戻されるだけです。 - デメリット(再送信の警告)
ブラウザの「戻る」ボタンを押すと、「フォーム再送信の確認」というウザい警告が出ます。
PHPでの受け取り方:専用の箱が用意されている
PHP側では、送られてきた方式に合わせて、データを受け取るための「特別な箱(連想配列)」があらかじめ用意されています。
初心者の方で、「連想配列の理解に自信が無いな…」と言う方は、ぜひ以下の記事を読んでみてください。

GETやPOSTで送信するデータを入れる配列を自分で作る必要はありません。PHPが勝手に用意してくれています。
GETで送られてきた場合
$_GETという連想配列に入っています。
// URLが「index.php?name=田中」の場合
echo $_GET["name"]; // 結果:田中Code language: PHP (php)
POSTで送られてきた場合
$_POSTという連想配列に入っています。
// フォームからPOSTで送信された場合
echo $_POST["email"]; // メールアドレスが表示されるCode language: PHP (php)
名前がそのままなので、間違えようがありません(しかし、筆者は誤って$POSTと書き、POSTデータがなぜ入っていないんだとパニックになったことがあります)。
GETで送ったのに $_POST の箱を探しても、中身は空っぽです。逆もまた然りです。
使い分け:検索はGET、秘密はPOST
どっちを使えばいいのか迷ったら、以下の基準で判断してください。
- そのページを誰かにシェアしたいか?
Yes → GET(検索結果、商品ページなど)
No → POST(ログイン処理、会員登録、決済など) - データを見られてもいいか?
Yes → GET
No → POST(パスワード、個人情報) - データがサーバーの状態を変えるか?
Yes(書き込み、削除、注文)→ POST
No(見るだけ)→ GET
特に3番目が重要です。
GETは「取ってくる(Get)」ためのもの。
POSTは「投函する(Post)」ためのものです。
何かを注文したり、データベースを書き換える処理をGETで作ってはいけません。
URLを叩いただけで注文が確定したりデータが変わったりするようなシステムは、事故の温床です。
まとめ:恥ずかしい、バレたくないデータは封筒に入れるべし
GET:ハガキ。URLにくっつく。シェアできるが丸見え。
POST:封筒。内部に隠れる。見えないし大容量。
あなたの送ろうとしているデータが「挨拶」ならハガキ(GET)で構いません。
しかし、「愛の告白」や「借金の相談」なら、迷わず封筒(POST)に入れてください。
Webの世界でも、デリカシーとセキュリティは同義です。


コメント