コラム

Webサーバはどのように動いているのだろう?~HTTP・URL・クッキー編~

筆者:森本 良照

サーバ
ネットワーク
プログラミング
Web
ソフトウェア

2017.02.08


私たちはスマートフォンやパソコンを使って様々なWebサイトにアクセスし情報を入手し、または発信しています。しかし、このWebサイトを表示しているブラウザや、そのコンテンツを提供しているWevサーバがどのような仕組みで動いているのかご存知でしょうか?今回は、「URL」「HTTP」「クッキー」に注目し、Webサーバの仕組みを見てみましょう。


Webサイトの場所を表す「URL」と、Webサーバを提供する通信手段「HTTP」


もはや私たちが使用しない日はないのでは?と言っても過言ではないWeb。Webブラウザで、何気なく検索をしたり、URLを打ち込んで見ていますが、一体どのような仕組みで動ているのか、ご存知ですか?
今回は、Webサイトのアドレスである「URL」から、Webを表示する仕組みである「HTTP」について焦点を当ててご紹介します。

まず、私たちはWebサイトを参照するとき、そのコンテンツを提供している Webサーバ にアクセスしています。
世界中にある無数のWebサーバにアクセスをする際に、Webサーバの所在を表す「URL = (Uniform Resource Locator) 」を入力してアクセスしています。

この URLの書式 には決まりがあります。そもそも、このURLは、「スキーム(scheme)」(しくみ、体系)と、「Webサイトの場所を表す部分」(ホスト・パス)によって構成されています(「Webサイトの場所を表す部分」と書きましたが、実際には、どのスキームを使うかによって、この部分に入る内容は変わります)。

WebサーバのURLの例として http://www.sample.co.jp/hello.html を考えてみましょう。

この場合、スキーム 「http」です。 HTTP は Hypertext Transfer Protocol の略称で、Webを閲覧するためにクライアントのWebブラウザとWebサーバ間でコンテンツをやり取りする方法を決めたもの(プロトコル)です。つまり、このURLの先頭部分「http」で、「これはWebアクセスをします」ということを示しています。

スキームがhttp となっているURLは http:// ホスト/パス の形式となっています。
ホスト部分 は「このホスト(サーバ)のWebサイトにアクセスします」という意味で、パス部分 は「そのホストのこのパス(のファイル)のコンテンツを送ってください」という要求になります。つまり今回は、sample.co.jpホストの配下にある hello.htmlというコンテンツを要求しているということになります。

