PHPで学ぶ Session の基本と応用 / web-app-session-101
by
Ryo Tomidokoro
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
@hanhan1978 PHPで学ぶ Sessionの基本と応用 PHPerKaigi 2021
Slide 2
Slide 2 text
@hanhan1978 ● 富所 亮 ● 所属 ○ 株式会社カオナビ ● 職業 ○ Webアプリケーションエンジニア ● ブログ ○ https://blog.hanhans.net ● Yokohama North AM ○ https://anchor.fm/yokohama-north-am 2
Slide 3
Slide 3 text
今日、発表すること 3
Slide 4
Slide 4 text
Session 4
Slide 5
Slide 5 text
Webアプリケーション開発者が Session と呼んでいるものは何か? 5
Slide 6
Slide 6 text
Session a period of time that is spent doing a particular activity 特定の活動に費やされた期間 https://www.oxfordlearnersdictionaries.com - Oxford Learner’s Dictionary 6
Slide 7
Slide 7 text
Session → この単語だけだと曖昧 7
Slide 8
Slide 8 text
Cookie を使った Session 管理 略して Session 8 本スライドでは以後、断りなく Session と表記した場合、 「Cookie を使った Session 管理」を表します。
Slide 9
Slide 9 text
今日、覚えて帰って欲しいこと 9
Slide 10
Slide 10 text
● 1章 「生い立ち」 ● 2章 「技術的な仕組み」 ● 3章 「最低限の周辺知識」 10
Slide 11
Slide 11 text
1章 「生い立ち」 11
Slide 12
Slide 12 text
Cookieから始まった 12
Slide 13
Slide 13 text
Cookie とは何か? どういう用途で作られた物なのか? 13
Slide 14
Slide 14 text
World Wide Web 1990 Nov : Tim Berners Lee 1996 May : RFC 1945 (HTTP/1.0) → ステートレスなプロトコル https://en.wikipedia.org/wiki/World_Wide_Web 14
Slide 15
Slide 15 text
ステートレス? 15
Slide 16
Slide 16 text
「Webサーバーがアプリケーション 状態を保存しない」制約 Webを支える技術 (P80) - 技術評論社 16
Slide 17
Slide 17 text
状態(ステート)? 17
Slide 18
Slide 18 text
● 何回アクセスがあった? ● ログインしているか? ● 前回アクセス時に何をカートに入れた 18
Slide 19
Slide 19 text
Webの普及に伴って 状態を持ちたいという要求が高まる 19
Slide 20
Slide 20 text
Cookie 1994 Oct : Mosaic Netscape (独自拡張) 1997 Feb : RFC 2109 2000 Oct : RFC 2965 2011 Apr : RFC 6265 https://en.wikipedia.org/wiki/HTTP_cookie 20
Slide 21
Slide 21 text
https://tools.ietf.org/html/rfc6265 - HTTP State Management Mechanism Cookieとは ステートレスなHTTPで 状態(ステート)を持つための技術 21
Slide 22
Slide 22 text
22 平たく言うと
Slide 23
Slide 23 text
HTTPで ログインやお買い物カート を実現する技術 💴 23
Slide 24
Slide 24 text
24 この章のおさらい HTTPはステートレス 状態を持たせたいという欲求から Cookieが登場した
Slide 25
Slide 25 text
2章 「技術的な仕組」 25
Slide 26
Slide 26 text
まず、Cookieの仕組み 26
Slide 27
Slide 27 text
HTTP Response Header HTTP Request Header にCookie情報を含めて送る 27
Slide 28
Slide 28 text
Response Header にCookieを含める ※Webアプリケーション がセットした情報 28
Slide 29
Slide 29 text
HTTP Request Header 29
Slide 30
Slide 30 text
ブラウザとWebサーバーが 仕様に従って Cookie を送受信する と表現されると聞こえがよいが... 30
Slide 31
Slide 31 text
ステートレスなHTTPに 無理やりステートを入れ込んでいる 31
Slide 32
Slide 32 text
Cookieのデータ容量 32
Slide 33
Slide 33 text
一度の Req/Res で 4KBまでの データしか扱えない → Headerに載せるという前提を考えれば当然の制約 33
Slide 34
Slide 34 text
機微情報はHeaderで送受信したくない。 → SSL/TLSが贅沢だった時代は特に。 34
Slide 35
Slide 35 text
Webアプリは、状態として大量の情報をも たせてくる 例)ユーザ情報、Validation エラー、入力値、履歴...💰 35
Slide 36
Slide 36 text
そこで Cookieには鍵となるIDだけを保持 → Webサーバー側でデータを保存する 36
Slide 37
Slide 37 text
37 鍵となるID
Slide 38
Slide 38 text
38 初回アクセス
Slide 39
Slide 39 text
39 二回目以降
Slide 40
Slide 40 text
Cookie を使ったSession管理は分かった → プログラミング言語はどのようにサポートしているのか? 40
Slide 41
Slide 41 text
PHP において Session は拡張として入っ ている 41
Slide 42
Slide 42 text
デフォルトで有効 --disable-session で 無効にすることも可 42
Slide 43
Slide 43 text
(余談) どんなときに Session 拡張を無効にする? A) どうまかり間違っても Session 使ってほしくない時とか?? 43
Slide 44
Slide 44 text
Session 拡張無効だと、Laravel動かない 44
Slide 45
Slide 45 text
Session 拡張のマニュアル https://www.php.net/manual/en/ref.session.php 45
Slide 46
Slide 46 text
a.php name という要素を追加 b.php name要素を出力 このような無邪気なソースコー ドで、簡単に利用することが可 能 46
Slide 47
Slide 47 text
$_SESSION (スーパーグローバル) https://www.php.net/manual/en/reserved.variables.session.php 47
Slide 48
Slide 48 text
$_SESSION 直接使うのは、相当訓練されたPHPer もしくは... 48
Slide 49
Slide 49 text
デフォルトのSession Store ファイル /tmp/sess_[session_id] 等 余談)短時間に大量に出力すると、ほんの少しパフォーマンが落ちます 49
Slide 50
Slide 50 text
デフォルトの Session ID 名 PHPSESSID session.name (php.ini) session_name 関数 を使って変更可能 50
Slide 51
Slide 51 text
Set-Cookie で SESSION ID がセットされる 51
Slide 52
Slide 52 text
PHP の WAF が使う Session 実装 52
Slide 53
Slide 53 text
Symfony Http Foundation Component Drupal, Joomla, Laravel… 多数 53
Slide 54
Slide 54 text
PHP の $_SESSION, setcookie を 安全に使うためのラッパー 54
Slide 55
Slide 55 text
Super Global を直接いじらないで!とい う願いが込められている(多分) 55
Slide 56
Slide 56 text
56 この章のおさらい Session ID をキーにして状態を保存 PHPではデフォルトで利用可能 ※ただし、安全のためにもWAFの利用が推奨される
Slide 57
Slide 57 text
3章 「最低限の周辺知識」 57
Slide 58
Slide 58 text
Session 管理のセキュリティ 58
Slide 59
Slide 59 text
仕組の前提として Cookie が使われている 59
Slide 60
Slide 60 text
Cookie の正しい理解が不可欠 60
Slide 61
Slide 61 text
61 GoogleがセットするCookieの例
Slide 62
Slide 62 text
Cookieの属性 Max-Age Expires Domain Path Secure HttpOnly SameSite 属性はCase Insensitive 大文字小文字関係なし SameSiteは策定中の最新仕様だが、 すでにブラウザ側は実装済 62
Slide 63
Slide 63 text
特に大事な属性 63
Slide 64
Slide 64 text
Secure SSL/TLS通信でのみCookieを送信する 盗聴対策 64
Slide 65
Slide 65 text
HttpOnly JavaScriptからはアクセス不可 XSSで Cookie を盗ませない 65
Slide 66
Slide 66 text
WAFを使っていれば、この手のリスクは 考慮されている オレオレFWの場合や、生PHPの場合は注意が必要 66
Slide 67
Slide 67 text
Session 管理を狙った攻撃 67
Slide 68
Slide 68 text
SESSION ID さえ盗めれば 誰かになりすますことも可能 68
Slide 69
Slide 69 text
Session 固定化攻撃 Session ハイジャック https://www.sbcr.jp/product/4797393163/ - 安全なWebアプリケーションの作り方 第2版 69
Slide 70
Slide 70 text
設計されていない 不用意なSESSION利用によるバグ 70
Slide 71
Slide 71 text
例)保持された状態によって、本来のページ遷移がおかしくなる 71
Slide 72
Slide 72 text
バグの修正例 そもそも状態を持たせたことが原因なので仕様自体を見直し てSessionを使わない形にしていくと良いかも 72
Slide 73
Slide 73 text
Session がセキュリティのために 使われている例 73
Slide 74
Slide 74 text
CSRF Token 74
Slide 75
Slide 75 text
https://medium.com/@sachindilan/secure-software-development-synchronizer-token-pattern-9afe0cc92ba Synchronizer Token Pattern 75
Slide 76
Slide 76 text
Session 管理が アーキテクチャに与える影響 76
Slide 77
Slide 77 text
Session Store が File の場合 77
Slide 78
Slide 78 text
シングル構成なら問題ない 78
Slide 79
Slide 79 text
LoadBalancer を使うと Session Store が分散 79
Slide 80
Slide 80 text
対策1 共有の Session Store 80
Slide 81
Slide 81 text
共有 Session Store 81
Slide 82
Slide 82 text
対策2 Sticky Session 82
Slide 83
Slide 83 text
LBが空気を読んで、ユーザ毎の到達エンドポイントを固定 LBの機能なので、根本的な原因は解決されてない 83
Slide 84
Slide 84 text
対策3 Cookie を Session Store にする 84
Slide 85
Slide 85 text
非推奨(すぐに4K越えます) あなたが思うより、すぐに越えます 85
Slide 86
Slide 86 text
86 この章のおさらい Cookieの仕様を理解 Session 管理を狙った攻撃を把握 Session ストアを設計時に考慮
Slide 87
Slide 87 text
まとめ 87
Slide 88
Slide 88 text
1. Session という単語を正しく覚える 「Cookie を使った Session 管理」 88
Slide 89
Slide 89 text
2. Cookie の仕様を理解する → RFC6265 を読んでみよう https://tools.ietf.org/html/rfc6265 89
Slide 90
Slide 90 text
3. Session管理の仕組を理解する 90
Slide 91
Slide 91 text
4. Session 管理への攻撃を知る → 徳丸本読みましょう https://www.sbcr.jp/product/4797393163/ - 安全なWebアプリケーションの作り方 第2版 91
Slide 92
Slide 92 text
5. アーキテクチャーを意識する → Session 管理のスケーラビリティ 92
Slide 93
Slide 93 text
@hanhan1978 相談・指摘・その他 下記のTwitterアカウントにどうぞ 93