Page 1
PHPセッション入門
Introduction to PHP Session
2017-12-01 ピクシブ社内勉強会
公開日:
by USAMI Kenta@tadsan
に東京都のpixiv株式会社で開催された『ピクシブ社内勉強会』で社内勉強会(30分)として発表しました。
Introduction to PHP Session
2017-12-01 ピクシブ社内勉強会
注意
この発表は新規のWebサイトWebアプリケーションフレームワークに依存しないPHP開発を推奨する目的ではない
※今回ログインの話はしません
セッションとは何か
この用語(セッション)が意味するところはいろいろあるけど
ここではWebで、ユーザーと継続的に通信する機構
継続的?
こんにちは「ゲスト」さん!
あなたは誰ですか?
Webサイト
Webサイト
こんにちは「tadsan」さん!
また来ましたね!
Webサイト
Webブラウザでセッションを実現するには、一般的にはCookie(クッキー)が利用される
あとで話すよ
注意
セッションの実装はWebサイトのプライバシーポリシーと密接に関連する
pixivのプライバシーポリシー
TIPS
Cookieを使ったセッションを利用するときはプライバシーポリシーを明記しよう
PHPでセッション
超かんたん
<?php
session_start();
// これで別ページでも session_start() すれば// $_SESSION['name'] として参照できるようになる$_SESSION['name'] = '太郎';header('Location: /betsu.php');
<?php session_start() ?>
<p>こんにちは<?= htmlspecialchars($_SESSION['name']) ?>さん</p>
PHPのフレームワークはセッション機構がいい感じに統合されてることがある。ただし、マイクロフレームワークではオミットされてることが多くPHPデフォルトのセッションを気にする必要がある。
TIPS
session_start()および後述するセッション設定は個別のページで呼ぶのではなく、共通初期化スクリプトに記述すること
まあとりあえずsession_start()で簡単にできる
ね、かんたんでしょ?
完
🙃
だと思ったか
どうしてセッションは動くのか
GET /index HTTP/1.1 Host: example.com
Webサイト
こいつはCookie持ってないな…
ちっ、新参か。
セッションIDを発行するか
「こんにちはゲストさーん」
Webサイト
こいつはCookie持ってないな…
ちっ、新参か。
セッションIDを発行するか
「こんにちはゲストさーん」
Webサイト
こいつはCookie持ってないな…
ちっ、新参か。
セッションIDを発行するか
「こんにちはゲストさーん」
Webサイト
RFC 6265 HTTP State Management Mechanism
HTTP上でWebサイトとUA(ブラウザ)が状態を共有するためのしくみ
状態?
話は長くなる
Cookieに対応したユーザーエージェント(Webブラウザ)がSet-Cookieを受け取ると、次からそのサイトにリクエストするときにCookieヘッダを付加する
GET /index HTTP/1.1 Host: example.com Cookie:PHPSESSID=xxxxx
Webサイト
おっこいつは前も来たxxxxだな
「こんちわー またきたね」
GET /index HTTP/1.1 Host: example.com Cookie:PHPSESSID=xxxxx
Webサイト
おっこいつは前も来たxxxxだな
「こんちわー またきたね」
<!DOCTYPE html><html>...
Webサイト
どうしてセッションは動くのか
Q.どうしてセッションは特に設定しなくても動くのはなぜ?
A.PHPはきみのことをファイルに保存して覚えてるからだよ
ファイルっすか
😅
ファイルです
😇
session_save_path()保存するディレクトリを設定できる
http://php.net/manual/ja/function.session-save-path.php
🙃
Q.ファイルの問題点とは何か?
🤔
A.サーバーまたいでセッションを共有できない!
🙃
Q.具体的に何が起こる?
A.サーバーを増やして分散させた瞬間に、セッションが消えたりする
/(^o^)\
実用PHPセッション
本題はここから
SessionHandlerInterface
http://php.net/manual/ja/class.sessionhandlerinterface.php
これを実装して
<?php
class MySessHandler implements SessionHandlerInterface{// 実装…}
<?php
$handler = new MySessHandler();session_set_save_handler($handler, true);
session_start();
登録できる
実装って何をすればいいの?
Redis/Memcached/SQLなどに保存する
極端な話、データベースじゃなくてもいい
(セキュリティの面で面倒なのでおすすめはしない)
設定
デフォルト設定の問題
デフォルトでは、CookieにSecure,httpOnly属性がついてない
現代においてはありえない
http://php.net/manual/ja/function.session-set-cookie-params.php
絶対設定しよう
PHPSESSIDださい
<?php
session_name('hoge_session_id');
$handler = new MySessHandler();session_set_save_handler($handler, true);
session_start();
php.ini VS PHP関数
セッション系の設定設定ファイル(*.ini)とPHP両方で設定できる
環境によってphp.iniは手を入れにくいので、実行時にPHPスクリプトで設定関数を呼ぶようにする方がおすすめ
関数で書いてやれば(同じコードである限り)事故が起きにくい
今回しなかった話
ログインの実装方法
ログイン処理を実装するためにはセキュリティ的に考慮すべき事柄がいろいろあるよ
この発表の反響があったら続きを書くよ!
