PHPで学ぶ Session の基本と応用 / web-app-session-101-2024
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の基本と応用 PHPカンファレンス関西 2024
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
25 ちなみに
Slide 26
Slide 26 text
26 RFC 6265 今でも、Cookieに関する仕様の更新は行われており たくさんのドラフトドキュメントが作成されている
Slide 27
Slide 27 text
Cookies Having Independent Partitioned State (CHIPS) https://www.ietf.org/archive/id/draft-cutler-httpbis-partitioned-cookies-00.html 27
Slide 28
Slide 28 text
追跡はできないが状態は参照できるという形 で3rd Party Cookieの問題点を解決する動き の一つ → Symfony は2023年10月に対応済み 28 あと10分かかる
Slide 29
Slide 29 text
2章 「技術的な仕組」 29
Slide 30
Slide 30 text
まず、Cookieの仕組み 30
Slide 31
Slide 31 text
HTTP Response Header HTTP Request Header にCookie情報を含めて送る 31
Slide 32
Slide 32 text
Response Header にCookieを含める ※Webアプリケーショ ンがセットした情報 32
Slide 33
Slide 33 text
HTTP Request Header 33
Slide 34
Slide 34 text
curl でも簡単に中身をチェックできる 34
Slide 35
Slide 35 text
ブラウザとWebサーバーが 仕様に従って Cookie を送受信する と表現されると聞こえがよいが... 35
Slide 36
Slide 36 text
ステートレスなHTTPに 無理やりステートを入れ込んでいる 36 Unixの時代から、コンピューター間でやりとりする小さい情報断片のことを cookie と呼んでいたらしい
Slide 37
Slide 37 text
ここで問題がでてくる 37
Slide 38
Slide 38 text
Webアプリは、状態として大量の情報 をもたせたい 例)ユーザ情報、Validation エラー、入力値、履歴...💰 38
Slide 39
Slide 39 text
Cookieのデータ容量制限 39
Slide 40
Slide 40 text
一度の Req/Res で 4KBまでの データしか扱えない → Headerに載せるという前提を考えれば当然の制約 40 2024-03-10(訂正) Cookieのサイズについては RFC6265では定義されておらずブラウザの実装によります。 一般的には4KB〜数十KBとなっているようです。 いずれにしろ大きい容量でないことは確かです。
Slide 41
Slide 41 text
かつ機微情報をCookieに載せると盗聴リ スクがある → SSL/TLSが贅沢だった時代は特に。 41
Slide 42
Slide 42 text
そこで Cookieには鍵となるIDだけを保持 → Webサーバー側でデータを保存する 42
Slide 43
Slide 43 text
43 鍵となるID
Slide 44
Slide 44 text
44 初回アクセス
Slide 45
Slide 45 text
45 二回目以降
Slide 46
Slide 46 text
Session ID を Cookieに設定すれば なりすましも可能 → いわゆるセッションハイジャック 最近は常時SSLなので難しいが...... 46
Slide 47
Slide 47 text
Cookie を使ったSession管理は分かった → プログラミング言語はどのようにサポートしているのか? 47
Slide 48
Slide 48 text
PHPにおいてSessionは拡張として 入っている 48
Slide 49
Slide 49 text
デフォルトで有効 --disable-session で 無効にすることも可 49
Slide 50
Slide 50 text
(余談) どんなときにSession拡張を無効にする? A) まかり間違っても Session 使ってほしくない時とか? 50
Slide 51
Slide 51 text
Session 拡張無効だと、Laravel動かない 51
Slide 52
Slide 52 text
Session 拡張のマニュアル https://www.php.net/manual/en/ref.session.php 52
Slide 53
Slide 53 text
a.php name という要素を追加 b.php name要素を出力 このような無邪気なソースコー ドで、簡単に利用することが可 能 53
Slide 54
Slide 54 text
$_SESSION (スーパーグローバル) https://www.php.net/manual/en/reserved.variables.session.php 54
Slide 55
Slide 55 text
$_SESSION 直接使うのは、相当訓練されたPHPer もしくは... 55
Slide 56
Slide 56 text
デフォルトのSession Store ファイル /tmp/sess_[session_id] 等 余談)短時間に大量に出力すると、ほんの少しパフォーマンが落ちます 56
Slide 57
Slide 57 text
デフォルトの Session ID 名 PHPSESSID session.name (php.ini) session_name 関数 を使って変更可能 57
Slide 58
Slide 58 text
Set-Cookie で SESSION ID がセットされる 58
Slide 59
Slide 59 text
PHPのWAFが使うSession実装 59
Slide 60
Slide 60 text
Symfony Http Foundation Component Drupal, Joomla, Laravel… 多数 60
Slide 61
Slide 61 text
PHP の $_SESSION, setcookie を 安全に使うためのラッパー 61 2024-03-10(訂正) 「PHPのSessionHandlerInterfaceを実装したライブラリ」 が正しい表現です。 結果として $_SESSION もネイティブのsetcookieも使わないので 安全や確実性を企図したライブラリであることは間違いないです
Slide 62
Slide 62 text
Super Global を直接いじらないで!と いう願いが込められている(多分) 62 2024-03-10(追記) PHPデフォルトのSession操作系関数を使わないので、このスライドはいずれにしろ合ってい ます
Slide 63
Slide 63 text
63 この章のおさらい Session ID をキーにして状態を保存 PHPではデフォルトで利用可能 ※ただし、安全のためにもWAFの利用が推奨される あと5分かかる
Slide 64
Slide 64 text
3章 「最低限の周辺知識」 64
Slide 65
Slide 65 text
Session 管理のセキュリティ 65
Slide 66
Slide 66 text
仕組の前提として Cookie が使われている 66
Slide 67
Slide 67 text
Cookie の正しい理解が不可欠 67
Slide 68
Slide 68 text
68 GoogleがセットするCookieの例
Slide 69
Slide 69 text
Cookieの属性 Max-Age Expires Domain Path Secure HttpOnly SameSite 属性はCase Insensitive 大文字小文字関係なし SameSiteはドラフト仕様だが、す でにブラウザ側は実装済 69
Slide 70
Slide 70 text
特に大事な属性 70
Slide 71
Slide 71 text
Secure SSL/TLS通信でのみCookieを送信する 盗聴対策 71
Slide 72
Slide 72 text
HttpOnly JavaScriptからはアクセス不可 XSSで Cookie を盗ませない 72
Slide 73
Slide 73 text
WAFを使っていれば、この手のリスク は考慮されている オレオレFWの場合や、生PHPの場合は注意が必要 73
Slide 74
Slide 74 text
Session 管理を狙った攻撃 74
Slide 75
Slide 75 text
SESSION ID さえ盗めれば 誰かになりすますことも可能 75
Slide 76
Slide 76 text
Session 固定化攻撃 Session ハイジャック https://www.sbcr.jp/product/4797393163/ - 安全なWebアプリケーションの作り方 第2版 76
Slide 77
Slide 77 text
設計されていない 不用意なSESSION利用によるバグ 77
Slide 78
Slide 78 text
例)保持された状態によって、本来のページ遷移がおかしくなる 78
Slide 79
Slide 79 text
バグの修正例 そもそも状態を持たせたことが原因なので仕様自体を見直し てSessionを使わない形にしていくと良いかも 79
Slide 80
Slide 80 text
Session がセキュリティのために 使われている例 80
Slide 81
Slide 81 text
CSRF Token 81
Slide 82
Slide 82 text
https://medium.com/@sachindilan/secure-software-development-synchronizer-token-pattern-9afe0cc92ba Synchronizer Token Pattern 82
Slide 83
Slide 83 text
Session 管理が アーキテクチャに与える影響 83
Slide 84
Slide 84 text
Session Store が File の場合 84
Slide 85
Slide 85 text
シングル構成なら問題ない 85
Slide 86
Slide 86 text
LoadBalancer を使うと Session Store が分散 86
Slide 87
Slide 87 text
対策1 共有の Session Store 87
Slide 88
Slide 88 text
共有 Session Store 88
Slide 89
Slide 89 text
対策2 Sticky Session 89
Slide 90
Slide 90 text
LBが空気を読んで、ユーザ毎の到達エンドポイントを固定 LBの機能なので、根本的な原因は解決されてない 90
Slide 91
Slide 91 text
対策3 Cookie を Session Store にする 91
Slide 92
Slide 92 text
非推奨(すぐに4K越えます) あなたが思うより、すぐに越えます 92
Slide 93
Slide 93 text
93 この章のおさらい Cookieの仕様を理解 Session 管理を狙った攻撃を把握 Session ストアを設計時に考慮
Slide 94
Slide 94 text
まとめ 94
Slide 95
Slide 95 text
1. Session という単語を正しく覚える 「Cookie を使った Session 管理」 95
Slide 96
Slide 96 text
2. Cookie の仕様を理解する → RFC6265 を読んでみよう https://tools.ietf.org/html/rfc6265 96
Slide 97
Slide 97 text
3. Session管理の仕組を理解する 97
Slide 98
Slide 98 text
4. Session 管理への攻撃を知る → 徳丸本読みましょう https://www.sbcr.jp/product/4797393163/ - 安全なWebアプリケーションの作り方 第2版 98
Slide 99
Slide 99 text
5. アーキテクチャーを意識する → Session 管理のスケーラビリティ 99
Slide 100
Slide 100 text
@hanhan1978 相談・指摘・その他 下記のTwitterアカウントにどうぞ 100