hiyoko-programingの日記

プログラミングを勉強したてのひよっ子。   エンジニア目指して勉強中。

情報セキュリティの基礎

HTTP

HTTPとはWebブラウザとWebサーバの間でHTMLや画像ファイルなどのコンテンツの送受信に用いられる通信プロトコル。Webページを閲覧・利用することができるのも、HTTPという仕組みがあるからである。

 プロトコル

複数のユーザが滞りなく信号やデータ、情報を相互に伝送できるよう、あらかじめ決められた約束事や手順の集合のこと。
例えば人と人との会話を例にとると、片方が日本語で話し、もう片方がポルトガル語で話していては会話にならない。

https://tech-master.s3.amazonaws.com/uploads/curriculums//f7cd92f1c545156bf3bcdfe7d10654c0.jpeg

そこで、会話を成立させるためには使用言語をきちんと決める必要がある。この使用言語を何にするか決める役割が通信におけるプロトコルにあたる。

https://tech-master.s3.amazonaws.com/uploads/curriculums//ce2dcd67e415c21fd86f63f5a7eb57cd.jpeg

HTTPはクライアント、ここではブラウザからのリクエストに対して、サーバからのレスポンスが返ってくることによって実現する。

https://tech-master.s3.amazonaws.com/uploads/curriculums//27b929b4ef7741e618720ba2250589e0.jpeg

イメージとしては、飲食店と同じ。
飲食店に行ったとき好みの料理を注文する。すると、お店側は注文された料理を提供する。
HTTPもこれと同じでクライアントが要求したページをサーバ側がクライアントに合わせて提供するという仕組みになっている。

https://tech-master.s3.amazonaws.com/uploads/curriculums//6a3b6990891e48a4b207c0ba2402f1f4.jpeg

このやり取りをもう少し詳しく見てみる。
クライアントとサーバー間で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の情報(メッセージボディ)

ステータスラインを見てみるとリクエストメッセージに対して、

https://tech-master.s3.amazonaws.com/uploads/curriculums//3243ba8bbea7ca252358c79f545888b7.png

と返している。
これは「HTTP/1.1というバージョン下でリクエストを受け付けました」という意味を表している。
この画像に出てくるステータス番号はステータスコードとも呼ばれ、Webアプリケーションの状態を確認する際に非常に便利なものになっている。

 

 ステータスコード

ステータスコードとはHTTP通信のレスポンスメッセージのステータスライン中にある3桁の数字で、クライアントからのリクエストに対して、サーバからの返答はどのような状態かを提示してくれるのものになる。

これを知っておくと、Webページが正常に表示されないような状態の時にどこに原因があるのかがわかるようになるため、対策を取りやすくなる。

100の位に意味があり、そちらで分類されます。

ステータスコード 意味
100番台 処理が継続中
200番台 正常終了
300番台 リダイレクト
400番台 クライアント側でのエラー
500番台 サーバー側でのエラー

よく使われるステータスコードとしては、200(正常終了)、301及び302(リダイレクト)、404(ファイルが存在しない)、500(内部サーバーエラー)などがある。

セッション/クッキー(cookie)

HTTPは、ステートレスな通信となっている。
ステートレスとはサーバが現在の状態を保持せず、ユーザの入力の内容のみによって出力が決定される状態のこと。

https://tech-master.s3.amazonaws.com/uploads/curriculums//a121a03e89185df254984eaf4c4d463e.jpeg

しかし、Webアプリケーションを実装する中で、情報を維持しておきたい場面が多々ある。
例えば、ユーザのログイン状態やECサイトのカート機能など。これらは、ページが遷移してもユーザの情報や購入しようとしている商品の情報を保持している必要がある。
こういった状態を保持するために用いられるのがセッションであり、HTTP通信のセッションを管理するために作られた仕組みをクッキー(cookie)といい、このような通信をステートフル通信という。

https://tech-master.s3.amazonaws.com/uploads/curriculums//a84000854ad08a256e8dc90fc6d4300c.jpeg

 セッション

複数回に渡るリクエストにおいて、クライアントを特定するための仕組み。具体的には、クライアントは初回のリクエストで自身を識別させるIDをサーバーに渡す。以降、サーバーはそのIDを持ってクライアントを認識する。

 クッキー(cookie)

クライアント側のブラウザに保持することができる情報のこと。通常、初回の通信でサーバーがクライアントにクッキーとしてセッションIDを保持させ、以降クライアントはそれを用いてサーバーに対して自身を特定させる。

実際にクッキー(cookie)がどのように使われているかを見てみる。
まず、サーバー側で明示的にクッキー(cookie)を設定します、という宣言をする。
Railsでは、session_store.rbというファイル内でセッションの管理方法を指定する。デフォルトでクッキー(cookie)を利用する設定になっているため、Railsでは意識せずクッキー(cookie)でのセッション管理を行うことができる。

config/initializer/session_store.rb
1
TechReviewSite::Application.config.session_store :cookie_store, key: '_tech_review_site_session'

ログイン処理を例にとると、以下のような流れでクッキー(cookie)が利用される。

  1. クライアントはログイン画面でIDとパスワードを入力する
  2. すると、サーバでクッキー(cookie)が生成され、クライアントが保持する
  3. 次回以降アクセスする際に、クライアントが保持しているクッキー(cookie)がサーバに送信される
  4. サーバはこのクッキー(cookie)値を元にクライアントを識別し、ログイン作業を省く

まとめ

  • HTTPとはWebアプリケーションを利用する際にクライアントとサーバ間の情報をやり取りするための通信プロトコルである
  • セッションとは、Webアプリケーション上で前のページの状態を保持するために利用される機能である