web技術の基礎

備忘録のためweb技術の基礎をざっくりまとめました。

## web
### webとは
webとは、ネットワーク上でハイパーリンクという文書の参照によって文書がつながり、さまざまな文書を閲覧することが可能なシステム。

### インターネット
インターネットはコンピュータ同士を相互に接続し通信できるようにしたネットワークである。

webとインターネットは同じ意味で扱われやすいが、webは文書を閲覧するためのシステムで、インターネットはコンピュータを接続するネットワークのことである。

コンピュータがインターネットに接続されていることでwebを利用できる。


## Webの通信の流れ
webで何らかのコンテンツを閲覧する際の通信は大まかに以下の順番で行われる。
1. クライアント（ブラウザ）でURLを入力する
2. サーバーにコンテンツを要求するリクエストが送信される
3. リクエストを受け取ったサーバーがコンテンツを探す
4. サーバーがブラウザにリクエストの結果であるレスポンスを返す

ここでのコンテンツはHTMLや画像ファイルなどのことである。


## クライアント・サーバー
webの通信はクライアント・サーバーという2つのソフトウェアで行われる。

### クライアント
クライアントとはwebのコンテンツを閲覧するためのソフトウェア。ブラウザと呼ばれるのが一般的。

### サーバー
サーバーとは、HTMLや画像、CSSファイルなどのコンテンツが置かれている場所。サーバーはクライアントからの要求があればコンテンツを返す。



## HTTP
クライアントとサーバーはHTTPと呼ばれるプロトコルによって通信が行われる。
プロトコルというのは約束事やルールという意味で、HTTPの他にもTCPやFTPなどがあり、HTTPはHTMLをやりとりするためのプロトコルである。


## リクエスト・レスポンス
### リクエスト
リクエストとは、ブラウザからサーバーに送られるコンテンツの要求のこと。

リクエストには様々な情報が含まれるが、重要なのがHTTPメソッド。

#### HTTPメソッド
HTTPメソッドとはリクエストの種類を表し、大抵はGETかPOSTが使われる。

- GETはファイルを要求するときに使われる。またURLを使ってデータをサーバーに渡すことができる。
- POSTはフォームを使ってデータを送信する時に使われる。100%安全というわけではないが、見せたくないデータを送信できる。

### レスポンス
レスポンスとは、ブラウザからのリクエストに対するサーバーからの結果のこと。
リクエストに一致するコンテンツがあればコンテンツを返し、なければエラーを返す。

レスポンスに含まれる情報で重要なのがステータスコードとレスポンスフレーズ。

#### ステータスコード・レスポンスフレーズ
ステータスコードはレスポンスの結果を3桁の数字で表したもの。
よく見かける404や500などがこれにあたる。リクエストが成功した時には200が返されている。

レスポンスフレーズはレスポンスの結果を文字で表したもので、意味はステータスコードと対応している。200なら「OK」、404なら「Not Found」、500なら「Internal Sever Error」となる。


## URL
URLとはインターネット上のコンテンツの場所を示す文字列である。

URLは以下の情報で構成される。
- スキーム → 　コンテンツを取得する方法（webにおいてはほとんどの場合http）
- ホスト名 → 　コンテンツが存在するコンピュータ名（ドメインともいう）
- パス名 　→ 　ホストで指定されたコンピュータ内のコンテンツの場所（どのフォルダの中のどのファイル名か）


## IPアドレスとドメイン
どのコンピュータに接続するか識別するときはIPアドレスが使われる。しかしIPアドレスはただの数字の羅列のため人間にとっては扱いづらい。そのためURLでホストを指定するときにはドメインという文字列を使う。ドメインはDNSという仕組みを使って、IPアドレスに変換される。


## DNS
DNSとは、Domain Name Systemの略で、ドメインをIPアドレスに変換するための仕組みである。
あらかじめドメインとIPアドレスの対応表をもっているDNSサーバーに問い合わせることによって、ドメインと対応するIPアドレスを教えてもらうことができる。

