こんにちは! ケケンタです。
この記事ではクッキーとセッションに関する以下のようなことを解説していきます。
- クッキー、セッションとは?
- クッキーとセッションの違い
- クッキーとセッションが使用される際の流れ
- クッキーとセッションの使いどころ
- クッキーとセッションのプログラミング例
PHPでWebアプリを開発するならクッキーとセッションの理解は非常に重要です。
この記事がクッキーとセッションのことを理解する一助となれば何よりです。
クッキーとセッション
まずは簡単にクッキーとセッションがそれぞれどういうものかをご説明します。
クッキーとは
ユーザー側のブラウザに保存される小さなテキストファイルのこと
です。
この中に、例えばカート情報やサイトの閲覧履歴などを格納しておくことで、ユーザーが再びサイトを訪れた際、過去のデータを復元することが可能になります。
セッションとは
Webアプリケーションがユーザーの情報を一時的に保存しておくための仕組みのこと
です。
ユーザーがウェブサイトを訪れると、セッションが開始され、ユーザーにセッションIDが割り振られます。
その後は、セッションIDをキーとして、例えばログイン情報(ID・パスワード)などを一時保存します。
これにより、アプリケーション側はユーザーのログイン状態をチェックすることが可能となります。
クッキーとセッションの違い
簡単にクッキーとセッションについてご説明をしました。
クッキーもセッションも、どちらもその役割は一時的に情報を保存することです。
役割が似ているため、特に初学者の方は混同しやすく、最初の内は中々気持ちよく理解することが難しいかもしれません。
ここで、クッキーとセッションの違いをお見せします。
クッキー | セッション | |
---|---|---|
生存期間 | 設定された有効期限が来るまで | ブラウザが閉じられるまで ※時間による有効期限の指定も可能 |
データの保管場所 | ユーザーのブラウザ | サーバー |
受け渡しのデータ形態 | データそのもの ※機密性のない情報の保存に適す | ID=情報を取得するためのキー ※機密性のある情報の保存に適す |
データ量 | 約4KB | 無制限 |
このように、クッキーとセッションには明らかな違いがあり、それぞれ使用するべき状況が異なります。
ここからはクッキーとセッションそれぞれの使いどころや仕組み、プログラミング例を提示します。
クッキーとセッションは関連性も持ちながらもまったく異なる要素のため、それぞれの仕組みや役割を理解することが大切です。
クッキーの使いどころ
改めて、クッキーとは、ユーザーのブラウザに保存される小さなテキストファイルのことでした。
使いどころとしては、ユーザーのWebサイト内での閲覧履歴の表示や、カート情報の表示などが挙げられます。
つまり
クッキーを利用することで、そのユーザーのWebサイト内での行動に関する独自の情報を提供し、ユーザビリティを向上させることが可能
ということです。
注意点として、クッキーの正体はHTTPリクエストに載るテキスト情報です。
つまり、第三者がHTTPリクエストを覗き見た場合、クッキーの中身が文字通り丸分かりになってしまうということです。
そのため機密性が高い情報をクッキーに格納してサーバーとやり取りすることは絶対に控えましょう。
また、クッキーに保存可能なデータ量は4KBほどのため、大容量データの格納には不向きです。
クッキーが使用される流れ
クッキーは以下のような流れでHTTPリクエストにテキスト情報として載り、ブラウザとサーバーとの間でやり取りされます。
- ユーザーがWebサイトにアクセスする
- Webサーバーがユーザーのブラウザにクッキーを送信する(HTTPレスポンスのSet-Cookieフィールドにクッキー情報を載せる)
- クッキーを受け取ったブラウザが、クッキーの情報を自分自身(ブラウザ自身)に保存する
- それ以降、ブラウザはそのWebサイトを訪れるたびに保存してあるクッキーをHTTPリクエストと共にWebサーバーへ送信する
- Webサーバーは受け取ったクッキーを元に、そのユーザー独自の情報を表示するなどの処理を行う
クッキーの使い方【プログラミング例】
クッキーを実際にPHPで使用する際は以下のようになります。
クッキーに情報を格納する
// ※有効期限を7日に指定
setcookie( 'user_id', "kekenta", time()+606024*7 );
クッキーに複数の情報を格納する
// json_encode()関数でJSONエンコードして渡す
setcookie( 'login_info', json_encode( ["id" => "kekenta" ,"pass" => “kekentapass” ] ) );
クッキーから情報を取得する
var_dump( json_decode( $_COOKIE["login_info"], true ) );
クッキーから情報を削除する
setcookie( 'user_id', "" );
ここまでがクッキーの解説でした。
続いてセッションの解説に入ります。
セッションの使いどころ
改めて、セッションとは、Webアプリケーションがユーザーの情報を一時的に保存しておくための仕組みのことです。
よく使用されるのが、ログイン状態の保存です。
ここで少しWebアプリケーションの歴史的な背景の話をさせていただきます。
実はユーザーとWebサーバー同士のやり取りというのは、その都度、状態(ステータス)が保存されるわけではありません。
やり取りの度にWebサーバー側がユーザーのことを忘れてしまうのです。
このように「状態を保持しない」性質をステートレス(state less)と言います。
どういうことかというと、ユーザーがせっかくログイン画面を経てサイトへログインしたとしても、Webサーバー側が次のHTTPリクエストの際には「ユーザーがログイン済み」という事実を忘れてしまうということです。
そのため、本来のWebサーバーの性質上では、ユーザーはページ遷移する度にログイン操作を要求されることになってしまいます。
この問題を解消するために生み出された技術がクッキーです。
前述したように、クッキーもまた情報をテキストデータとして保持することが可能な技術です。
そのため、ユーザーがログイン操作をした際、クッキーにログインID・パスワードを保持することで、ページ遷移の度にログイン情報を入力しなくてはならないという事態を回避できたのです。
しかし、クッキーに保持されるデータはHTTPリクエストを覗けば丸見えのため、情報漏洩のリスクが非常に高いです。
この問題をさらに解決するべく誕生したのがセッションです。
セッションはセッションIDをクッキーに保持し、実際のデータを格納・取得する際はこのセッションIDを利用します。
これにより、生のデータがHTTPリクエストを介して覗き見られてしまう事態を回避できます。
つまりセッションとは、クッキーでは補えないセキュリティリスクをカバーするために誕生した技術だったのです。
ログイン状態の維持の話に戻りますが、セッションにログイン情報(パスワード・ユーザIDなど)を保存し、サイト側はユーザーがページ遷移するごとにセッションの情報を参照することで、「このユーザーはいまログイン済み」ということを判断することが可能になります。
これがログイン状態の保存です。
セッションを利用すると機密性が高い情報も漏洩するリスクが低下します。
そのため、セッションの使いどころのひとつとして、個人情報などの機密性が高い情報を一時的に保存したい状況が挙げられます。
セッションが使用される流れ
セッションは具体的には以下のような流れで使用されます。
- ユーザーがWebサイトへアクセスする
- セッションが開始する
- ユーザーにセッションIDが割り振られる(セッションID自体はクッキーで受け渡しされる)
- ユーザーがログイン画面からID・パスワードを入力してログインする
- ID・パスワードがセッションに保存される
- ユーザーがページ遷移するたびにWebサイトはセッションIDをキーとしたID・パスワードをチェックし、ログイン情報を正しいことを確認する
セッションの使い方【プログラミング例】
セッションの開始方法
セッションを使用する際は必ず以下の処理を記述します。
session_start();
セッションに情報を格納する
データが単体の場合
$_SESSION["user_id"] = "kekenta";
配列の場合
$_SESSION["login_info"] = [
"id" ⇒ "kekenta",
"pass" ⇒ "kekentapass"
];
セッションから情報を取り出す
情報を取り出すときはグローバル変数$_SESSIONに情報格納時に設定したキーを指定します。
echo $_SESSION[”user_id”];
// 出力結果:kekenta
格納したセッション情報を削除する
unset( $_SESSION[”user_id”] );
以上がセッションのプログラミング例です。
さらに具体的な実践での使用方法を見てみたいという方は、以下の記事で掲示板アプリの作成方法を解説していますのでこちらの記事内のコードをご覧ください。
【まとめ】クッキーとセッションは適切に使い分けよう
以上がクッキーとセッションの解説でした。
振り返りとして改めてセッションとクッキーの違いを提示します。
クッキー | セッション | |
---|---|---|
生存期間 | 設定された有効期限が来るまで | ブラウザが閉じられるまで ※時間による有効期限の指定も可能 |
データの保管場所 | ユーザーのブラウザ | サーバー |
受け渡しのデータ形態 | データそのもの ※機密性のない情報の保存に適す | ID=情報を取得するためのキー ※機密性のある情報の保存に適す |
データ量 | 約4KB | 無制限 |
セッションはセッションIDこそクッキーで受け渡しが行われるますが、データ自体はセッションIDをキーとして取り出すため、機密性が高い情報を格納するのに向いています。
それに対し、クッキーは生のデータをHTTPリクエストに記載してそのまま受け渡しているため、機密性が高い情報の扱いには向いていません。
また、クッキーとセッションでは利用可能なデータ容量も異なります。
こうしたクッキーとセッションの違いをしっかり理解して使い分けることが大切です。
特に、セキュリティリスクへの配慮が最も重要で、
基本的にユーザーの個人情報を扱う場合はセッションを使用する
ようにしましょう。
最後までご覧いただきありがとうございました!
この記事が参考になったなら何よりです。
無料でPHPが学べるプログミングスクール