前提
AWS(HTTP)について学んだことを書いていきます。
本題
HTTPの動きを確認
Webサーバーを構築し、Webブラウザでアクセスできるところまで確認した上で、WebブラウザとWebサーバー間は、「HTTP」というプロトコルを使い、データをやりとりする。
HTTPとは
普段利用しているWeb通信では、HTTP(Hyper Text Transfer Protocol)という通信プロトコルが使われている。
HTTPは直訳すると、ハイパーテキストを伝送するための通信規約であり、HTMLをはじめとするWebサービスに必要とされる情報を伝達するためのルール。
※ハイパーテキストとは、リンク(ハイパーリンク)同士で結び付けられたテキストのことを言う。
Webサイトを利用していると、404 Not foundや500 Internal Server Errorなど、数字を伴ったエラー画面に遭遇したことがあるかと思う。
これらの数字はHTTPで定義されたコードである。
404は対象のリソースが見つからない、500はサーバー側で何かしらのエラーが発生した。と言う意味がある。
HTTPは、クライアント・サーバー型のアーキテクチャーである。
2者間でリクエスト(要求)とレスポンス(応答)をやりとりする方式を定めている。
リクエストとレスポンスの書式
リクエストとレスポンスは、それぞれ3つのパートで構成される。
1、リクエスト
リクエストライン、ヘッダー、ボディで構成される。
・リクエストライン
POST / HTTP/1.1
・ヘッダー
Host: www.google.co.jp
Connection: keep-alive
User-Agent: Mozilla/5.0(Windows NT 6.1;WOW64)
・ボディ
Keyword=AWS
リクエストラインは、要求コマンドのこと。
要求方法と要求するURLが含まれる。
ヘッダーは、ブラウザから送信する追加情報。
例えば、要求したいホスト名(Hostヘッダー)、ブラウザの種類(User-Agentヘッダー)や対応言語(Languageヘッダー)、Cookieの情報(Cookieヘッダー)や直前に見ていたページのURL(Refererヘッダー)などが含まれており、多くの場合、複数行に渡る。
ボディはHTMLフォーム(form要素)やAjaxなどで、POSTというメソッドを利用し、データをサーバーに送信するときに利用される。
ヘッダーとボディとは、空行(改行だけの行)で区切られる。
2、レスポンス
ステータスライン、ヘッダー、ボディで構成される。
・ステータスライン
HTTP/1.1 200 OK
・ヘッダー
Date: Wed, 09 Apr 2014 06:38:47 GMT
Cache-Control: private, max-age=0;
Content-Type: text/html; charset=UTF-8
・ボディ
ステータスラインは、その要求の成否を返すもの。
正常に終了すれば200 OKというステータスが返される。
見つからない時は404 NotFound、サーバー側で何かしらのエラーが発生した時は500 Internal Server Errorが返される。
ヘッダーは追加情報を返すために利用される。
よく使われるものとして、ボディ部の種類を示すContent-Typeヘッダーや、ボディの長さを示すContent-Lengthヘッダーなどがある。
多くの場合、複数行にわたる。
ボディは、要求されたURLに対するコンテンツ。
HTMLのテキストや画像など、要求されたコンテンツデータそのもの。
ヘッダーとボディとは、空行(改行だけの行)で区切られる。
リクエストとレスポンスの詳細
HTTPメソッド、HTTPステータスコード、リクエスト/レスポンスヘッダーについて詳細を見ていく。
・HTTPメソッド
HTTPメソッドとは、コンテンツに対する操作コマンドのこと。
多くの場合GETまたはPOSTが使われる。
GET リソースを取得する。
POST リソースにデータを送信したり、子リソースを作成したりする。
HEAD リソースのヘッダー情報だけを得る。
PUT リソースを更新したり、作成したりする。
DELETE リソースを削除する
OPTIONS サーバーがサポートしているメソッドを取得する。
TRACE 自分宛にリクエストメッセージを返してループバックテストする。
CONNECT プロキシ動作のトンネル接続を変更する。
ブラウザのアドレス欄にURLを入力してアクセスしたり、画像を参照したり、リンクをクリックして飛んだりした時など、コンテンツを取得する時に一般に使われるのがGETメソッド。
POSTメソッドは、
POSTメソッドでは、入力フォームに入力されたデータなど、クライアントからWebサーバーに向けて送信するデータをボディ部につけて送信する。
ボディ部には、任意のデータを付けられるため、ファイル送信も可能。
・HTTPステータスコード
結果の成否を示す値。
3桁の数字で構成され、百の位の数字で大まかな成否が決まり、残りの桁で詳細なステータスが決まる。
1xx 処理中 何か処理中のことを伝える時に用いる。
2xx 成功 成功したことを示す。
3xx リダイレクト 別のURLにリダイレクトする。
4xx クライアントエラー クライアント側のリクエストにエラーがある。
5xx サーバーエラー サーバー側のエラー。
成功した時は、一般に200 OKが返る。
しかし、リダイレクトする場合には、301、302、303のコードが返されることがある。
また、コンテンツが更新されていない時は、304のコードが返されることもある。
301、302、303の応答を受け取った場合、ブラウザは自動的に指定されたリダイレクト先に再接続し、コンテンツを取得しようとする。
■HTTPからHTTPSへのリダイレクト
近年は、セキュリティを高めるためhttp://でアクセスしてきた時にhttps://(SSLで暗号化された通信)にリダイレクトする実装が流行。
そのように構成されたWebサーバーはhttp://でアクセスした時に、301 Moved Permanentlyというステータスコードを返すように実装されている。
・リクエストヘッダー
リクエストヘッダーは、クライアントからサーバーに送信する時に送られるヘッダー。
よく使われるリクエストヘッダーには、次のようなものがある。
・HTTPヘッダー
Hostヘッダーは、要求を送ろうとするホスト名を記述している。
HTTPには、HTTP1.0とHTTP1.1の2つのバージョンがある。
現在では、ほとんどの場合、HTTP1.1が使われている。
HTTP1.1では、Hostヘッダーの送信が必須。
・User-Agentヘッダー
ブラウザの種別を示す。
Webシステムを構築する時は、このUser-Agent文字列を元にブラウザやOSを判断し、処理分岐を実装することがある。
・Cookieヘッダー
Cookie情報を送信するもので、サーバー側から、以前にSet-Cookieヘッダーで送信されてきたものと同じデータをそのまま返す役割をする。
Cookieは、例えばユーザーがログインした時に、そのログイン情報を保存する時などに使われる。
つまり、Cookieにはログインしたユーザーと結びつける情報が格納されていることがあり、Cookieが漏洩すると第三者が自分に成りすましてしまう危険がある。
・レスポンスヘッダー
サーバーからクライアントに返す時に送信される情報。
よく使われるレスポンスヘッダーには、下記のようなものがある。
・Content-Typeヘッダー
ボディ部のコンテンツの種類を示す。
text/htmlであれば、HTMLとしてユーザーに表示する。
画像ならimage/jpegやimage/pngなどとなる。
PDFファイルならapplication/pdf。
application/octet-streamが返された時は、多くのブラウザは、ファイルを保存するダイアログボックスを表示する。
このようなコンテンツの種類は、MIMEタイプ(Multipurpose Internet Mail Extension Type)とも呼ばれ、その一覧は、IANAのWebサイトで確認できる。
※Apacheを含む、ほとんどのWebサーバーは静的なコンテンツを返す時、そのファイルの拡張子によって適切なContent-Typeヘッダーを返すように構成されている。
この設定が間違っていると、クライアント側でファイルが開けなかったり、いつもと違うアプリケーションが起動してしまったりという問題が起きる。
・Dateヘッダー
コンテンツの日付を示す。
・Set-cookieヘッダー
Cookieを設定する。
Telnetを使ってHTTPをしゃべってみる
ここまでは、ブラウザがHTTPプロトコルで通信するところを見てきたが、自らの手を動かしてHTTPプロトコルで通信することもできる。
そのために必要なものは、Telnetクライアントだけ。
Telnetとは、汎用的な双方向8ビット通信を提供する端末間およびプロセス間の通信プロトコルで、リモートコンピュータとやりとりするための仕組み。
暗号化されていないSSH。
ルーターにログインして各種設定をする時などに、よく使われる。
Telnetクライアントは、単純にテキストをやりとりする機能だけをもつ。
普通の使い方では、接続先はTelnetサーバー。
TelnetサーバーはSSHサーバーと同様に、ログインおよび何らかのコマンドを受け付ける。
しかし、接続先を変更すると任意のサービスに接続できる。
例えば、HTTPのウェルノウンポートである80番に接続し、HTTPプロトコルに従って文字列を送れば、サーバーからHTTPのレスポンスを得ることができる。
まとめ
Web APIを使った開発や、Webアプリケーション、API自体の開発をするにはHTTPの理解が必須。
開発者の多くは、APIを開発するときにはFirefoxの開発者ツールなどを使って通信を覗き見ながら、開発している。