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行の改行がヘッダとデータ部を分けています。

ということは、ヘッダ部で改行を表したい場合でもそのまま改行コードが使用できないということです。

このようにそのまま使用できない文字はエスケープすることになります。




参考:

クッキーとは?

CGIセッションを実現するには?

GETやPOSTのデータを取得するには?
POST/GETデータをアンエスケープするには?