普段はインフラ系のエンジニア(もしくはインフラ系SE)をやっているので、Webサーバーが何か普段と異なるような動きをしている時はhttpdのアクセスログを見たり、ネットワーク帯域の消費状況を見たりしています。
Webサーバーにログインしてhttpdのログを調べていると「GET」や「POST」という言葉を見かけるのですが、いまいちハッキリと違いが分からなかったので、この機会に調べてみました。
「GET」という言葉の意味からすると、サーバーから何かを「ゲット」する。つまり何かを「得る」という意味だと思ってしまいますし、「POST」というと何かを「配る」という意味だと思ってしまいます。
しかし調べていくうちにそんなに単純ではないことが分かりました。
「GET」と「POST」もWebサーバに情報を渡すためのもの
これから詳しく調べていきますが、まず最初に「最も重要な基本」を。
それは「GET」も「POST」もWebサーバーに情報を渡しための「手段」です。
たとえば会員制のサイトなら、サーバーに「アカウントID」と「パスワード」を渡します。
サーバー側でチェックして会員であることが確認できればサイトを閲覧させますし、存在しない、もしくは間違っている場合は「エラー」を返して閲覧させません。
Googleで「Yahoo!」を検索した場合は、Googleのサーバーに対して「Yahoo!」のキーワードを渡しています。
このように「GET」も「POST」も基本的にはサーバーに対して情報を渡すためのものです。
インターネットでどうやってサイトを閲覧しているのか
普段インターネットでサイトを見ていますが、どういう仕組みなのでしょうか。
たとえば、Googleで「Yahoo!」を検索するとします。
(だったら最初からYahoo!を開けばって話ですが笑)
まずはブラウザを起動して、Googleのページを出して、検索欄に「Yahoo」と入力します。
「Enter」を押下すると、Googleが検索結果を返してブラウザ上で表示されます。
この時どうなっているのかというと、図のようにGoogleに対して「Yahoo!のサイトを探してください」とリクエスト(要求)を送っているのです。
これがHTTPリクエストというものです。
つまり、サーバーに対してどのようにHTTPリクエスト(要求)を送るのか?どういう形式でリクエストを送るのか?
「GET」形式で送るのか?「POST」形式で送るのか?
「GET」形式、「POST」形式、それぞれ「メリット」「デメリット」、適切な「利用シーン」があります。
「GET」と「POST」の利用シーンまとめ
これから詳しく説明していきますが、最初に整理しておきましょう。
※「POSTで送られたデータは目に見えるところにない」と記述がありますが、もちろんデータはネットワーク上には流れています。
具体的に説明すると、GETは以下のように目に見えるところにデータがありますが、
↓
GETで「山田太郎」というデータを送ると、こんな感じでURLに情報が見えている状態です。
どうでもいい情報ならいいですが、パスワードとかプライベートな内容なら情報流出が怖いですよね。
POSTの場合は、「山田太郎」という情報を送っても、
↓
少なくとも目に見えるところに「山田太郎」というプライベートな情報は見当たりません。
【もっと詳しく!】 HTTPリクエストの中身
更に詳しく調べました。
GETやPOSTを送るHTTPリクエストの中身はこんなふうになっています。
HTTPリクエストの中身
- リクエストライン
- HTTPヘッダ
- 空白行
- メッセージボディ
私は図解しないとイメージできないので(笑)、図にしてみました。
なんとなくイメージできたでしょうか?
クライアントPC(Webサーバの利用者)からサーバーにHTTPリクエストが飛んでますが、HTTPリクエストの中身はこの図のようになっています。
- リクエストライン
- HTTPヘッダ
- 空白行
- メッセージボディ
実際にコマンドを実行した結果から解説していきます。
以下、Linuxマシンから「Yahoo!」に対してHTTPリクエストを投げた結果です。
# curl –verbos www.yahoo.co.jp
* About to connect() to www.yahoo.co.jp port 80 (#0)
Trying 182.22.31.252…
Connected to www.yahoo.co.jp (182.22.31.252) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: www.yahoo.co.jp
> Accept: /
>
リクエストライン
GET / HTTP/1.1の部分です。
リクエストラインで「GET」形式でデータと送るのか「POST」形式でデータを送るのかを指定します。
HTTPヘッダ
> User-Agent: curl/7.29.0
> Host: www.yahoo.co.jp
> Accept: /
の部分です。
HTTPリクエストの付加的な情報(User-Agentとか、Hostの情報とか)を追加する。
メッセージボディ
GETなのでメッセージボディはありません。
「GET」と「POST」情報の送り方の違い
「GET」と「POST」では情報の送り方がことなります。
GETの場合
URLにデータを付けて送ります。
今何の情報を送っているのかが一目瞭然ですよね。
POSTの場合
HTTPリクエストのメッセージボディにパラメータ(情報)を付けて送ります。
具体的には以下を見てください。
POST形式でデータを送っていますが、「HTTP Headers」にはどこにも「山田太郎」の情報がありません。
しかし「POST Content」の部分にはエンコードされていますが、myNameパラメータに「山田太郎」がちゃんと入っています。
参考に今回利用したPHPプログラム
私はPHPに関してはちょっとかじったことがあるだけなので大したプログラムは書けませんが(大体プログラムの本を買って本に書いてある通りにプログラムを作って終わりですが笑)、今回利用したプログラムを以下に記載しておきます。
GETテスト用プログラム
ファイル名:form_get_test.html
<html>
<head><title>フォームサンプルプログラム【GET】</title></head>
<body>
<form action=”./form_get_test.php” method=”GET”>
<h1>挨拶する</h1>
<p>以下の人にあいさつをします。</p>
<input type=”text” name=”myName” value=”” />
<input type=”submit” name=”buttonName” value=”送信する”>
</form>
</body>
</html>
ファイル名:form_get_test.php
<html>
<head><title>フォームサンプルプログラム【GET】</title></head>
<body>
<h1>こんにちは<?= $_GET[“myName”] ?>さん</h1>
</body>
</html>
POSTテスト用プログラム
ファイル名:form_post_test.html
<html>
<head><title>フォームサンプルプログラム【POST】</title></head>
<body>
<form action=”./form_post_test.php” method=”POST”>
<h1>挨拶する</h1>
<p>以下の人にあいさつをします。</p>
<input type=”text” name=”myName” value=”” />
<input type=”submit” name=”buttonName” value=”送信する”>
</form>
</body>
</html>
ファイル名:form_post_test.php
<html>
<head><title>フォームサンプルプログラム【POST】</title></head>
<body>
<h1>こんにちは<?= $_POST[“myName”] ?>さん</h1>
</body>
</html>
コメント