IT社員3人組によるリレーブログ

某IT企業に勤める同期3人が、日常で思ったことを記録していきます (twitter: @go_mount_blog)

httpとは 〜みんな毎日http通信してるんだから基本ぐらい抑えておこう!

どうも、ITコンサルタントのShoheiです。
今日はhttpについて説明していきます。
※Verion 1.1をベースに説明していきます

そもそもhttpってなんだろう

よくホームページ等をみたりするとき、URLと言ってhttpやhttpsから始まる文字列が表示されますよね。(例: https://go-mount.hatenablog.com)
あれは、これはhttp(https)というプロトコルでWebサーバとやりとりしますぜと宣言をするための文字列です。(Webサーバの説明はWebサーバって何??脱IT初心者! - IT社員3人組によるリレーブログ を参照ください)
プロトコルは何かというと、通信をするための約束事のことです。
以下の図のように、通信をする際は必ず相手とどんなプロトコルでやりとりするかが明確になっている必要があります。
f:id:go-mount:20180929143027p:plain

httpプロトコルの超概要

では、httpプロトコル(約束事)では何が約束されているのでしょう。
要点だけ、概要でお伝えします。

クライアントサーバモデルのやりとりを前提としている

横文字出てきましたがまだ難しくないので離脱しないでね。要はこういうこと。
f:id:go-mount:20180929144459p:plain
例えばブラウザ(IEとかFirefoxとかSafariとかChromeのことね)開いて、何もしていないのに勝手にITリレーブログの記事が出たり、Youtubeで動画流れ始めたりしないですよね。
Webページを表示するためには、URLをいれるとか、検索をするとか、なんらかのアクションが必要。
このアクションは、リクエスと呼ばれていて、リクエストをしたPCはクライアントと呼ばれます。
リクエストは誰に飛ぶかというと、欲しい内容を持っているWebサーバに飛びます。
httpではこの、「これちょうだい!(リクエス)」「了解、送るね!(レスポンス)」が必ずセットになるプロトコルです。

何をもらうの

リクエストで何をもらうかというと、Webページのコンテンツ(htmlファイルなど)です。
それを受け取ったクライアントはは、データを組み立ててブラウザに表示させます。
こうしてみなさんが今見ているページの表示が実現されます。

やりとりはどんな形で行われるの

こんな感じです。
f:id:go-mount:20180929150229p:plain
通訳書いているので事細かには説明しないですが、二点だけ解説。

メソッドとは

リクエスト側は、依頼を出す際に、メソッドというものを指定します。
今回の例ではGET(くれ)を指定しましたが、メソッドには以下のようなものがあり、それぞれWebサーバにリクエストとして指定することができます。一例を紹介。

  • GET: それくれ
  • HEAD: お前のもってる情報の一部だけくれ
  • POST: 逆にお前にこの情報やるよ
  • PUT: 逆にお前にファイル送るわ

レスポンスコードとは

逆にリクエストに答える側は、リクエストがどう処理されたか(レスポンスコード)をセットで返すことになっています。
今回は 200 OK、正常に受理されたぜ、という内容を返していますが、他にも以下のようなレスポンスコードがあります。一例を紹介。

  • 200 OK: 正常にリクエストを処理したよ
  • 301 Moved Permanently: そのURL古くて、今は別のところにあるんだわ
  • 400 Bad Request: いやリクエスト意味不明。間違ってない?
  • 401 Unauthorized: 君は認められてないよ (認証が必要だよと伝えるケースと、認証が間違ってるよと伝えるケースあり)
  • 404 Not Found: そんなコンテンツないぜ? (男が悲しむ"This video has been deleted"的な)
  • 500 Internal Server Error: ごめん、Webサーバ側の問題でエラーだわ

失敗をしているのは400代と500代。400代はクライアント側の問題だよ、500代はサーバ側の問題だよ、という内容になっています。

http(Version 1.1)の特徴

httpの特徴はシンプルさですかね。「くれ」「やるよ」が基本となり、余計なことはやらない。
ただ、逆に余計なことをやらなすぎて、今の時代に必要な機能がないことで、必要な機能をhttpプロトコル外で実装する必要があります。例をあげます。

セキュリティ的に弱い

例として、データが平文(暗号化されていない状態)で飛んでしまうという点があります。
この状態では、もしもやりとり中のデータを横取りされたら、クレカ情報でもなんでも盗み取られてしまいます
➡︎そのため重要なデータを扱うようなページはhttpではなく httpsというプロトコルを使われることが多いです

状態管理ができない(ステートレスといいます)

「くれ」「やるよ」のやりとりが一回成功したら、クライアントもサーバも「何をやりとりしたか」は忘れることになっています。だからhttpプロトコルの機能だけだけでいうと、ショッピングサイトにログインした後、同じサイト内でも他のページに移動すると(再度リクエストを送ると)ログインし直さないといけない、という状態になってしまいます
➡︎これについてはCookieなどの技術でカバーされています

リアルタイムな更新に向いていない

基本ルールは、1コネクション1リクエスト。またリクエストを出さないとレスポンスを受け取れないので、変更があった際にサーバ側から自動的にレスポンスが送られてくることもありません。クライアント側で定期的にリクエストを生んだりすることでカバーはできますが、その場合更新が起きていない場合、無駄なリクエストが発生してしまします。
➡︎WebSocketやSPDYなど別のプロトコルと併用することでカバー

http/2の登場

上記の課題に対処するために、2015年にhttpのversion2が出ています。
version2についての詳細はここではふれませんが、ブラウザとサーバ側で対応しないと2は使えません。主要ブラウザは対応していますが、サーバ側はまだまだ普及仕切っていない状況です。
試しにこのブログのプロトコルも調べて見ましたが、まだVersion1.1が使われていますね。逆に約20年前のプロトコルが今でも使われているのは、すごいことだとも思います。
f:id:go-mount:20180929154704p:plain

書籍紹介

この知識は、以下の本から得ました。グーグルに勤めている知り合いにおすすめされて読んだんですが、確かにおすすめですよ。読みやすいし、会社名など具体的な例をだしてくれるし、Web関連の攻撃の解説も全て具体的で非常にわかりやすい。
少し古い本なのでversion 2の解説はないですが、httpの基礎を学ぶにはかなりおすすめです。

HTTPの教科書

HTTPの教科書

まとめ

httpの基礎について説明しました。