## ポート番号
ポート番号とはコンピュータの中のアプリケーションの場所を示す番号のことである。IPアドレスだけだとコンピュータの場所がわかってもコンピュータの中のどのアプリケーションに通信すればいいのかわからないので、ポート番号によって判別する。

HTTPの通信の場合、ポート番号は80番となっているが、よく使われる番号のため省略可能である。


## ステートレスとステートフルの違い
HTTPでの通信はリクエストとレスポンスの一往復でやりとりが完結する。これをステートレスといい、クライアントとサーバーは通信するたびに初対面の状態ということになる。

反対に通信を繰り返しても状態を保持する通信をステートフルという。ステートフルが必要な例を挙げると、ログイン機能やECサイトのカート機能などである。

ステートフルな通信を実現するためにはCookieとセッションを使う。



## Cookie
Cookieはブラウザにデータを保存する技術のこと。Cookieは「名前＝値」の形で保存され、HTTPヘッダを使ってやり取りが行われる。

Cookieを使った通信の流れ
1. ブラウザからサーバーにリクエストを送信する
2. サーバーからのレスポンスにCookieを含めて返す
3. 同じサーバーにアクセスする場合はCookieを送り返す（それぞれのサーバーごとのCookieを使う）

Cookieはデータをそのまま保存され、またCookieのデータは知識があれば誰でも見ることができるため、セキュリティ的に問題がある。そこでCookieを安全に使いたい場合はセッションと組み合わせて使う。

## セッション
セッションとは、サーバーでデータを保存する技術のこと。セッションを使う場合、Cookieの中にはデータそのものを保存するのではなく、ブラウザとサーバーがお互いを識別するための一意の数字であるセッションIDを格納する。データそのものはサーバーに保存する。

セッションIDを使うことで、万が一Cookieの中身を見られたとしてもただの数字なので、セキュリティ的に安全である。またCookieに保存するデータの量も気にする必要はなくなる。

セッションを使った処理の流れ
1. ブラウザからサーバーにリクエストを送信する
2. サーバーはセッションIDを発行して、セッションの情報にブラウザから送信されたデータを保存する
3. サーバーからのレスポンスにセッションIDを格納したCookieを含めて返す
4. 次回同じサーバーにアクセスする場合はセッションIDを格納したCookieをリクエストに含めて送信する
5. リクエストを送られたサーバーはセッションIDを使ってデータを識別する

セッションを使っても使わなくてもどちらの場合もCookieを使ってやりとりすることに変わりはないが、Cookieの中にデータそのものを格納するか、セッションIDを格納するかが異なる。

## まとめ
- webとはインターネット上でコンテンツを閲覧するためのシステムである
- webのコンテンツを閲覧するためにはブラウザでコンテンツの場所を示すURLを入力して、コンテンツが置かれているサーバーにリクエストを送り、サーバーからその結果を返してもらう
- ブラウザとサーバーの一連の通信はHTTPというルールで行われる
- ステートフルな通信を実現したい場合にはCookieとセッションを使う


## 参考
[「プロになるためのWeb技術入門」 ――なぜ、あなたはWebシステムを開発できないのか ](https://www.amazon.co.jp/%E3%80%8C%E3%83%97%E3%83%AD%E3%81%AB%E3%81%AA%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AEWeb%E6%8A%80%E8%A1%93%E5%85%A5%E9%96%80%E3%80%8D-%E2%80%95%E2%80%95%E3%81%AA%E3%81%9C%E3%80%81%E3%81%82%E3%81%AA%E3%81%9F%E3%81%AFWeb%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%82%92%E9%96%8B%E7%99%BA%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E3%81%AE%E3%81%8B-%E5%B0%8F%E6%A3%AE-%E8%A3%95%E4%BB%8B/dp/4774142352)