POSTとGETの違い

「POST」と「GET」の違いは何ですか?と聞かれて「んー?」となったので調べてみた。

目的が違う。

  • POSTは掲示板等に投稿(POST)するためのメソッドでデータ変更を主目的としたメソッド
  • GETはインターネット上の既存のコンテンツ等を取得(GET)するためのメソッド

ちなみにPOSTはformを使う必要があるんですが、自宅で作るWEBアプリではあんまりデータ変更するのにPOSTっていうこだわりはないんですが、だめな習慣らしいです。

まあ、目的は説明できるのですが、POSTとGETでクライアントからWEBサーバーにどんな文字列送出しているのかが分からなかったので「んー?」となったわけです。

リクエストを知る

こんな感じ

"GET /hoge/fuga/index.html HTTP/1.1\r\n"
"Connection: close\r\n"
"Accept: */*\r\n"
"Host: www.example.com"
"\r\n"
  • データを下さい(GET)
  • 欲しいデータはこのファイルです(/hoge/fuga/index.html)
  • この会話はHTTP1.1なんだぜ(HTTP/1.1)
  • 返事が済んだらTCP接続切ってくれだぜ!(Connection: close\r\n)
  • こっちはどんな返事でも待ってるんだぜ!(Accept: */*\r\n)

※だいぶ適当なGETですので実際にどんなGETかは各自で調べて下さい。

パラメータを付与してGETとPOSTを比較

GET

GET /hoge.cgi?hoge=hogehoge1&fuga=fugafuga HTTP/1.1

POST

POST /hoge.cgi HTTP/1.1
Content-Length: xxx
\r\n
hoge=hogehoge&fuga=fugafuga

あらら、あんまり変わらないのね。

※GETだとurlにパラメータが付与されるからPOSTのほうがセキュリティが高いよ!と思った方がいると思いますが今回私が知りたいのはそこではなかったりします。

とりあえずHTTPという規格ではそんなに変わらないようです。とりあえずサーバー側のプロセスに対してこのような文字列を標準入力で送り込むと解釈しました。

まとめ

「GETとPOSTの違いは?」という質問に対しては

  • 情報を参照するか、更新するか、という目的が異なる。
  • WEBサーバー側へ送り込む文字列の形式が違う

この2点だけ答えればそれ以上の回答は蛇足かな?*1

GETは$ENV{'QUERY_STRING'}に送信したデータが格納されるようですが、それはサーバの仕様次第だと思えたのですがどうなんでしょうか?

追記

この記事についていくつかご意見頂戴しました。ありがとうございます。

  • $ENV{QUERY_STRING}につっこんでくれるのはサーバの仕様というよりはCGIの仕様だと思いました
  • 長さの制限があるんで、ある程度以上長い内容を送る場合はPOSTにせざるをえない的なことも
  • GETで変更させるのはクロスサイトスクリプティングの敷居が低くなりすぎるのも問題
  • まぁ今どきjsつかえる環境だと、ajaxでなんでもできるので、結局抜本的な対策が必要になりますが。> XSS

今度は「クロスサイトスクリプティングってなに?」って聞かれた場合の事を考える必要がでてきたな…

2011-06-15追記

そういえばGETだとaccess logに記録が残るんでした。

極端に言えばログインでuserIDとpassWordをGETで送信するとアクセスログに記録残る…*2

GETだとアクセスログからユーザーが何をしたかったのかを判別する事も可能になりますが、逆説的いえばユーザーのプライバシーに関する情報をGETでやりとりするとアクセスログの保持にも気をつける必要がでてくるのかも*3

*1:そうなのかどうなのかを誰かに突っ込んでほしくてこの記事を書いていますが何か?

*2:いや、そこでGETする人いないと思いますけど

*3:いや、そんなのをGETでやりとりする人いないと思いますけど