Cookieとセッションがいまいち分からなかったので調べてみた

新卒でエンジニアになって８ヶ月たった今、
インプット、インプット、インプット！の学習にこれじゃマズいんじゃないか。。。？
と悟ったため学習した事、気になった事を忘備録として残していこうと思います。

初投稿のため至らない点もあるとは思いますが、誤っている点とかその他諸々ご指摘いただけると嬉しいです。

では、早速レッツゴー！！笑

#Cookieとはなんぞや？
Cookieとは**「閲覧しているWebサイトからブラウザに情報を保存するための仕組み」**のことです。
普段何気なく見ているWebサイトではこのCookieの仕組みがよく使われています。

例えば、
**・ショッピングサイトを閲覧している際、購入を検討している商品をとりあえずカートに入れてブラウザを閉じたとします。再度訪れた際、カートに入れておいた商品が残っている。**

**・ユーザー登録をして一度ログインした後、2回目以降はログイン状態が保存できる。**

これらの機能はCookieによって行われています。

では、ブラウザに色々な情報を保存できるCookieはどういった仕組みで成り立っているのだろう？

#Cookieの仕組み
Cookieの仕組みは簡単に説明するとこんな感じ。

１.クライアントがWebページにアクセスしたい！と、Webサーバーにリクエストを送る。
２.WebサーバーはCookieを作成してWebページの情報と一緒にクライアントにレスポンスを返す。
<img width="762" alt="cookie.png" src="https://qiita-image-store.s3.amazonaws.com/0/255876/2906c136-1b40-96a0-6b6d-3075f80585ee.png">

身近にある例でいうと、**「会員証」**みたいなものです。
初めて訪れた店舗の窓口で、店員さんから「これ書いて〜。」と渡される紙 = Cookieって感じです。
紙を受け取った私たちは、「名前」やら「メールアドレス」やら「住所」やらを書いて渡します。
2回目以降の訪問時は会員証を提示するだけで受付が完了するといった流れだと思います。

同様にWebサーバーから受け取ったCookieにユーザーの情報が保存され2回目以降のサイト訪問時にはそのCookieをWebサーバーとクライアント間でやり取りすることで、ログイン機能のついたWebサイトなどではユーザーの情報を保持したままサービスを利用することができます。




#ブラウザにCookieを保存する方法
クライアントに対してCookieを保存するように指示する必要があります。

```php:Cookieを保存
setcookie('キー','値','有効期限');

//ユーザー名：tanakaの情報を1日だけ保存
setcookie('username','tanaka',time() + 60 * 60 * 24);
echo $_COOKIE['username']; //tanaka

```

#Cookieのデータを取得
例としてサイトに訪問した時の回数を表示してみました。

```php:サイト訪問数カウント(Cookie.Ver)
<?php
$count = 1;
if(isset($_COOKIE['count'])){
    $count = $_COOKIE['count'];
	$count++;
}
setcookie('count', $count, time() + 60 * 60 * 24);
?>

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>CookieTest</title>
</head>
<body>
	<h1>訪問回数を表示</h1>
	<?php
	if($count == 1){
	?>
	    <p>初めての訪問です。</p>

	<?php 
	}else{
	?>
	    <p>あなたの訪問は<?=$count?>回目です。</p>

	<?php
	}
	?>
</body>
</html>
```
#Cookieは個人情報を保存しておくには危険！？
クライアントとWebサーバー上で情報をやり取りするのにCookieは便利だと説明しました。しかし、Cookieに保存した情報は**ユーザー自身で簡単に書き換えが行えたり第三者に個人情報が見られてしまう可能性が高いです！!**

また、Cookieに保存できる情報量には限りがあるため多くの情報を載せることができません。

そこで、安全にそして多くの情報を管理する方法に**「セッション」**というのがあります。

#セッションとはなんぞや？
セッションとは**ユーザーの情報をサーバーに一時的に格納する仕組み**のことです。
保存した情報を直接やり取りするのではなくWebサーバー側でユーザー情報を紐付けたセッションIDを発行し、そのセッションIDをもとにユーザーを判別しながらやり取りができます。

身近な例でいうと**「整理券」**みたいなものです。

#セッションの仕組み
セッションの仕組みを簡単に説明するとこんな感じ。

１.クライアントがWebページにアクセスしたい！と、Webサーバーにリクエストを送る。
２.Webサーバーはユーザー情報と紐付けたセッションIDを発行。
３.CookieにセッションIDを保存するようにクライアントに指示。レスポンスを返す。
<img width="855" alt="session.png" src="https://qiita-image-store.s3.amazonaws.com/0/255876/f6032116-377d-1487-4587-175d6509a52a.png">

2回目以降のやり取りはセッションIDで行い、ユーザー情報はWebサーバーのデータベースに一時的に保管します。追加の情報がある場合はWebサーバーにこの情報もデータベースに保管してくださいとクライアント側がリクエストを送ることで可能になります。

このセッション管理を行うことで、例えばショッピングサイトで購入手続きをする際に次のページに遷移した時でも前のページで入力した情報を参照したり、保持することにより購入手続きを一連の流れで行うことができます。

#PHPでセッションを管理する方法
```php:この記述だけでセッションを開始できる
session_start();
```

#PHPでセッションを用いた訪問回数の表示
例としてサイトに訪問した時の回数を表示してみました。

```php:サイト訪問数カウント(Session.Ver)
<?php
session_start();

$count = 1;

if(isset($_SESSION['count'])){
	$count = $_SESSION['count'];
	$count++;
}

$_SESSION['count'] = $count;

?>

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>SessionTest</title>
</head>
<body>
<?php
if($count == 1){
?>
	<p>初めての訪問です</p>

<?php 
}else{
?>
	<p>あなたの訪問は<?=$count?>回目です。</p>
<?php
}
?>
</body>
</html>
```
#ChromeのデベロッパーツールでCookieの中身を確認
1段目がCookieにそのままcountのキーを保存した場合で、
2段目がセッションIDを作成してCookieに保存した場合になります。
<img width="784" alt="chrome.png" src="https://qiita-image-store.s3.amazonaws.com/0/255876/d0040a31-0be5-3352-9eb0-f4e7f3367b4b.png">

比較してみると一目瞭然！2段目はセッションIDだけ保存されておりブラウザ上で実際にはどんな情報が保存されているか見ることができません。(中身の情報はサーバーに一時保存されている。)

一方で、1段目はcountというキーが保存されていて値は3だなってすぐに分かっちゃいます。
これぐらいの情報だと見えちゃっても問題ないですが、パスワードやメールアドレスなどの個人情報が裸の状態で表示されちゃうのは危険。

#まとめ
・**Cookieとはブラウザ上に情報を保存しておける仕組みである。**

・**Cookieの中身がまる見え状態だとセキュリティ的にとても危険！**

・**セッションを使うことで情報をサーバー上に一時保存し、代わりにクライアントとのやり取りはセッションIDをCookieに保存してそれを用いて行う。**

Cookieとセッションはセキュリティに関してさまざまなリスクがあるらしいので今後はセキュリティ関連のことを調べようと思う。