Webの基本

HTTPとは

Web(WWW)を一般的にブラウザからアクセスする場合、たとえばURL欄にアドレス http://www.yahoo.co.jp/ と入力するとヤフーのホームページが表示されます. また、表示されたウエブページ内のリンクをクリックすることで指定されたURLがアドレス欄に入力した場合と同様に切り替わり別の画面が表示されることは通常はそれ意識することなくインターネットを利用しているでしょう。

その一連の流れはHTTPというプロトコル(通信規約)に従って、ホームページを提供する(ウエブ)サーバ側と受信するクライアント側(この場合はウエブブラウザ)が相互に情報をやり取りして成り立っています。

ブラウザから与えられる情報はURLであり、URLはホスト部とパス部に分かれる
例えば、ヤフーのトップページから"CGI"という文字列で検索するとそのURLは

http://search.yahoo.co.jp/search?p=CGI&search.x=1&fr=top_ga1&tid=top_ga1&ei=UTF-8

となり

ホスト部 search.yahoo.co.jp
パス部 /search?p=CGI&search.x=1&fr=top_ga1&tid=top_ga1&ei=UTF-8

となります。

HTTPはTCP/IPプロトコルの上で動作します。OSI参照モデルでその階層を表すと

アプリケーション層 HTTP
トランスポート層 TCP
インターネット層 IP

