PHPにはHTTP Cookieを扱う仕組みがあり、クライアントが使用するブラウザに、文字列のデータを保存しておくことができます。
セッションと比較されることがありますが、大きく違うのはデータを保存する場所です。
セッションは、サーバー内に保存されるのに対してCookieの場合は、クライアントのブラウザに保存されます。
Cookieとセッションの違い
Cookieはサーバー内ではなく、ブラウザに保存されます。保存された情報は、ブラウザからリクエストをするたびに、HTTPヘッダーに設定されて、自動的にサーバーに送信する動きをします。
ChromeブラウザなどのDeveloper ToolからNetworkを見ると、実際にCookieが設定されていることを見て確認することができます。
セッションと大きく違うのは、保存する場所です。セッションのデータはサーバー内に保存されているため、Developer Toolを使用しても見えません。
Cookieの使いどころ
Cookieはブラウザに保存され、リクエストをするとHTTPヘッダーに自動的に設定され、Developer Toolを使用すると見えてしまいます。
このことから、Cookieを使用する場合は、機密性が高い情報をCookieに使用することは適していません。
また、Cookieには、利用可能なデータ量に制限があり、4KBほどしか使用することはできません。
使いどころまとめ
それでは、Cookieは何に使用するのが適してるかということですが。
SESSIONよりも細かい設定をCookieデータごとに扱うことができます。
Cookieでは、下記の設定を行うことができます。
- 有効期限
- パス
- ドメイン
- セキュア
- HttpOnly
Cookieの保存
実際の使い方を見てみましょう。設定の内容についても少し説明します。
<?php
setcookie(
"SongTitle",
"飾りじゃないのよ涙は",
time() + 3600,
"/",
"llvl.handson",
true,
true,
);
PHPでは、setcookie関数を使ってCookieの保存をすることができます。
第一引数(クッキーの名前)
SongTitleをクッキー名として保存します。後からSongTitleのクッキー名でデータの取得をすることができます。
第二引数(クッキーの値)
Cookieに保存するデータを文字列で指定します。オブジェクトを保存したい場合は、json_encodeを使うことができますが、大きい文字列は使えないので大きいデータを扱う場合はサイズに注意しましょう。
第三引数(有効期限)
クッキーの有効期限を指定することができます。指定方法は、UNIXタイムスタンプの形式で指定することになっています。
time関数で1970/1/1からの経過秒数を取得し、今から「いつまで」を有効期限にするかを指定しましょう。
上記のサンプルでは、実行した時間から3600秒後を有効期限としています。
第四引数(パス)
クッキーを有効にしたいパスを指定します。例えば、「https://llvl.handson/available」を指定した場合は、「https://llvl.handson/unavailable」からSongTitleのクッキーを参照することができなくなります。セキュリティを意識する必要がある構成の場合は、思い出してください。
第五引数(ドメイン)
クッキーを有効にしたいドメインを指定します。上記のサンプルでは、「https://llvl.handson」からのみ使用することができる設定となります。
Cookieを使用する場合は、この設定は必ず行いましょう。設定しない場合は、自分のPHPアプリケーションで設定したCookieが、他のサイトに漏洩することになります。
可能であれば、第四引数とセットで使用することをお勧めします。
第六引数(HTTPSのみにするかどうか)
ブラウザからPHPアプリケーションにアクセスするには、httpかhttpsでのアクセスをすることになります。第六引数は、Cookieの使用をhttpsのみに限定する場合はtrueを設定します。
trueに設定するものだと思えば良いです。気にせずtrueを使用しましょう。
第七引数(ブラウザからのアクセスのみにするかどうか)
PHPアプリケーションは、基本的にはブラウザからのアクセスを使用することが多いですが、JavaScriptのリクエストから使用されることもあります。
これをブラウザからのみのアクセスとして、JavaScriptからのアクセスは許可しない場合にtrueを設定します。
この設定については、作成するアプリケーションによって適切な内容が異なるため、どんなアプリケーションにするのかに合わせて設定を変更しましょう。
Cookieの読み出し
setcookieで保存したCookieは下記の方法で読み出すことができます。
<?php
echo $_COOKIE["SongTitle"];
?>
PHPではCookieの読み出しは、$_COOKIEのスーパーグローバル変数を使って読み出します。
・・・イマイチですよね。セッションもスーパーグローバル変数から読み出しますが、私はここは、PHPのいけてないところだと思います。
setcookieで保存したら、getcookieで読み出したと思ってしまうんですよね。
でも、安心してください。Laravel(ララベル)を使うとスーパーグローバル変数を使うことなんて無くなります。
- この記事は基礎知識として必要な知識となるため、仕方なく書いています。
早くLaravelに進めたいです。
でも、Laravelを理解していくために基礎知識はあった方が良いので、いけてないとしても、理解だけはしておきましょう。
まとめ
Cookieはセッションと似ている一面がありますが、Cookieの場合はデータの保存場所がクライアントが使用するブラウザになるということを理解して使用するようにしましょう。
シンプルで小さく、機密性が低いデータを扱う場合のみCookieを使用することを検討しましょう。