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
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Ryo Tomidokoro
March 20, 2021
Programming
15
6.9k
PHPで学ぶ Session の基本と応用 / web-app-session-101
PHPerKaigi 2021 の登壇資料です。
Cookie を使った Session 管理について解説しています。
Ryo Tomidokoro
March 20, 2021
Tweet
Share
More Decks by Ryo Tomidokoro
See All by Ryo Tomidokoro
開発者が知っておきたい複雑さの正体/where-the-complexity-comes-from
hanhan1978
8
3.4k
Spec Driven Development入門/spec_driven_development_for_learners
hanhan1978
2
1.7k
フロントエンドがTypeScriptなら、バックエンドはPHPでもいいじゃない/php-is-not-bad
hanhan1978
8
14k
どうすると生き残れないのか/how-not-to-survive
hanhan1978
17
15k
100分で本番デプロイ!Laravelで作るWebアプリケーション作成/100min_web_app_cicd
hanhan1978
1
250
PHPerのための計算量入門/Complexity101 for PHPer
hanhan1978
8
3.5k
集中して作業する技術/how_to_work_deeply
hanhan1978
65
55k
PHPでデータベースを作ってみた/create-data-with-php
hanhan1978
11
11k
ADRを一年運用してみた/adr_after_a_year
hanhan1978
8
4.8k
Other Decks in Programming
See All in Programming
nuget-server - あなたが必要だったNuGetサーバー
kekyo
PRO
0
250
AIとペアプロして処理時間を97%削減した話 #pyconshizu
kashewnuts
1
240
AWS×クラウドネイティブソフトウェア設計 / AWS x Cloud-Native Software Design
nrslib
16
3.1k
Vuetify 3 → 4 何が変わった?差分と移行ポイント10分まとめ
koukimiura
0
140
モックわからないマン卒業記 ~振る舞いを起点に見直した、フロントエンドテストにおけるモックの使いどころ~
tasukuwatanabe
2
320
コーディングルールの鮮度を保ちたい / keep-fresh-go-internal-conventions
handlename
0
200
nilとは何か 〜interfaceの構造とnil!=nilから理解する〜
kuro_kurorrr
3
1.9k
猫の手も借りたい!ので AIエージェント猫を作って社内に放した話 Claude Code × Container Lambda の Slack Bot "DevNeko"
naramomi7
0
260
文字コードの話
qnighy
44
17k
Claude Code の Skill で複雑な既存仕様をすっきり整理しよう
yuichirokato
1
380
受け入れテスト駆動開発(ATDD)×AI駆動開発 AI時代のATDDの取り組み方を考える
kztakasaki
2
580
AI時代でも変わらない技術コミュニティの力~10年続く“ゆるい”つながりが生み出す価値
n_takehata
2
750
Featured
See All Featured
What's in a price? How to price your products and services
michaelherold
247
13k
Writing Fast Ruby
sferik
630
63k
Paper Plane (Part 1)
katiecoart
PRO
0
5.6k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
390
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.4k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
380
The Curse of the Amulet
leimatthew05
1
10k
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
340
Designing for Timeless Needs
cassininazir
0
160
Docker and Python
trallard
47
3.8k
Transcript
@hanhan1978 PHPで学ぶ Sessionの基本と応用 PHPerKaigi 2021
@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が登場した
2章 「技術的な仕組」 25
まず、Cookieの仕組み 26
HTTP Response Header HTTP Request Header にCookie情報を含めて送る 27
Response Header にCookieを含める ※Webアプリケーション がセットした情報 28
HTTP Request Header 29
ブラウザとWebサーバーが 仕様に従って Cookie を送受信する と表現されると聞こえがよいが... 30
ステートレスなHTTPに 無理やりステートを入れ込んでいる 31
Cookieのデータ容量 32
一度の Req/Res で 4KBまでの データしか扱えない → Headerに載せるという前提を考えれば当然の制約 33
機微情報はHeaderで送受信したくない。 → SSL/TLSが贅沢だった時代は特に。 34
Webアプリは、状態として大量の情報をも たせてくる 例)ユーザ情報、Validation エラー、入力値、履歴...💰 35
そこで Cookieには鍵となるIDだけを保持 → Webサーバー側でデータを保存する 36
37 鍵となるID
38 初回アクセス
39 二回目以降
Cookie を使ったSession管理は分かった → プログラミング言語はどのようにサポートしているのか? 40
PHP において Session は拡張として入っ ている 41
デフォルトで有効 --disable-session で 無効にすることも可 42
(余談) どんなときに Session 拡張を無効にする? A) どうまかり間違っても Session 使ってほしくない時とか?? 43
Session 拡張無効だと、Laravel動かない 44
Session 拡張のマニュアル https://www.php.net/manual/en/ref.session.php 45
a.php name という要素を追加 b.php name要素を出力 このような無邪気なソースコー ドで、簡単に利用することが可 能 46
$_SESSION (スーパーグローバル) https://www.php.net/manual/en/reserved.variables.session.php 47
$_SESSION 直接使うのは、相当訓練されたPHPer もしくは... 48
デフォルトのSession Store ファイル /tmp/sess_[session_id] 等 余談)短時間に大量に出力すると、ほんの少しパフォーマンが落ちます 49
デフォルトの Session ID 名 PHPSESSID session.name (php.ini) session_name 関数 を使って変更可能
50
Set-Cookie で SESSION ID がセットされる 51
PHP の WAF が使う Session 実装 52
Symfony Http Foundation Component Drupal, Joomla, Laravel… 多数 53
PHP の $_SESSION, setcookie を 安全に使うためのラッパー 54
Super Global を直接いじらないで!とい う願いが込められている(多分) 55
56 この章のおさらい Session ID をキーにして状態を保存 PHPではデフォルトで利用可能 ※ただし、安全のためにもWAFの利用が推奨される
3章 「最低限の周辺知識」 57
Session 管理のセキュリティ 58
仕組の前提として Cookie が使われている 59
Cookie の正しい理解が不可欠 60
61 GoogleがセットするCookieの例
Cookieの属性 Max-Age Expires Domain Path Secure HttpOnly SameSite 属性はCase Insensitive
大文字小文字関係なし SameSiteは策定中の最新仕様だが、 すでにブラウザ側は実装済 62
特に大事な属性 63
Secure SSL/TLS通信でのみCookieを送信する 盗聴対策 64
HttpOnly JavaScriptからはアクセス不可 XSSで Cookie を盗ませない 65
WAFを使っていれば、この手のリスクは 考慮されている オレオレFWの場合や、生PHPの場合は注意が必要 66
Session 管理を狙った攻撃 67
SESSION ID さえ盗めれば 誰かになりすますことも可能 68
Session 固定化攻撃 Session ハイジャック https://www.sbcr.jp/product/4797393163/ - 安全なWebアプリケーションの作り方 第2版 69
設計されていない 不用意なSESSION利用によるバグ 70
例)保持された状態によって、本来のページ遷移がおかしくなる 71
バグの修正例 そもそも状態を持たせたことが原因なので仕様自体を見直し てSessionを使わない形にしていくと良いかも 72
Session がセキュリティのために 使われている例 73
CSRF Token 74
https://medium.com/@sachindilan/secure-software-development-synchronizer-token-pattern-9afe0cc92ba Synchronizer Token Pattern 75
Session 管理が アーキテクチャに与える影響 76
Session Store が File の場合 77
シングル構成なら問題ない 78
LoadBalancer を使うと Session Store が分散 79
対策1 共有の Session Store 80
共有 Session Store 81
対策2 Sticky Session 82
LBが空気を読んで、ユーザ毎の到達エンドポイントを固定 LBの機能なので、根本的な原因は解決されてない 83
対策3 Cookie を Session Store にする 84
非推奨(すぐに4K越えます) あなたが思うより、すぐに越えます 85
86 この章のおさらい Cookieの仕様を理解 Session 管理を狙った攻撃を把握 Session ストアを設計時に考慮
まとめ 87
1. Session という単語を正しく覚える 「Cookie を使った Session 管理」 88
2. Cookie の仕様を理解する → RFC6265 を読んでみよう https://tools.ietf.org/html/rfc6265 89
3. Session管理の仕組を理解する 90
4. Session 管理への攻撃を知る → 徳丸本読みましょう https://www.sbcr.jp/product/4797393163/ - 安全なWebアプリケーションの作り方 第2版 91
5. アーキテクチャーを意識する → Session 管理のスケーラビリティ 92
@hanhan1978 相談・指摘・その他 下記のTwitterアカウントにどうぞ 93