という関係になります。HTTPはTCPの80ポートをデフォルトとして使用します。サーバ側が任意のポートで待ち受ければURLのホスト部ホスト部:ポート番号と記述すれば一般のブラウザはそのポートを利用してサーバと通信するようになります。 (例: http://example.com:8080/path )

通信の実際

ブラウザから表示するまでのやり取りの詳細を説します。下のURLはヤフーブログ検索の検索結果のURLです

http://blog-search.yahoo.co.jp/search?p=CGI&ei=UTF-8

をURLとしてアクセスすると、まずブラウザはそのURLを解析し

  • 通信はHTTPを利用 (httpsであれば、セキュアを確保するHTTPSを利用します)
  • ホスト部は blog-search.yahoo.co.jp でありデフォルト80ポートを利用
  • パス部は /search?p=CGI&ei=UTF-8

ということ理解します。
まず、ホスト部のホスト名から通信に必要なIPアドレスを引きます. ここでDNSの仕組みを利用してIPアドレスを変換します。コマンド(nslookup)でこの動作を再現すると

bash-3.2$ nslookup blog-search.yahoo.co.jp
Server:		192.168.0.1
Address:	192.168.0.1#53

Non-authoritative answer:
blog-search.yahoo.co.jp	canonical name = fe.bsearch.vip.tnz.yahoo.co.jp.
Name:	fe.bsearch.vip.tnz.yahoo.co.jp
Address: 203.216.247.234

となり、 203.216.247.234 というIPアドレスが求まります.

その後、サーバに接続して通信を行います。この流れも コマンド (telnet) で再現できます

bash-3.2$ telnet blog-search.yahoo.co.jp 80
Trying 203.216.247.234...
Connected to fe.bsearch.vip.tnz.yahoo.co.jp.
Escape character is '^]'.
GET /search?p=dvd&cop=&ei=UTF-8 HTTP/1.0

HTTP/1.1 200 OK
Date: Wed, 12 Nov 2008 12:49:31 GMT
P3P: policyref="http://privacy.yahoo.co.jp/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"
Cache-Control: private
Connection: close
Content-Type: text/html;charset=utf-8

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html>....
....
.... HTML部分....
....
Connection closed by foreign host.

ブラウザは受信したHTMLを解析し、画面にウエブページをヒョジします。HTMLを解析した結果、さらに追加でHTTP接続が必要な場合(画像など外部リソースがHTMLから参照されている場合)自動でそれを行い、リソースを取得します.

HTTP詳細

基本

HTTPを応答するウエブサーバはクライアントに対してヘッダと本文(HTML)を応答します。ヘッダはブラウザ画面上にそのままの形では反映されることはありませんが、さまざまな通信属性をクライアント、サーバ各々が相手に通知するための情報が記述される部分になります。
上のtelnetコマンドの例では

HTTP/1.1 200 OK
Date: Wed, 12 Nov 2008 12:49:31 GMT
P3P: policyref="http://privacy.yahoo.co.jp/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"
Cache-Control: private
Connection: close
Content-Type: text/html;charset=utf-8

の部分がヘッダ部分、一行空行を空けてその下部が本文になります。

FirefoxブラウザLive HTTP Headersを用いてブラウザで任意のページをアクセスすると通信のヘッダ情報がリアルタイムに表示され確認することができます。

注意:ヘッダ部分の一部(Cookie)などは個人情報に相当する情報も含まれているため、安易他人にその情報をシェア(公開)することの無いように取り扱いに注意してください。

【演習】
Firefox + Live HTTP Header をインストールして適当なサーバとの通信のHTTPヘッダ情報を確認しましょう。また、そこで確認できたヘッダ情報の各属性名,属性値がどのような意味を持っているかを調べましょう。
参考URL:
http://www.studyinghttp.net/header
http://www.tohoho-web.com/ex/http.htm

Cooike

HTTPはステートレス(状態,接続順を保存しない)プロトコルです。たとえば前回のアクセスの状態をふまえて今回のページの表現を変更することはできません。
その解決の1つの方法としてCookie(クッキー)という仕組みがあります。Cookieとはサーバはクライアントのアクセス時にヘッダ情報の一部として

Set-Cookie: 保存したい情報

を送信します。ブラウザは受信したCookieをPCのファイルシステムに保存します。逆に、クライアント側がサーバにアクセスした場合は

Cookie: 保存されていた情報

を送信しサーバ側にその情報を通知します。Cookie情報はドメインごとに分けて保存されており、同じドメインでその情報を相互やりとりします。(Aドメインで設置されたCookieがBドメインサーバで受信されることはありません. 状況によってAサーバのセキュリティ脆弱性を突いてこれを行われてしまうリスクもあります。ウエブセキュリティで後述)
Cookieの仕組みを用いると

  • ログイン情報を保存する(パスワードの毎回の入力の手間を軽減させる)
  • 一度設定したサービスオプションを次回アクセス時にデフォルトで利用させる
  • 前回の作業内容(表示画面)を保存できる

などの処理が可能になります
参考:
http://www.studyinghttp.net/cookies
http://itpro.nikkeibp.co.jp/article/COLUMN/20080331/297574/

【演習】
自分が利用しているブラウザでCookieの管理ページを探し、どのようなCookieが保存さているか確認してみましょう.
例:Firefoxの管理画面

【演習】
Cookieを利用していると思われるサイトにアクセスし、Live HTTP Header でその通信内容を確認してみてください. (Set-Cookie: Cookie: のヘッダを探してみてください)

メソッド

メソッドとはサーバ側に通知するURLとあわせてクライアントが指定するもので、サーバ側がどのようにそのURLを取り扱う(処理する)かを指定するもになります
多くの種類がありますが、アクセスするウエブサーバ側で解釈できる(サポートされている)必要が当然あります.
一般的にGET, POST, HEAD を良く利用するのでこれを押さえておきましょう
参考
http://www.studyinghttp.net/method

ステータスコード

サーバ側はリクエストのレスポンスをクライアントに応答するだけでなく、ステータスコードと呼ばれる3桁の数値で表現される結果コードを返します。 例にあげたtelnetコマンドでの応答の最初の行でも

HTTP/1.1 200 OK

ステータスコードが応答されていることが確認できます。

【演習】
結果コードで良く利用されるものは以下です。その意味を調べてみましょう。
200, 301, 304, 400, 403, 404, 500, 503
参考
http://www.studyinghttp.net/status_code

まとめ

本章は全般的にこちらのサイトの情報を参考にさせていただきました
http://www.studyinghttp.net/
その他、HTTPの深い内容まで網羅されているのでさらに興味がある方は参照すると良いでしょう。
近年WebDAVと呼ばれるHTTPを拡張したプロトコルで、サーバ側のリソース(ファイル,フォルダ)をクライアントから操作(create, delete, copy, move, modify, etc..) できる技術も一般に使われつつあります。興味ある方はWebDAVで検索してみましょう