HTTP

前提ページ:クライアントサーバモデル
推奨ページ:ウェブページの仕組み

セキュアな Web サイトの作り方を学ぶ上で、Web サイトがどのように通信をしているかを知ることは重要です。このページでは Web 上の通信で利用される HTTP(S)について、学びます。


通信プロトコル

通信プロトコルとは、通信の手順やデータのフォーマットを決めたルール(規約)です。

プロトコルの例としては以下のようなものが挙げられます。

プロトコルの例

  • HTTP
  • FTP
  • SSH

HTTP

HTTP とは Web で利用される通信プロトコルです。

HTTPS

HTTPS は HTTP に暗号化・改竄検出をさせたものです。 HTTPS を利用しましょう。

HTTP(S) リクエストと HTTP(S) レスポンス

HTTP(S) はクライアントサーバモデルを採用しており、そのリクエストとレスポンスのことを、それぞれ HTTP(S) リクエスト、HTTP(S) レスポンスといいます。

HTTP(S) リクエスト

HTTP リクエストは、HTTP リクエストヘッダと HTTP リクエストボディから成り立っています。

HTTP(S) リクエストの例

POST /hello.php HTTP/1.1
Host: 127.0.0.1:4001
Connection: keep-alive
Content-Length: 9
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Referer: http://127.0.0.1:4001/
Accept-Encoding: gzip, deflate, br
Cookie: _ga=GA1.1.11882848.1574929583; _ga_J5E5G995V7=GS1.1.1574933002.2.1.1574936118.0

name=neko

HTTP(S) リクエストヘッダの例

POST /hello.php HTTP/1.1
Host: 127.0.0.1:4001
Connection: keep-alive
Content-Length: 9
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Referer: http://127.0.0.1:4001/
Accept-Encoding: gzip, deflate, br
Cookie: _ga=GA1.1.11882848.1574929583; _ga_J5E5G995V7=GS1.1.1574933002.2.1.1574936118.0

HTTP(S) リクエストボディ

name=neko

HTTP(S) レスポンス

HTTP レスポンスは、HTTP レスポンスヘッダと HTTP レスポンスボディ(=対象のファイル)から成り立っています。

HTTP レスポンスボディの中身は、実際に要求するファイルと一致することになります。

HTTP(S) レスポンスの例

HTTP/1.1 200 OK
Date: Sat, 30 Nov 2019 06:26:32 GMT
Server: Apache/2.4.38 (Debian)
Content-Encoding: gzip
Content-Length: 221
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8

<!DOCTYPE html>
<html lang="ja">
  <head>
    <!-- headで囲まれた部分は見えない -->
    <meta charset="UTF-8" />
    <title>Hello</title>
  </head>
  <body>
    <!-- 見出し -->
    <h1>Hello, neko . </h1>
    <!-- 文字 -->
    <p>I'm akakou.</p>
  </body>
</html>

HTTP(S) レスポンスヘッダの例

HTTP/1.1 200 OK
Date: Sat, 30 Nov 2019 06:26:32 GMT
Server: Apache/2.4.38 (Debian)
Content-Encoding: gzip
Content-Length: 221
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8

HTTP(S) レスポンスボディの例

<!DOCTYPE html>
<html lang="ja">
  <head>
    <!-- headで囲まれた部分は見えない -->
    <meta charset="UTF-8" />
    <title>Hello</title>
  </head>
  <body>
    <!-- 見出し -->
    <h1>Hello, neko .</h1>
    <!-- 文字 -->
    <p>I'm akakou.</p>
  </body>
</html>