Page 1
セッション入門
PHP
Introduction to PHP Session
ピクシブ社内勉強会
2017-12-01
公開日:
by USAMI Kenta @tadsan
セッション入門
PHP
Introduction to PHP Session
ピクシブ社内勉強会
2017-12-01
お前誰よ
うさみけんた、@tadsan、Zonu.EXE
注意
この発表は新規のWebサイト Webアプリケーションフレー ムワークに依存しないPHP開
発を推奨する目的ではない
※今回ログイン の話はしません
セッション
とは何か
この用語
(セッション)
が意味するところは
いろいろあるけど
ここではWebで、
ユーザーと継続的に
通信する機構
継続的?
はじめて訪問したとき
こんにちは
「ゲスト」さん!
あなたは誰ですか?
Webサイト
ここに名前をいれてね
私は「tadsan」だよ
Webサイト
次に訪問したとき
こんにちは
「tadsan」さん! また来ましたね!
Webサイト
Webブラウザでセッションを
実現するには、一般的には
が利用される
Cookie
(クッキー)
あとで話すよ
注意
セッションの実装は
Webサイトのプライバシー ポリシーと密接に関連する
のプライバシーポリシー
pixiv
TIPS
Cookieを使ったセッション を利用するときはプライバ シーポリシーを明記しよう
PHPで
セッション
超かんたん
name.php
<?php
session_start();
// session_start()
これで別ページでも すれば
// $_SESSION['name']
として参照できるようになる
$_SESSION['name'] = '太郎';
header('Location: /betsu.php');
betsu.php
<?php session_start() ?>
<p>
こんにちは<?= htmlspecialchars( ) ?>さん
$_SESSION['name']
</p>
TIPS
PHPのフレームワークはセッション機構 がいい感じに統合されてることがある。 ただし、マイクロフレームワークではオ ミットされてることが多くPHPデフォル トのセッションを気にする必要がある。
TIPS
session_start()
および後述す
るセッション設定は個別のペー ジで呼ぶのではなく、共通初期
化スクリプトに記述すること
まあとりあえず
session_start()
で
簡単にできる
ね、かんたん
でしょ?
完
🙃
だと思ったか
どうして
セッションは
動くのか
よし、Webサイトを見よう
GET /index HTTP/1.1
Host: example.com
Webサイト
はじめて訪問したとき
こいつはCookie持ってないな…
ちっ、新参か。
GET /index HTTP/1.1
セッションIDを発行するか
Host: example.com
「こんにちはゲストさーん」
Webサイト
はじめて訪問したとき
200 OK
こいつはCookie持ってないな…
ちっ、新参か。
Set-Cookie:
セッションIDを発行するか
PHPSESSID=xxxxx;expires=...
<!DOCTYPE html><html>...
「こんにちはゲストさーん」
Webサイト
はじめて訪問したとき
200 OK
こいつはCookie持ってないな…
ちっ、新参か。
Set-Cookie:
Set-Cookie!
セッションIDを発行するか
PHPSESSID=xxxxx;expires=...
<!DOCTYPE html><html>...
「こんにちはゲストさーん」
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サイト
次回に訪問するとき
GET /index HTTP/1.1
おっこいつは前も来たxxxxだな
Host: example.com
「こんちわー またきたね」
Cookie:
PHPSESSID=xxxxx
Webサイト
次回に訪問するとき
おっこいつは前も来たxxxxだな
200 OK
「こんちわー またきたね」
<!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
これを実装して
MySessHandler.php
<?php
class MySessHandler implements SessionHandlerInterface
{
//
実装…
}
bootstrap.php
<?php
$handler = new MySessHandler();
session_set_save_handler($handler, true);
session_start();
登録できる
実装って何を
すればいいの?
Redis/Memcached/ SQLなどに保存する
極端な話、データベー スじゃなくてもいい
例)Cookie
(セキュリティの面で
面倒なのでおすすめはしない)
設定
デフォルト設定
の問題
デフォルトでは、Cookie
にSecure,httpOnly属性
がついてない
現代においては
ありえない
http://php.net/manual/ja/function.session-set-cookie-params.php
絶対設定しよう
PHPSESSIDださい
bootstrap.php
<?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 スクリプトで設定関数を呼ぶ
ようにする方がおすすめ
関数で書いてやれば
(同じコードである限り)
事故が起きにくい
今回しなかっ
た話
ログインの
実装方法
ログイン処理を実装するため にはセキュリティ的に考慮す
べき事柄がいろいろあるよ
この発表の
反響があったら 続きを書くよ!