【PHP】sessionとは?|sessionの説明から使い方まで分かりやすく解説!
- システム
エンジニア - Node.jsとは何かよく分かリました。
- プロジェクト
マネージャー - Node.jsはJavaScriptをサーバーサイドで扱うこともでき、そうすると、JavaScriptだけでWebアプリや便利なフレームワークを使ってフロントエンドの面倒な作業を自動化させることができます。
sessionとは?
セッションとは、広義のコンピューター用語で「一連の処理のはじまりから終わり」を示す概念のことを言います。
例えば、Webサイトにアクセスしてそのページから出るという一連の処理があった場合、これを1つのセッションとして考えることができます。
通常の場合、ECサイトにログインして商品を買い物リストに追加し、購入ボタンを押すといった処理があれば、画面が切り替わるごとにセッションがリセットされ、ユーザーがログインした情報などが失われてしまいます。
そこで今回紹介する、狭義の意味でのsession(セッション)とCookie(クッキー)という仕組みを使えば、PHPでユーザー情報をWebサーバーに保持し、上記の処理を一連のものとして扱えるようになります。
sessionとCookieについて理解しよう
PHPでユーザー情報をWebサーバーに保持しておくためには、sessionとCookieという2つの仕組みを使う必要があります。Cookieもsessionのようにユーザーの情報を保持する仕組みです。
Cookieを使うと、ユーザーが入力した個人情報やログイン情報などを保持しておき、例えばログイン後に次の画面に移動してもログイン情報が失われずに次の処理ができるようになります。
PHPでCookieに情報を保持するためには、下記のように「setcookieファンクション」を利用します。
1
|
setcookie ( name(クッキーの名前) , value (クッキーの値)= "値" , expires(有効期限),path(フォルダ),domain(ドメイン),secure(セキュア接続),httponly(HTTP),options(任意のキーの連想配列) ) ;
|
Cookieとsessionの違いは?
Cookieもsessionも使い道は似ていますが、Cookieはクライアント側に情報が保存されるのに対し、sessionはサーバー側に情報が保存されるという違いがあります。
Cookieはクライアント側(ブラウザ)に情報が保存される上に、ブラウザを操作すれば保持された個人情報を盗み見ることもできるため、重要な情報を保存するのには向いていません。
sessionはCookieのように保存期間を決めることができず、「Webブラウザを閉じるまでしか情報を保持できない」という制限が存在しますが、その分Cookieに比べ安全に情報を保存することができます。
この2つを扱えるようになると、PHPでユーザーの個人情報やログイン状態などを管理できるようになります。
PHPでのsessionの使い方
それでは、PHPでsessionとCookieを扱う方法をいくつか解説していきます。
処理はそれほど複雑ではなく、基本はセッション関数を呼び出して、セッション変数に値を格納するといったシンプルな手順になります。
$_SESSIONはPHPで定義済みのスーパーグローバル変数なので、コード中のどこからでも使用することができます。
session_start関数の実行
PHPでsessionを使うには、はじめに「session_startファンクション」を使ってセッションIDを発行します。この処理コードは、sessionを使うページ全てに書かなければいけません。
セッションIDが発行されると、ランダムな英数字が羅列され、その情報がCookieに保存されます。その情報をもとに、ユーザーの個人情報などを引き出します。
「$_SESSION[‘セッションの名前’] = ‘セッションに保存する値’;」のように書くことで、保存したい値を変数に代入します。下記がその例です。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<?php
session_start();
$_SESSION['セッションの名前'] = '値をセッションに保存する';
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>PHPsession</title>
</head>
<body>
このページはindex.phpです。セッションに値を保存しています。
<a href="next.php">次のページへ</a>
</body>
</html>
|
次に、index.phpでsessionに代入した値を、next.phpで取り出してみます。ここでも「session_startファンクション」を最初に記述し、「print($_SESSION[‘セッションの名前’]);」で値を表示します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<?php
session_start();
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>PHPsession next</title>
</head>
<body>
このページはnext.phpです。セッションの値を表示しています。
<?php
print($_SESSION['セッションの名前']);
?>
</body>
</html>
|
セッションIDの確認
現在のセッションIDを確認するには、「session_idファンクション」を使用します。
また、セッション名を確認する際には、「session_nameファンクション」を使用します。
1
2
|
echo session_id();
echo session_name();
|
sessionの削除
PHPでセッションを削除するには、下記のように「session_unsetファンクション」を使います。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<?php
session_start();
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>PHPsession next</title>
</head>
<body>
このページはnext.phpです。セッションの値を表示しています。
<?php
print($_SESSION['セッションの名前']);
session_unset ( ) ;
?>
</body>
</html>
|
session_unset ファンクションを使うと、全てのセッション変数が削除されます。もう一つの削除方法としては、下記のような個別のデータだけを削除する「unsetファンクション」を使ったものもあります。
1
2
3
4
|
<?php
$_SESSION[‘セッションの名前’] = ”保存したい値”;
unset($_SESSION[‘セッションの名前’]);
?>
|
sessionのセキュリティについて
sessionはユーザーの個人情報を扱っているので、sessionを使って何かサービスを提供する際にはセキュリティ対策をしっかり行っておく必要があります。
sessionは、CookieにセッションIDを保存しています。つまり、ブラウザでCookieにアクセスしてセッションIDを盗む技術があれば、簡単にユーザーのデータを悪用されてしまうリスクがあるのです。
セキリュティ対策の手段は多岐に渡っているので全てを網羅できませんが、下記でsessionセキュリティ対策事例をいくつか紹介します。
セッションIDの再発行をする
PHP公式では、セキリュティ的損害が許されないシビアな情報を扱う際、15分ごとにセッションIDを更新することが推奨されています。下記がセッションID更新のコード記述例です。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
<?php
session_start();
$o_id = session_id();
session_regenerate_id(true);
$n_id = session_id();
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>PHPセッション</title>
</head>
<body>
<?php
if (!isset($_COOKIE[セッションの名前()])){
print('1回目です');
}else{
print('前のセッションIDは '.$o_id.' です。<br>');
print('今のセッションIDは '.$n_id.' です。<br>');
}
?>
</body>
</html>
|
上記のコードを実行すると、ブラウザの再読み込みを行うたびに、セッションIDが変更されるのを確認できます。
httpsを使う
Webサイトのデータをやり取りする規約にはhttpとhttpsがありますが、ユーザーの情報を扱う際にはhttpsを使うのが基本となります。
httpsは通信内容が暗号化されるのに対し、httpは暗号化されていない状態で通信を行うことになります。そのため、httpはセキリュティ面でのリスクが非常に大きくなっています。
また、https通信の場合でのみCookieが使えるようにphp.iniファイルに下記の設定を行っておくと、httpの場合はCookieが送信されないようにできます。
1
|
session.cookie_secure=1
|
Webサーバーのセキュリティ対策もする
sessionを安全に運用するためには、Webサーバーのセキリュティ対策も行っておく必要があります。
なぜなら、sessionのファイルはWebサーバーに保存されているので、Webサーバーへの不正アクセスがあった場合、sessionに保存された情報も盗まれるリスクがあるからです。
パスワードを複雑なものにしたり、強力なセキリュティソフトを導入したり、不要なアプリを削除するなどして、攻撃者が付け入るセキュリティの隙をできる限りなくすことが重要となります。
- システム
エンジニア - PHPでのsessionは便利な反面、セキュリティ対策が必要なことがよく分かりました。
- プロジェクト
マネージャー - その通りです。ご紹介した方法を参考にして、セキュリティ対策を十分にとっておくようにしましょう。
sessionを理解してPHPを活用しよう
PHPでのsession処理はシンプルなので、簡単なコード実装で個別のユーザーがECサイトを利用し、商品を購入する仕組みなどを構築することが可能です。
しかし、ユーザーの個人情報を扱う以上はセキュリティ面での課題をしっかり考え、追加の対策も行っていく必要があります。
今回ご紹介した知識でPHPへの理解を深めつつ、より安全なコードを追求していきましょう。
FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。
-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。
新着案件New Job
-
開発エンジニア/東京都品川区/【WEB面談可】/在宅ワーク
月給29万~30万円東京都品川区(大崎駅) -
遠隔テストサービス機能改修/JavaScript/東京都港区/【WEB面談可】/テレワーク
月給45万~60万円東京都港区(六本木駅) -
病院内システムの不具合対応、保守/東京都豊島区/【WEB面談可】/テレワーク
月給30万~30万円東京都豊島区(池袋駅) -
開発/JavaScript/東京都豊島区/【WEB面談可】/テレワーク
月給50万~50万円東京都豊島区(大塚駅) -
債権債務システム追加開発/東京都文京区/【WEB面談可】/在宅勤務
月給62万~67万円東京都文京区(後楽園駅) -
PMO/東京都豊島区/【WEB面談可】/在宅勤務
月給55万~55万円東京都豊島区(池袋駅)