web技術の基本用語解説

webを理解する上で土台となる技術を解説します。

# HTTPとは
インターネットには様々な種類のコンピュータがつながっています。webサーバとwebクライアントが通信を行うには、どのように情報をやりとりするかという取り決めが必要です。この取り決めを「**通信プロトコル**」といいます。

通信プロトコルにも様々なものがあります。そのため通信プロトコルが異なるコンピュータ同士では通信ができないのです。そこで、HTMLをやりとりするために定められたプロトコルが「**HTTP**」です

# リクエスト
リクエストとは、Webコンテンツの伝送を行うHTTPで、クライアントからサーバへ要求を伝えるメッセージのこと。送信してほしいファイルなどを指示する。

また、リクエストの際にパラメータを渡すことができます。パラメーターを渡す方法は2つあります。
- GETメソッド
- POSTメソッド

上記2つには大きな違いがあります。

具体例を見ていきましょう。
QittaのTOPページ[http://qiita.com](http://qiita.com)を開き、検索キーワードに「web」と入力して検索して、ブラウザのアドレスバーに注目してください。下記のようになっていると思います。
```
https://qiita.com/search?q=web
```
上記を見るとGETメソッドを使ってパラメータが渡されています。
検索キーワードとして入力した文字列が「q」というパラメータ名で渡されていることがわかります。

この結果を保存して後で見たい時は「ブックマーク」や「お気に入りに」保存することができます。

このように、GETメソッドではURLにパラメータが含まれるため、パラメータごとに記憶したり、人に伝えたりするのに便利です。このように同じ要求を何度繰り返しても同じ結果が得られることを「副作用がない」といいます。

一方、POSTメソッドでは、メッセージ・ボディにパラメータが含まれているために、ブックマークを使ったパラメータの保存はできません。

GETメソッドとPOSTメソッドの違いをまとめてみました。

|  | GETリクエスト | POSTリクエスト |
|:-:|:-:|:-:|
| 利用するメソッド  | GETメソッド  | POSTメソッド  |
| パラメータの格納場所  | URL  | メッセージ・ボディ  |
| セキュリティ  | 低い（URLが他人に見られる/WEBサーバにログが残る）  |  比較的高い（WEBサーバにログが残らないことが多い） |
| パラメータの長さ  |  古いソフトウェアではURLが255文字以内に制限される可能性あり |  制限なし |
| パラメータの保存・再現  | しやすい  | しにくい  |
| 副作用が発生しないこと  | 期待される  |  期待されない |

ログイン処理のようにユーザ名やパスワードといった機密情報を送信する場合や、決済処理など副作用を伴う処理、クエリ文字列に収まりきらない大量の情報を送信する必要がある場合は、POSTメソッドを使用すべきです。

前述の条件に当てはまらず、副作用がない処理ではGETリクエストを使用しようした方がパラメータごと保存できるというメリットを活かすことができます。

# レスポンス
レスポンスとは、Webコンテンツの伝送を行うHTTPで、サーバからクライアントから応答を伝えるメッセージのこと。HTTPステータスコードや要求されたファイルの内容などで構成される。

# ポート番号
ポート番号とは、TCP/IP通信において、 コンピュータが通信に使用するプログラムを識別するための番号です。 ポート番号は16ビットの整数であり、 0番～65535番まであります。

TCP/IP通信においては、 IPアドレスがあればネットワーク上のコンピュータを一意に識別することができますが、 該当コンピュータのどのプログラムに通信パケットを届けるかは、 IPアドレスだけでは決定できません。 どのプログラムに通信パケットを渡すのかを決定するために、 ポート番号を使用します。

例えば、クライアントがHTTPを使って通信する際は、 該当サーバのIPアドレスとポート番号80番を指定してパケットを送ります。 ここで、ポート番号80番を指定するのは、HTTPのサーバは、 80番ポートでパケットを待っていることが多いためです。 サーバ側では、80番ポートが宛先となっているパケットが届くと、 事前に指定しておいたそのポート宛のパケットを処理するプログラム(ApacheやIISなど)が動き、 パケットの中身を処理します。

上記のような仕組みにより、 クライアントからのパケットを受け取ったサーバは、 宛先のポート番号が80番であることからWebサービスを提供すれば良いことがわかり、 適切なプログラムで処理を行うことができます。 また、サーバがクライアント端末にパケットを返す時にも、 そのクライアント端末のIPアドレスとポート番号を指定して通信を行います。

このように、 TCP/IPネットワーク上でコンピュータ同士が通信を行う際には、 IPアドレスとポート番号をセットで用いて通信を行います。




# ステートレスとステートフルとは
ステートレスとステートフルは、直前にやりとりした相手の状態を以降のやり取りでも覚えているか覚えていないかです。
- ステートレス　
以前の情報を覚えていない
- ステートフル
以前の情報を覚えている

HTTPはステートレスなプロトコルです。
情報を保持しないのでHTTPではリクエスト、レスポンスの１往復のやり取りが完結された処理とみなされ複数の処理を関連付けることはできません。

一方、「状態を保持」しておき、次の処理内容に反映させるような方式をステートフルと言います。
ステートフルなシステムの場合は1対1の場合はサーバに負荷がかかることはないですが、1対多の場合は複数のクライアントの情報をサーバが保持しておく必要があり、負荷が高くなります。

Webシステムの場合は多数のクライアントからの接続が発生します。
なのでWebシステムで利用されるHTTPでは、状態を保持することなく要求された内容を応答するだけのステートレスな設計が適しています。

Webが進化するにつれて、HTTPがステートレスであるために困ることが増えてきました。

例えば、ログインやネットショッピングの買い物かごなどといった動作はWebサーバから見るとWebブラウザからの異なる動作(HTTPリクエスト)になります。
買い物カゴに入れた中身を確認しようとしても、サーバは前後のHTTPリクエストの関連性がわからないため買い物かごの中身を返すことができません。
実際のショッピングサイトでは、買い物かごに入れた商品を確認したり、商品を購入できたりします。
これはHTTPの機能を補完する別の仕組みとして、以前の状態を踏まえた上で次の動作を処理するといった、状態を保持し管理する仕組みが導入されているためです。

このようなときに使われる仕組みが**Cookie**です。

# Cookieとは
HTTPはステートレスなプロトコルであるため、WebブラウザとWebサーバは前後の通信の関連性がわかりません。
そのため、ショッピングサイトなどで状態を保持する必要がある場合はCookieと呼ばれるデータが使われます。

### Cookieの受け渡し
Webサーバへ接続してきたWebブラウザに対して、コンテンツなどと一緒にCookieのデータを送信します。
Cookieを受け取ったWebブラウザはそのデータをWebブラウザに保存します。
Webブラウザは次回以降、Webサーバにリクエストをする場合に保存しておいたCookieを一緒に送ります。
Webサーバは送られてきたCookieを見てどのブラウザからの要求かというのを判断するというわけです。

# まとめ
- **HTTP**はHTMLをやりとりするために定められたプロトコル
- **リクエスト**とはWebコンテンツの伝送を行うHTTPで、クライアントからサーバへ要求を伝えるメッセージのこと。
- **レスポンス**とはWebコンテンツの伝送を行うHTTPで、サーバからクライアントから応答を伝えるメッセージのこと。
- **ポート番号**とはIPアドレスとセットでコンピュータが通信に使用するプログラムを識別するための番号です。
- **ステートレス**とは直前にやりとりした相手の状態を覚えていないプロトコル
- **ステートフル**とは直前にやりとりした相手の状態を覚えているプロトコル
- **Cookie**とは、Webサイトを閲覧したときに、訪問者が訪れたサイトや入力したデータ、利用環境などの情報が記録される仕組み