次に、sample.co.jp というWebサーバと通信をするためには IPアドレス を知る必要があります。I`アドレス自体は、32ビットの2進数を10進数で表した、4つのフィールドで区切った数値で表されます。実際に、WebサーバはこのIPアドレスを使った数値でアクセスするサーバを特定しているのですが、私たちは、「URL」の形で、英数字でサーバをしているかと思います。IPアドレスは、DNS (Domain Name System) というサービスを使って、URLのホスト名に当たる部分と、対応づけています。コマンドプロンプトから、次のコマンドを使って、IPアドレスを調べることができます。

このIPアドレスに対して、TCP(Transmission Control Protocol) ポート番号80番 を使って接続します。

TCP はインターネットを使用して通信を行う場合、コンピュータとコンピュータが1:1で通信をする際の基本プロトコル です。その特徴は通信パケットに対してシーケンス番号を付与することで、伝送中の欠損パケットを再送することが可能となり、信頼性の高い通信 を行うことです。

またTCPには ポート番号 という概念があります。ポート番号ごとに、通信するサーバの種類を分けている のです。ちなみに、メールサーバ(SMTP)の場合は25番、DNSサーバ の場合は53番、NTP(Network Time Protocol) の場合は123番など、それぞれのサービスごとに特定の番号が決まっています。これらの複数のポート番号を使い分けることで、1つのIPアドレスで複数のサービスを提供することが可能 です。 

この様にクライアントのWebブラウザは、Webサーバと通信を行うために HTTPを使用してサーバ側にリクエスト をかけます。サーバ側はクライアントからの要求に対して HTTPでレスポンスを返す という極めてシンプルな方法でやり取りをしています。
 

HTTPのリクエストってなんだろう?


WebブラウザからWebサーバへ送信される HTTPリクエスト は、「リクエスト行」、「メッセージヘッダー」、「ボディ」の3つで構成されています。

さらに 「リクエスト行」は、「メソッド」「リクエストURI」「HTTPバージョン+改行コード」の3つで構成されています。

「メソッド」はWebサーバに対する 要求コマンド です。主なメソッドは表1を参照ください。また一番よく使用されるメソッドは「GET」です。WebブラウザでURLを入力し、リンクをクリックするとGETメソッドが実行されます。「リクエストURI」(Uniform Resouce Identifier)はリクエストの対象となるデータを表しており、Web上にあるあらゆるデータを指しています。最後に「HTTPバージョン」はWebブラウザがサポートする HTTPのバージョン番号で主にVersion 1.1です。

次に「リクエスト行」に続くのが「メッセージヘッダー」です。そのリクエストがどのホストに対するものか?を示す「Host:」ヘッダー が必須となります。

表1 主なHTTPメソッド

HTTP リクエストを受け取ったWebサーバは次に何をするの?


さて、HTTPリクエストを受け取ったWebサーバは、その リクエストに対するレスポンス を返していきます。
レスポンスメッセージにもフォーマットが決まっていて、「ステータスライン」「HTTPヘッダー」「ボディ」の3つの部分で構成されています。また「ステータスライン」には、HTTPのバージョン、ステータスコード、解説文 の3つで構成されています。ステータスコードは 通信結果を数値 で表しています。

表2 HTTPレスポンスのステータスコード

例えば 403の場合は、アクセスが拒否された ことを表しています。最後の解説文はステータスコードの意味を人間が分る文字で表しています。403番だと「Forbidden」、また200番だと「OK」となります。 そして、HTTPヘッダーに続きデータの本体となるボディがWebサーバから送信されます。 

HTTPレスポンスのボディ

このようなボディがあった場合、Webブラウザは HTMLを解釈し、それに従った画像を表示 します。最近は動的なWebページをよく目にしますが、これらを表現するために、Flash、Ajax、HTML5 など様々な動的なWebを作成するための言語があります。

動的なWebアプリケーションには美味しいクッキーが必要?


これまで見てきたように、クライアントとWebサーバ間は非常に単純なやり取りをしています。

しかし、Webサーバは、クライアントとの個別のやり取りに関する「ステート=状態」を保持しない ため、HTTPは「ステートレス」なプロトコル と呼ばれています。Webが登場した当初は画像や文字を単純に表示することで利用していましたので、それで十分だったのです。

しかし Webアプリケーション (オンラインショップでの買い物など)などが一般的となった今は、このアプリケーションを動作させるために複数のWebページを切り替えて処理する必要がありますが、このステートレスなプロトコルでは以前のWebページの状態(買った商品名、数など)を引き継ぐことができません。

そこで、この問題を解決するために 「HTTP クッキー(Cokkie)」という仕組みが考えられました。

クッキーの基本的な仕組みは次の通りです。
Webサーバがクライアントにレスポンスを返す際に、HTTPヘッダーにクッキーをセット します(Set-Cookie:Key=Value)。クッキーを受け取ったWebブラウザは、サーバと再度やり取りをする際に受け取ったクッキーをHTTPヘッダーに含めて送信 します(Cookie:Key=Value)。こうすることで、セッション情報などといった、Webページの状態を保つことができる ようになります。

このHTTPクッキーは色々なところで利用することが可能です。例えば「セッション管理 SID」ではWebサービスへのログイン時の認証確認にも利用することが可能です。

ただし「HTTPクッキー」を使用する際には、セキュリティ上のリスク が多く含まれていることにも注意が必要です。例えばクッキーを改ざんして本人になりすまされ、知らぬまに高額なオンラインショッピングの決済がされてしまうことも起こりうることです。 このクッキー情報はWebブラウザの設定から削除することもできますので、共用のコンピュータなどで使用する際にはそういった処理が必要となります。

HTTPの次は?


さて、ここまでWebサーバの仕組みとして、HTTPを中心に、サーバとクライアント間がどのようなやり取りをしているのかということを中心にお伝えしてきました。

しかし、画面に文字や写真がなぜ表示できるのか?どうやってデータが送られているのか?まだまだ、ご紹介したいことがたくさんあります。次回はなぜWebサーバでプログラムが動くのか?その仕組みをご紹介していきたいと思います。どうぞお楽しみにしてください。

関連URL

筆者紹介

森本 良照

プロフィール

森本 良照(Yoshiteru Morimoto)

■技術分野
 クラウド・BigData関連・ストレージ関連技術
 
■取得資格
 NetApp NCDA 157
 VMware VCP 5.5 
 SAP Netweaver-ABAP Web AS 6.0

■趣味
 Running / Trail Running


Page Topへ