Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
PHPで学ぶ Session の基本と応用 / web-app-session-101-2024
Search
Ryo Tomidokoro
February 09, 2024
12
5.5k
PHPで学ぶ Session の基本と応用 / web-app-session-101-2024
PHPカンファレンス関西2024 の登壇資料です。
Cookie を使った Session 管理について解説しています。
Ryo Tomidokoro
February 09, 2024
Tweet
Share
More Decks by Ryo Tomidokoro
See All by Ryo Tomidokoro
PHPerのための計算量入門/Complexity101 for PHPer
hanhan1978
5
670
集中して作業する技術/how_to_work_deeply
hanhan1978
61
41k
PHPでデータベースを作ってみた/create-data-with-php
hanhan1978
10
9.4k
ADRを一年運用してみた/adr_after_a_year
hanhan1978
8
3.6k
B+木入門:PHPで理解する データベースインデックスの仕組み/b-plus-tree-101
hanhan1978
5
4.7k
ADRを一年運用してみた/our_story_about_adr
hanhan1978
5
2k
レガシー回避のPHP開発術/avoid_php_legacy
hanhan1978
16
12k
Laravel Collectionの計算量を調べてみた2023/laravel_collection_time_complexity_2023
hanhan1978
1
1.4k
PHP で学ぶ Cache の距離の話 / study_cache_with_php
hanhan1978
7
2.2k
Featured
See All Featured
We Have a Design System, Now What?
morganepeng
51
7.3k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
120k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
6.9k
4 Signs Your Business is Dying
shpigford
182
21k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.2k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
17
2.3k
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
159
15k
Agile that works and the tools we love
rasmusluckow
328
21k
Automating Front-end Workflow
addyosmani
1366
200k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
191
16k
A Modern Web Designer's Workflow
chriscoyier
693
190k
Transcript
@hanhan1978 PHPで学ぶ Sessionの基本と応用 PHPカンファレンス関西 2024
@hanhan1978 • 富所 亮 • 所属 ◦ 株式会社カオナビ • 職業
◦ Webアプリケーションエンジニア • ブログ ◦ https://blog.hanhans.net • Yokohama North AM ◦ https://anchor.fm/yokohama-north-am 2
今日のテーマ 3
Session 4
Webアプリケーション開発者が Session と呼んでいるものは何か? 5
Session a period of time that is spent doing a
particular activity 特定の活動に費やされた期間 https://www.oxfordlearnersdictionaries.com - Oxford Learner’s Dictionary 6
Session → この単語だけだと曖昧 7
Cookie を使った Session 管理 略して Session 8 本スライドでは以後、断りなく Session と表記した場合、
「Cookie を使った Session 管理」を表します。
今日、覚えて帰って欲しいこと 9
• 1章 「生い立ち」 • 2章 「技術的な仕組み」 • 3章 「最低限の周辺知識」 10
1章 「生い立ち」 11
Cookieから始まった 12
Cookie とは何か? どういう用途で作られた物なのか? 13
World Wide Web 1990 Nov : Tim Berners Lee 1996
May : RFC 1945 (HTTP/1.0) → ステートレスなプロトコル https://en.wikipedia.org/wiki/World_Wide_Web 14
ステートレス? 15
「Webサーバーがアプリケーション 状態を保存しない」制約 Webを支える技術 (P80) - 技術評論社 16
状態(ステート)? 17
• 何回アクセスがあった? • ログインしているか? • 前回アクセス時に何をカートに入れた 18
Webの普及に伴って 状態を持ちたいという要求が高まる 19
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
https://tools.ietf.org/html/rfc6265 - HTTP State Management Mechanism Cookieとは ステートレスなHTTPで 状態(ステート)を持つための技術 21
22 平たく言うと
HTTPで ログインやお買い物カート を実現する技術 💴 23
24 この章のおさらい HTTPは元々ステートレス 状態を持たせたいという欲求から Cookieが登場した
25 ちなみに
26 RFC 6265 今でも、Cookieに関する仕様の更新は行われており たくさんのドラフトドキュメントが作成されている
Cookies Having Independent Partitioned State (CHIPS) https://www.ietf.org/archive/id/draft-cutler-httpbis-partitioned-cookies-00.html 27
追跡はできないが状態は参照できるという形 で3rd Party Cookieの問題点を解決する動き の一つ → Symfony は2023年10月に対応済み 28 あと10分かかる
2章 「技術的な仕組」 29
まず、Cookieの仕組み 30
HTTP Response Header HTTP Request Header にCookie情報を含めて送る 31
Response Header にCookieを含める ※Webアプリケーショ ンがセットした情報 32
HTTP Request Header 33
curl でも簡単に中身をチェックできる 34
ブラウザとWebサーバーが 仕様に従って Cookie を送受信する と表現されると聞こえがよいが... 35
ステートレスなHTTPに 無理やりステートを入れ込んでいる 36 Unixの時代から、コンピューター間でやりとりする小さい情報断片のことを cookie と呼んでいたらしい
ここで問題がでてくる 37
Webアプリは、状態として大量の情報 をもたせたい 例)ユーザ情報、Validation エラー、入力値、履歴...💰 38
Cookieのデータ容量制限 39
一度の Req/Res で 4KBまでの データしか扱えない → Headerに載せるという前提を考えれば当然の制約 40 2024-03-10(訂正) Cookieのサイズについては
RFC6265では定義されておらずブラウザの実装によります。 一般的には4KB〜数十KBとなっているようです。 いずれにしろ大きい容量でないことは確かです。
かつ機微情報をCookieに載せると盗聴リ スクがある → SSL/TLSが贅沢だった時代は特に。 41
そこで Cookieには鍵となるIDだけを保持 → Webサーバー側でデータを保存する 42
43 鍵となるID
44 初回アクセス
45 二回目以降
Session ID を Cookieに設定すれば なりすましも可能 → いわゆるセッションハイジャック 最近は常時SSLなので難しいが...... 46
Cookie を使ったSession管理は分かった → プログラミング言語はどのようにサポートしているのか? 47
PHPにおいてSessionは拡張として 入っている 48
デフォルトで有効 --disable-session で 無効にすることも可 49
(余談) どんなときにSession拡張を無効にする? A) まかり間違っても Session 使ってほしくない時とか? 50
Session 拡張無効だと、Laravel動かない 51
Session 拡張のマニュアル https://www.php.net/manual/en/ref.session.php 52
a.php name という要素を追加 b.php name要素を出力 このような無邪気なソースコー ドで、簡単に利用することが可 能 53
$_SESSION (スーパーグローバル) https://www.php.net/manual/en/reserved.variables.session.php 54
$_SESSION 直接使うのは、相当訓練されたPHPer もしくは... 55
デフォルトのSession Store ファイル /tmp/sess_[session_id] 等 余談)短時間に大量に出力すると、ほんの少しパフォーマンが落ちます 56
デフォルトの Session ID 名 PHPSESSID session.name (php.ini) session_name 関数 を使って変更可能
57
Set-Cookie で SESSION ID がセットされる 58
PHPのWAFが使うSession実装 59
Symfony Http Foundation Component Drupal, Joomla, Laravel… 多数 60
PHP の $_SESSION, setcookie を 安全に使うためのラッパー 61 2024-03-10(訂正) 「PHPのSessionHandlerInterfaceを実装したライブラリ」 が正しい表現です。
結果として $_SESSION もネイティブのsetcookieも使わないので 安全や確実性を企図したライブラリであることは間違いないです
Super Global を直接いじらないで!と いう願いが込められている(多分) 62 2024-03-10(追記) PHPデフォルトのSession操作系関数を使わないので、このスライドはいずれにしろ合ってい ます
63 この章のおさらい Session ID をキーにして状態を保存 PHPではデフォルトで利用可能 ※ただし、安全のためにもWAFの利用が推奨される あと5分かかる
3章 「最低限の周辺知識」 64
Session 管理のセキュリティ 65
仕組の前提として Cookie が使われている 66
Cookie の正しい理解が不可欠 67
68 GoogleがセットするCookieの例
Cookieの属性 Max-Age Expires Domain Path Secure HttpOnly SameSite 属性はCase Insensitive
大文字小文字関係なし SameSiteはドラフト仕様だが、す でにブラウザ側は実装済 69
特に大事な属性 70
Secure SSL/TLS通信でのみCookieを送信する 盗聴対策 71
HttpOnly JavaScriptからはアクセス不可 XSSで Cookie を盗ませない 72
WAFを使っていれば、この手のリスク は考慮されている オレオレFWの場合や、生PHPの場合は注意が必要 73
Session 管理を狙った攻撃 74
SESSION ID さえ盗めれば 誰かになりすますことも可能 75
Session 固定化攻撃 Session ハイジャック https://www.sbcr.jp/product/4797393163/ - 安全なWebアプリケーションの作り方 第2版 76
設計されていない 不用意なSESSION利用によるバグ 77
例)保持された状態によって、本来のページ遷移がおかしくなる 78
バグの修正例 そもそも状態を持たせたことが原因なので仕様自体を見直し てSessionを使わない形にしていくと良いかも 79
Session がセキュリティのために 使われている例 80
CSRF Token 81
https://medium.com/@sachindilan/secure-software-development-synchronizer-token-pattern-9afe0cc92ba Synchronizer Token Pattern 82
Session 管理が アーキテクチャに与える影響 83
Session Store が File の場合 84
シングル構成なら問題ない 85
LoadBalancer を使うと Session Store が分散 86
対策1 共有の Session Store 87
共有 Session Store 88
対策2 Sticky Session 89
LBが空気を読んで、ユーザ毎の到達エンドポイントを固定 LBの機能なので、根本的な原因は解決されてない 90
対策3 Cookie を Session Store にする 91
非推奨(すぐに4K越えます) あなたが思うより、すぐに越えます 92
93 この章のおさらい Cookieの仕様を理解 Session 管理を狙った攻撃を把握 Session ストアを設計時に考慮
まとめ 94
1. Session という単語を正しく覚える 「Cookie を使った Session 管理」 95
2. Cookie の仕様を理解する → RFC6265 を読んでみよう https://tools.ietf.org/html/rfc6265 96
3. Session管理の仕組を理解する 97
4. Session 管理への攻撃を知る → 徳丸本読みましょう https://www.sbcr.jp/product/4797393163/ - 安全なWebアプリケーションの作り方 第2版 98
5. アーキテクチャーを意識する → Session 管理のスケーラビリティ 99
@hanhan1978 相談・指摘・その他 下記のTwitterアカウントにどうぞ 100