WebサーバとIEなどとの間の通信に使用されるプロトコルです。
とか書くと、なんだか良く分からないですよね~。
ここではもっと具体的に見てみたいと思います。
プロトコルと言うとすごく難しく聞こえますが、単にどのようなデータをどのような順番で送るか?みたいなものと思えばとりあえずOKです。
じゃあ、HTTPではどのようなデータを送っているかを見てみましょう!
【IE⇒WEBサーバの通信】
送っているデータは、以下のような単なるテキストです。
POST /nana-2007-july/entry-10104294377.html HTTP/1.1
Accept: */*
Referer: http://ameblo.jp/nana-2007-july/
Accept-Language: ja
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; XXXX)
Host: ameblo.jp
Content-Length: 1768
Connection: Keep-Alive
Cookie: __utma=XXX; __utmz=XX1.1; JSESSIONID=XXXX;
name=test&address=tokyo
途中で、1行空いています!
これがヘッダ部分とデータ部分を分けることになっています。
ヘッダ部にはクッキーの情報やクライアントに何を使用しているか?などをテキストで記述していて
データ部には「キー名=値」の形でデータを記述しています。
データ部はPOSTのときのみ存在します。
GETのときは、URLの後に「?」を付けて、「name=test&address=tokyo」のようなデータを続けます。
以下のような感じです。
http://nana-2007-july/entry-10104294377.html?name=test&address=tokyo
なのでデータ部が必要ないのです。
実はIEは、これを送っているだけです。
ですので、telnetでポート80番などと接続して、上記のテキストを打ってしまえば
WEBサーバ側は、IEなのか人間が接続しにきたのか区別が付きません!
なんとなく、複雑なことをしているわけではないのは分かりましたでしょうか?
【WEBサーバ⇒IEの通信】
さて、上の内容が分かればこちらも難しくありません。
HTTP/1.0 200 OK
Date: Sun, 08 Jun 2008 09:55:27 GMT
Server: Apache
Set-Cookie: JSESSIONID=XXXXX; Path=/
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Expires: Tue, 05 Jun 2007 09:20:15 JST
Content-Encoding: gzip
Content-Length: 5816
Content-Type: text/html;charset=UTF-8
X-Cache: MISS from tsechttp231.sec.nifty.com
Connection: keep-alive
<html><title>XXXXX・・・・・
</html>
こちらも、ヘッダ部とデータ部が1行の改行で分かれます。
ヘッダ部にはクッキーの情報やデータ部がHTMLのテキストなのか?画像なのか?等を記述していて、
データ部には、HTMLのテキストなどが記述されます。
これらも単なるテキストです。
プログラム的には、coutなどで標準出力に上記のテキストを出力すればよいだけです。
簡単ですよね!
それだけに、気をつけてないとセキュリティホールになる箇所がたくさんあります。
かなり気をつけてプログラミングしましょう!
【補足】
上記をみて気づくことがありますよね。
1行の改行がヘッダとデータ部を分けています。
ということは、ヘッダ部で改行を表したい場合でもそのまま改行コードが使用できないということです。
このようにそのまま使用できない文字はエスケープすることになります。
参考:
POST/GETデータをアンエスケープするには?