プロになるためのWeb技術入門を読んで学んだこと



# はじめに
「プロになるためのWeb技術入門〜なぜあなたはWebシステムを開発することができないのか〜」を読んで、エンジニアであるならば必ず説明できないといけない基礎事項について簡単にまとめてみました。Webアプリケーションの勉強を始めたばかりのエンジニア一年生の方などの理解の助けになることができれば幸いです。

![Qiita](https://m.media-amazon.com/images/I/91z0VEdF1xL._SY522_.jpg)

## リクエストとレスポンスとは？
　**リクエスト**とは**WebクライアントからWebサーバに対する要求のこと**を、**レスポンス**とはWebサーバから**Webクライアントに対する応答のこと**を指します。ここでいうWebクライアントとは私たちが日々利用しているGoogleやSafariなどのwebブラウザのことを、WebサーバとはPCやスマホなどからの要求に対して適切なデータを提供することができるコンピュータのことを意味しています。
 　例えば、私たちがこのWebページを見たいなと思い、検索エンジンにURLを入力し、Enterキーを押したとします。サーバはその要求に対して適切なHTMLファイルを探し出し、クライアントであるあなたのブラウザにそのURLと紐づいたWebページを表示させます。この例の中で、検索スペースにURLを入力し、Enterボタンを押すことがリクエストと呼び、HTMLファイルをクラインアントに返す動きをレスポンスと呼びます。

## プロトコルとは？
 **プロトコル**とは**WebサーバとWebクライアントが情報をやり取りする際の取り決めのこと**を言います。
 プロトコルと一口に言っても、ファイル転送のためのプロトコルである**FTP**やメール転送のためのプロトコルである**SMTP**、現在最も幅広く利用されており、HTMLファイルのやり取りをするために定められた**HTTP**など様々なものがあります。
 さらに上記で挙げてきたプロトコルはある土台となるプロトコルによって支えられています。そのプロトコルの名を**TCP/IP**と言います。**TCP/IP**とは私たちの生活には欠かせない郵便局の役割ととても似ています。私たちが手紙を送る際に住所と宛名を書いてポストに投函すれば、郵便局の方々が届けてくれます。同様にインターネットの世界でもIPアドレス宛先さえ指定すれば、**TCP/IP**が責任を持って情報を届けてくれます。具体的にはHTTPリクエストなどの情報をパケットと呼ばれる小さな単位に分割し、送信して、受け手側の**TCP/IP**で分割された情報を組み立ててから、Webサーバに渡しています。

## ステートフルとステートレスとは？
 **ステートフル**とは**状態を持っているということ**を意味であり、一方で**ステートレス**とは**状態を持たないということ**を意味しています。
 例えば、１０００円カットと高級美容室の違いについて思い浮かべてください。１０００円カットでは、回転率を最優先に営業をしているため、お客様1人1人の記録を残していないお店がほとんどだと思います。つまりお客様は切ってもらうたびに希望の髪型を伝えなければなりません。言い換えれば、お客様の記録を取っていないため、希望の髪型を毎回ヒアリングしなければならない、つまり**ステートレス**であるというわけです。その一方で、高級美容室ではどのようなお客様がどんな髪型をオーダーし、どのスタッフが対応したのかなどを記録していることが当たり前となっています。そのため、次回来店した際に「いつもの髪型でお願いします」と伝えれば、希望通りの髪型にしてもらうことができるはずです。つまりお客様が前回オーダーした髪型の記録を残すことによって、お客様に対して余計な手間をかけさせないことを可能にしているのです。お客様の状態を美容院側が把握している、つまり**ステートフル**を基本としているので、このようなサービスを実現することができたことになります。
 上記で挙げたような例はプロトコルにも当てはまります。プロトコルでいう**ステートフル**とは、**リクエストに伴い状態が変わっていく、つまり状態を持ち続けるプロトコル**ということを意味しています。例えば、FTPがそれにあたります。 FTPでは、ユーザー側がまずログインしてサーバ側に許可を貰わなければ、コマンドを受け付けてもらえません。これは前回のリクエスト結果を踏まえて、サーバとユーザーがやり取りを行なっているためです。他方で、**ステートレスプロトコル**とは**FTPのような通信の手順を必要とせず、状態というものを持たないプロトコル**のことを言います。前回のリクエスト結果に関わらず、1回のリクエストで用事が済むHTTPはステートレスのプロトコルであると言えます。

## クッキー
　**クッキー**とは**Webブラウザに状態を持たせ、WebアプリとWebサーバの間で情報交換をできるようにした技術**のことを言います。具体的にどのようにして**クッキー**が利用されているかというと、WebサーバからWebブラウザへHTTPレスポンスのヘッダを利用して小さな情報が送られます。その情報は名前=値という組み合わせで送信されており、これがクッキーと言われるものとなっています。Webサーバからクッキーを受け取ったwebブラウザは何かしらリクエストを行う際に、それをHTTPリクエストヘッダに入れて、送り返します。そうすることによって、Webサーバ側は誰がアクセスしてきたかを把握することができるようになります。
 身近な例でいうと、ログインしていない状態でURLを入力し、ショッピングサイトのホームページに移行しようとしてもログインすることはできません。これはログインしてWebサーバからパスワードなどをクッキーを取得してないことが理由です。

 <img src="https://www.soumu.go.jp/main_sosiki/joho_tsusin/security_previous/kiso/illust/cookie.gif">

 引用:https://ponsuke-tarou.hatenablog.com/entry/2020/09/14/225825

 ## ポート番号
 **ポート番号**とは受信した情報がどのようなプロトコルで、どのアプリケーションが処理すべきかをホストサーバ内で識別するための番号のことを言います。インターネット上で情報を届けるためには、IPアドレスと上記の**ポート番号**を同時に指定する必要があります。ただし、HTTPなどよく利用されているプロトコルについては使用するポートを取り決められているため、ユーザー側が意識をしなくても問題なくWebサイトを閲覧することができます。このように代表的なプロトコルで使用されているポート番号のことウェル・ノウン・ポートと言います。

|ポート番号| プロトコル|
|:-:|:-:|
| 20,21  | FTP（ファイル転送  |
|  22 |   SSH（暗号化されたリモートコンピュータとの汎用通信）|
|  23 |   Telnet（リモートコンピュータとの汎用通信）|
|  25 |   SMTP（メール送信）|
|  53 |   DNS（ホスト名解決）|
|  80 |   HTTP（Webブラウジング）|
|  110 |   POP3（メール受信）|
|  443 |   HTTPS（暗号化されたHTTP）|