Skip to content

実用PHPセッション入門

公開日:

東京都pixiv株式会社で開催された『ピクシブ社内勉強会』で社内勉強会(30分)として発表しました。

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持ってないな…

ちっ、新参か。

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

GET /index HTTP/1.1

Host: example.com

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

Webサイト

Page 33

はじめて訪問したとき

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

ちっ、新参か。

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

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

200 OK

Set-Cookie:

PHPSESSID=xxxxx;expires=...

<!DOCTYPE html><html>...

Webサイト

Page 34

はじめて訪問したとき

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

ちっ、新参か。

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

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

200 OK

Set-Cookie:

PHPSESSID=xxxxx;expires=...

<!DOCTYPE html><html>...

Set-Cookie!

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

次回に訪問するとき

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

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

GET /index HTTP/1.1 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

この発表の反響があったら続きを書くよ!