クッキーとセッションについて

####クッキーとセッションの違いは？
主にステートフルな通信を実現するためにそれぞれ利用され、
クッキーはサーバーからクライアント側に付与する情報（セッションID）の仕組みで、
セッションはサーバー側に保存される一連の操作や通信のことです。

上記の意味が理解できるように噛み砕いてアウトプットしていきます。

#まずHTTPについて
Hypertext Transfer Protocol （ハイパーテキスト・トランスファー・プロトコル）の略

ハイパーテキストとは、端的に言えばHTMLなどで書かれたファイルのことです。
トランスファーは、渡すという意味です。
プロトコルは規約や決まり事という意味です。

つまり、
#####『 HTTPとはHTMLファイルなどを渡すための決まり事 』 という意味です！


HTTPで定められた決まり事に従うことで、クライアントとサーバーで意思の疎通ができるようになっています。


###Webページの表示は？
クライアントとサーバーでデータのやり取りをすることでWebページが表示されます。
クライアントがサーバーへ「このURLのWebページのデータをください」と要求することをリクエストと呼びます。
クライアントからの要求に応じて、サーバーからクライアントへWebページのデータを渡すことをレスポンスと呼びます。

####　イメージの図
　　ーーーーーーーーーー　　接続開始　　ーーーーーーーーー
![https___qiita-image-store.s3.amazonaws.com_0_72985_e98c5fb4-478c-66fd-5648-19cd8ddfc600.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/923115/764fdcf1-9ea2-e061-3e15-ee08304923d5.png)
　　ーーーーーーーーーー　　接続終了　　ーーーーーーーーー
　　ーーーーーーーーーー　　接続開始　　ーーーーーーーーー
![https___qiita-image-store.s3.amazonaws.com_0_72985_e98c5fb4-478c-66fd-5648-19cd8ddfc600.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/923115/688f2ad4-bca3-39f7-bfa9-36b0995fb37c.jpeg)
　　ーーーーーーーーーー　　接続終了　　ーーーーーーーーー



HTTPは、リクエストし、レスポンスする、この1往復で通信が切断されます。
そのため、サーバーは、前のページからの続きなのか、関連したアクセスなのか、以前の状態を全く覚えておらず、そのことをステートレスと言います。
ステート（state）とは状態という意味で、レス（less）が付くので、状態が無いという意味になります。

ステートレスだと、、、
ログイン画面でログインした後に、そのログイン情報を次の画面に引き継げないといった問題が出てくる。
また、ネットショッピングのように商品を購入できるWebサイトは作れません。
ページ遷移するたびに、通信は切断されているため誰がカートに入れ、購入したのかを全く覚えていません。
問題を解決するには状態を保持（ステートフル）にする必要があるということです。
ここでやっと、出てくるのが
　『　Cookie（クッキー）　』です！！！
方法としては、サーバーがクライアントに対して識別できる一意の値を渡し、クライアントはリクエストするときに、その値を教えてあげれば、サーバー側で識別できるようになり、それぞれの状態を覚えることができます。

ここまでで、
HTTPはリクエストしレスポンスする、この1往復で通信が切断されてしまうこと。
しかし、ステートフルにする必要があることが理解できましたでしょうか？

#Cookie(クッキー)について

Cookieは、クライアントに保存された情報のことです。

図を参考に説明していきます。
![58ad4f4d-63a9-4d12-bfde-db8e11bbdd8c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/923115/e0090b3c-07fd-8bfe-2b80-97bbe184e45b.png)

（初回）
①リクエスト　
クライアントからサーバーに何らかのリクエストを送る
②レスポンスヘッダ経由でクッキーを発行　
サーバーからのレスポンスメッセージに「Cookieを保存してください」という指示を送る
③クッキーを保存
クライアントは指示に従い、Cookieを保存する。
（2回目）
④次のリクエストでクッキー情報を送信
クライアントにCookieが保存されているためクライアントは、常にリクエストメッセージに「このようなCookieがあります」とサーバーに教える仕組みになっているため、リクエストの際に毎回クッキー情報も送信する。
⑤送られてきたクッキーの処理
クッキー情報によりサーバーはクライアントの情報を識別でき、それぞれの状態を覚えることができる。
⑥クッキーに基づいて生成された画面を出力
送られてきたクッキーの処理によりサーバーはクライアントの情報を識別でき、それぞれの状態を覚えることができたため
あとはリクエストに対してのレスポンスを送る

ここまでの説明で　
クッキーはサーバーからクライアント側に付与する情報（セッションID）の仕組み　
ということが理解できましたでしょうか？

#session(セッション)について
セッションはサーバー側に保存される一連の操作や通信のことです。
また、sessionにはIDを割り振って管理します。
##Cookieによるセッション管理についての流れ

（初回アクセス）
1、クライアント：　クライアントはあるファイルにアクセスし、リクエストを送る

2、サーバー　：　リクエストを受け、サーバーではセッションIDを発行し、セッションファイルを作成
　　　　　　　 セッションIDをCookieに保存するようにレスポンス

3、クライアント：　セッションIDをCookieに保存

（2回目アクセス）
1、クライアント：　クライアントは初回と同じファイルにアクセスし、リクエストを送る
　　　　　　　 その際に「セッション情報に保存してください」と指示する。
　　　　　　　 例）セッション情報に name というキーに 山田 という値を保存してくださいと指示

2、サーバー　：　該当するセッションファイルにリクエストされた情報を保存

（3回目アクセス）
1、クライアント：　クライアントは初回と同じファイルにアクセスし、リクエストを送る
　　　　　　　 その際にセッションファイルにある name の値をくださいと指示

2、サーバー　：　リクエストの指示に従い、 name の値である山田という値をレスポンスする


このような流れでクッキーによるセッション管理が行われています。

##クッキーとセッションの違いは？
クッキー>>　クライアント側に値を保存
　　　　　 　データ改竄の可能性あり

セッション>>　サーバー側に保存
　　　　　　　データ改竄の可能性は低い
　　　　　　　取り出すにはsessionID をサーバーに送信する必要あり


セッション情報は、サーバー側に保存されるため、Cookieのように偽装されることはありません。
そのため、偽装されて困るデータは、クライアント側（Cookie）ではなくサーバー側（セッションファイル）に保存するようにしましょう。


#まとめ（感想）
今回は、クッキーとセッションについて理解不足なところがあったため再度勉強しました。
いろいろな資料をみてみましたが、文章だけでは理解できなかったので図や絵を参考にしながら、実際に理解できたか紙に書いて説明してみたりしましたが、、、最初はわかったつもりでも全然説明できませんでした。。。笑
アウトプットすることで、自分の説明できないところ＝理解できていないところと明確にわかって良かったです。

引き続き、アウトプットを意識して、勉強していきたいと思います！