情報セキュリティの基礎
HTTP
HTTPとはWebブラウザとWebサーバの間でHTMLや画像ファイルなどのコンテンツの送受信に用いられる通信プロトコル。Webページを閲覧・利用することができるのも、HTTPという仕組みがあるからである。
プロトコル
複数のユーザが滞りなく信号やデータ、情報を相互に伝送できるよう、あらかじめ決められた約束事や手順の集合のこと。
例えば人と人との会話を例にとると、片方が日本語で話し、もう片方がポルトガル語で話していては会話にならない。
そこで、会話を成立させるためには使用言語をきちんと決める必要がある。この使用言語を何にするか決める役割が通信におけるプロトコルにあたる。
HTTPはクライアント、ここではブラウザからのリクエストに対して、サーバからのレスポンスが返ってくることによって実現する。
イメージとしては、飲食店と同じ。
飲食店に行ったとき好みの料理を注文する。すると、お店側は注文された料理を提供する。
HTTPもこれと同じでクライアントが要求したページをサーバ側がクライアントに合わせて提供するという仕組みになっている。
このやり取りをもう少し詳しく見てみる。
クライアントとサーバー間でHTTP通信を行う際はメッセージのやり取りを行う。
まず、クライアントからサーバーに対して以下のようなリクエストメッセージを送信する。
HTTPリクエスト |
---|
GET / HTTP/1.1 リクエストライン |
Accept: image/gif, image/jpeg, / ヘッダ |
Accept-Language: ja |
Accept-Encoding: gzip, deflate |
User-Agent: Mozilla/4.0 (Compatible; MSIE 6.0; Windows NT 5.1;) |
Host: www.xxx.zzz |
Connection: Keep-Alive |
(空行) |
メッセージボディ(POSTメソッドなどで使用) |
簡単に説明するとwww.xxx.zzz というアドレスに対してHTTP/1.1というバージョンを使い、GETメソッドで"/"パスにアクセスしたい、というメッセージをクライアントからサーバに送っているという意味になる。
それに対してサーバは以下のようなレスポンスメッセージを返す。
HTTPレスポンス |
---|
HTTP/1.1 200 OK ステータスライン |
Date: Sun, 11 Jan 2004 16:06:23 GMT ヘッダ |
Server: Apache/1.3.22 (Unix) (Red-Hat/Linux) |
Last-Modified: Sun, 07 Dec 2003 12:34:18 GMT |
ETag: "1dba6-131b-3fd31e4a" |
Accept-Ranges: bytes |
Content-Length: 4891 |
Keep-Alive: timeout=15, max=100 |
Connection: Keep-Alive |
Content-Type: text/html |
(空行) |
htmlやcssの情報(メッセージボディ) |
ステータスラインを見てみるとリクエストメッセージに対して、
と返している。
これは「HTTP/1.1というバージョン下でリクエストを受け付けました」という意味を表している。
この画像に出てくるステータス番号はステータスコードとも呼ばれ、Webアプリケーションの状態を確認する際に非常に便利なものになっている。
ステータスコード
ステータスコードとはHTTP通信のレスポンスメッセージのステータスライン中にある3桁の数字で、クライアントからのリクエストに対して、サーバからの返答はどのような状態かを提示してくれるのものになる。
これを知っておくと、Webページが正常に表示されないような状態の時にどこに原因があるのかがわかるようになるため、対策を取りやすくなる。
100の位に意味があり、そちらで分類されます。
ステータスコード | 意味 |
---|---|
100番台 | 処理が継続中 |
200番台 | 正常終了 |
300番台 | リダイレクト |
400番台 | クライアント側でのエラー |
500番台 | サーバー側でのエラー |
よく使われるステータスコードとしては、200(正常終了)、301及び302(リダイレクト)、404(ファイルが存在しない)、500(内部サーバーエラー)などがある。
セッション/クッキー(cookie)
HTTPは、ステートレスな通信となっている。
ステートレスとはサーバが現在の状態を保持せず、ユーザの入力の内容のみによって出力が決定される状態のこと。
しかし、Webアプリケーションを実装する中で、情報を維持しておきたい場面が多々ある。
例えば、ユーザのログイン状態やECサイトのカート機能など。これらは、ページが遷移してもユーザの情報や購入しようとしている商品の情報を保持している必要がある。
こういった状態を保持するために用いられるのがセッションであり、HTTP通信のセッションを管理するために作られた仕組みをクッキー(cookie)といい、このような通信をステートフル通信という。
セッション
複数回に渡るリクエストにおいて、クライアントを特定するための仕組み。具体的には、クライアントは初回のリクエストで自身を識別させるIDをサーバーに渡す。以降、サーバーはそのIDを持ってクライアントを認識する。
クッキー(cookie)
クライアント側のブラウザに保持することができる情報のこと。通常、初回の通信でサーバーがクライアントにクッキーとしてセッションIDを保持させ、以降クライアントはそれを用いてサーバーに対して自身を特定させる。
実際にクッキー(cookie)がどのように使われているかを見てみる。
まず、サーバー側で明示的にクッキー(cookie)を設定します、という宣言をする。
Railsでは、session_store.rbというファイル内でセッションの管理方法を指定する。デフォルトでクッキー(cookie)を利用する設定になっているため、Railsでは意識せずクッキー(cookie)でのセッション管理を行うことができる。
1 |
TechReviewSite::Application.config.session_store :cookie_store, key: '_tech_review_site_session'
|
ログイン処理を例にとると、以下のような流れでクッキー(cookie)が利用される。
- クライアントはログイン画面でIDとパスワードを入力する
- すると、サーバでクッキー(cookie)が生成され、クライアントが保持する
- 次回以降アクセスする際に、クライアントが保持しているクッキー(cookie)がサーバに送信される
- サーバはこのクッキー(cookie)値を元にクライアントを識別し、ログイン作業を省く
まとめ
- HTTPとはWebアプリケーションを利用する際にクライアントとサーバ間の情報をやり取りするための通信プロトコルである
- セッションとは、Webアプリケーション上で前のページの状態を保持するために利用される機能である