セキュリティ対策はばっちり? セッションとCookieの違いとPHPでの使い方をご紹介!

 
Webアプリケーションを作る上で、Cookie(クッキー)やSession(セッション)という言葉を聞くことがあると思います。
意識はしていなくとも使用したことがあるのではないでしょうか。

正しく理解していないと脆弱なシステムを作ってしまったり、思わぬミスを起こしてしまう危険性があります。

今回はそんなセッションについて、そもそもCookie(クッキー)って? セッションって? という方向けに、PHPでの使い方を含めご説明したいと思います。

Cookieとは

HTTPにおけるWebサーバとWebブラウザ間で状態を管理するプロトコルです。
また、そこで用いられるWebブラウザに保存された情報のことをCookieと言います。

Webアプリケーション側では、リクエストヘッダに入っているCookieを調べることで、アクセスしてきた相手がどのような相手なのかを知ることができ、ユーザー識別やセッション管理を実現する目的などに利用されています。

セッションとは

ユーザーの情報をサーバーに一時的に格納する仕組みです。

Cookieがクライアント側の情報維持の仕組みであるのに対して、セッションはサーバ側の仕組みです。

クライアント側には「セッションID」と呼ばれるユーザを識別するためのキー情報だけが渡され、クライアントはサーバにアクセスする際に、このセッションIDをヘッダ情報として送信します。

例えば、Web上でのログイン情報など、ユーザーに紐づくデータをセッションに格納して使ったりします。

Cookieの場合はクライアント側に保存されるという性質上、ユーザーがデータを改ざんすることもできるため、セッションのほうがよりセキュリティ的に安全だと言われています。

Cookieを使用したセッション管理のイメージ

session1

  1. 1回目のWebアクセスを受け付けたWebサイトは、セッションIDを生成し、
           クライアントAの情報と紐付けてサーバー内にて管理します。
           また、HTTPレスポンス・ヘッダーのCookieにセッションIDを含めて返します。
  2. ブラウザはHTTPレスポンス・ヘッダーのCookieに含まれたセッションIDをローカルに保存し管理します。
  3. 2回目以降にWebサイトにアクセスする場合、ブラウザは保存しているセッションIDを、
            HTTPヘッダーに含めてリクエストを送信します。
  4. Webサイトは送られてきたセッションIDからクライアントAの情報を参照します。
  5. これによって、何回目のアクセスでもサーバに保管された自身のセッション情報を参照できます。

PHPでのセッションの使い方

まず、PHPでセッションを使用する場合、session_start関数でセッションを開始します。

bool session_start ([ array $options = [] ] )
session_start() は、セッションを作成します。
もしくは、リクエスト上で GET, POST またはクッキーにより渡されたセッション ID に基づき現在のセッションを復帰します。

◇返り値
この関数は、セッションが正常に開始した場合に TRUE、それ以外の場合に FALSE を返します。

PHP

セッションを開始すると、$_SESSIONという特別な変数が使えるようになります。
$_SESSIONは配列になっているので、好きな値をセットしておくと、セッションが開始されていればその値を取り出すことができます。

サンプルプログラム

<?php
    session_start();
?>

<html>
<head><title>セッション</title></head>
<body>

<?php
    if (!isset($_SESSION["cnt"])){
        print('初回の訪問です。セッションを開始します。');
        $_SESSION["cnt"]=1;  
    }else{
        $_SESSION["cnt"]++;  
        print('セッションは開始しています。<br>');
        print($_SESSION["cnt"].' 回目の訪問です。');
    }
?>

</body>
</html>

このサンプルプログラムでは$_SESSIONにcntという名前でアクセス回数を保持しています。
12行目のように値の設定や、16行目のように値の取得を通常の変数と同様に行えます。

このサンプルプログラムに初めてアクセスした時はセッション情報にcntの情報は存在しないため
if文の結果がTRUEとなり、下記の様に表示されます。

画面右側にはブラウザが保持しているCookieの値を分かりやすいように表示していますが、
セッション名がPHPSESSIDという名前で1h6k5mq3agc670f…というセッションIDを保持しています。

session_sample1

もう一度アクセスすると、1回目でCookieに保存したセッションIDをサーバーに送信し、セッション情報のcntを取得できるのでIF文はFALSEになります。

セッション情報のcntには前回のアクセスで設定したアクセス回数が設定されているので、画面にアクセス回数が表示されます。

session_sample2

上記のように別々の通信でも、Cookieやセッションを用いることによって同じ情報を扱うことができます。

まとめ

今回はCookieとセッションについての基本的な部分をご説明させていただきました。

サンプルを見ると、1回目と2回目のアクセスでセッションIDは変わっていないことや、セッション情報はサーバー側で保存されているのでcntの値はブラウザで見れないが、Cookieはローカル側で保持しているので見られる事などが分かると思います。

次回はもう一歩踏み込んで、セッションのセキュリティ性を高める為にすべき事をご説明したいと思いますが、まずはしっかり基礎の仕組みを理解するために、ぜひ一度動かして色々と試して頂ければと思います。

記事をシェア
MOST VIEWED ARTICLES