実用PHPセッション入門

公開日:

Download PDF

スライドテキスト

Page 1

セッション入門

PHP
Introduction to PHP Session

ピクシブ社内勉強会

2017-12-01

Page 2

お前誰よ
うさみけんた、@tadsan、Zonu.EXE

  • Emacs PHP Modeメンテナ
  • 省略

Page 3

注意

Page 4

この発表は新規のWebサイト Webアプリケーションフレー ムワークに依存しないPHP開
発を推奨する目的ではない

Page 5

※今回ログイン の話はしません

Page 6

セッション
とは何か

Page 7

この用語

(セッション)

が意味するところは
いろいろあるけど

Page 8

ここではWebで、
ユーザーと継続的に
通信する機構

Page 9

継続的?

Page 10

はじめて訪問したとき

こんにちは

「ゲスト」さん!
あなたは誰ですか?

Webサイト

Page 11

ここに名前をいれてね

私は「tadsan」だよ

Webサイト

Page 12

次に訪問したとき

こんにちは

「tadsan」さん! また来ましたね!

Webサイト

Page 13

Webブラウザでセッションを
実現するには、一般的には

が利用される

Cookie

(クッキー)

Page 14

あとで話すよ

Page 15

注意

Page 16

セッションの実装は
Webサイトのプライバシー ポリシーと密接に関連する

Page 17

のプライバシーポリシー

pixiv

Page 18

TIPS
Cookieを使ったセッション を利用するときはプライバ シーポリシーを明記しよう

Page 19

PHPで
セッション

Page 20

超かんたん

Page 21

name.php

<?php

session_start();

// session_start()
これで別ページでも すれば

// $_SESSION['name']

として参照できるようになる

$_SESSION['name'] = '太郎';

header('Location: /betsu.php');

Page 22

betsu.php

<?php session_start() ?>

<p>
こんにちは<?= htmlspecialchars( ) ?>さん

$_SESSION['name']

</p>

Page 23

TIPS
PHPのフレームワークはセッション機構 がいい感じに統合されてることがある。 ただし、マイクロフレームワークではオ ミットされてることが多くPHPデフォル トのセッションを気にする必要がある。

Page 24

TIPS
session_start()

および後述す

るセッション設定は個別のペー ジで呼ぶのではなく、共通初期
化スクリプトに記述すること

Page 25

まあとりあえず

session_start()

簡単にできる

Page 26

ね、かんたん
でしょ?

Page 27

Page 28

🙃

Page 29

だと思ったか

Page 30

どうして

セッションは
動くのか

Page 31

よし、Webサイトを見よう

GET /index HTTP/1.1

Host: example.com

Webサイト

Page 32

はじめて訪問したとき

こいつはCookie持ってないな…

ちっ、新参か。

GET /index HTTP/1.1

セッションIDを発行するか

Host: example.com

「こんにちはゲストさーん」

Webサイト

Page 33

はじめて訪問したとき

200 OK

こいつはCookie持ってないな…

ちっ、新参か。

Set-Cookie:

セッションIDを発行するか

PHPSESSID=xxxxx;expires=...

<!DOCTYPE html><html>...

「こんにちはゲストさーん」

Webサイト

Page 34

はじめて訪問したとき

200 OK

こいつはCookie持ってないな…

ちっ、新参か。

Set-Cookie:
Set-Cookie!

セッションIDを発行するか

PHPSESSID=xxxxx;expires=...

<!DOCTYPE html><html>...

「こんにちはゲストさーん」

Webサイト

Page 35

RFC 6265
HTTP State
Management Mechanism

Page 36

HTTP上でWebサイトと

UA が状態
(ブラウザ)
共有するためのしくみ

Page 37

状態?

Page 38

話は長くなる

Page 39

Cookieに対応したユーザーエー

ジェント が

(Webブラウザ)

Set-Cookieを受け取ると、 次からそのサイトにリクエス トするときにCookieヘッダを
付加する

Page 40

次回に訪問するとき

GET /index HTTP/1.1

Host: example.com

Cookie:

PHPSESSID=xxxxx

Webサイト

Page 41

次回に訪問するとき

GET /index HTTP/1.1

おっこいつは前も来たxxxxだな

Host: example.com

「こんちわー またきたね」

Cookie:

PHPSESSID=xxxxx

Webサイト

Page 42

次回に訪問するとき

おっこいつは前も来たxxxxだな

200 OK

「こんちわー またきたね」

<!DOCTYPE html><html>...

Webサイト

Page 43

どうして

セッションは
動くのか

Page 44

Q.どうしてセッショ ンは特に設定しなく ても動くのはなぜ?

Page 45

A.PHPはきみのことを

ファイルに保存して
覚えてるからだよ

Page 46

ファイルっすか

Page 47

😅

Page 48

ファイルです

Page 49

😇

Page 50

session_save_path() 保存するディレクトリ
を設定できる

Page 51

http://php.net/manual/ja/function.session-save-path.php

Page 52

🙃

Page 53

Q.ファイル
問題点とは何か?

Page 54

🤔

Page 55

A.サーバーまたいで

セッションを
共有できない!

Page 56

🙃

Page 57

Q.具体的に 何が起こる?

Page 58

A.サーバーを増やして 分散させた瞬間に、セッ ションが消えたりする

Page 59

/(^o^)\

Page 60

実用PHP
セッション

Page 61

本題はここから

Page 62

SessionHandlerInterface

Page 63

http://php.net/manual/ja/class.sessionhandlerinterface.php

Page 64

これを実装して

Page 65

MySessHandler.php

<?php

class MySessHandler implements SessionHandlerInterface
{
//

実装…

}

Page 66

bootstrap.php

<?php

$handler = new MySessHandler();
session_set_save_handler($handler, true);

session_start();

Page 67

登録できる

Page 68

実装って何を
すればいいの?

Page 69

Redis/Memcached/ SQLなどに保存する

Page 70

極端な話、データベー スじゃなくてもいい

Page 71

例)Cookie

(セキュリティの面で
面倒なのでおすすめはしない)

Page 72

設定

Page 73

デフォルト設定
の問題

Page 74

デフォルトでは、Cookie

にSecure,httpOnly属性
がついてない

Page 75

現代においては
ありえない

Page 76

http://php.net/manual/ja/function.session-set-cookie-params.php

Page 77

絶対設定しよう

Page 78

PHPSESSIDださい

Page 79

bootstrap.php

<?php

session_name('hoge_session_id');

$handler = new MySessHandler();
session_set_save_handler($handler, true);

session_start();

Page 80

php.ini

VS
PHP関数

Page 81

セッション系の設定

設定ファイル と

*.ini
( )

PHP両方で設定できる

Page 82

環境によってphp.iniは手を入 れにくいので、実行時にPHP スクリプトで設定関数を呼ぶ
ようにする方がおすすめ

Page 83

関数で書いてやれば

(同じコードである限り)
事故が起きにくい

Page 84

今回しなかっ
た話

Page 85

ログインの
実装方法

Page 86

ログイン処理を実装するため にはセキュリティ的に考慮す
べき事柄がいろいろあるよ

Page 87

この発表の

反響があったら 続きを書くよ!