PHPerKaigi 2021 の登壇資料です。
Cookie を使った Session 管理について解説しています。
@hanhan1978PHPで学ぶSessionの基本と応用PHPerKaigi 2021
View Slide
@hanhan1978● 富所 亮● 所属○ 株式会社カオナビ● 職業○ Webアプリケーションエンジニア● ブログ○ https://blog.hanhans.net● Yokohama North AM○ https://anchor.fm/yokohama-north-am2
今日、発表すること3
Session4
Webアプリケーション開発者がSession と呼んでいるものは何か?5
Sessiona period of time that is spent doing a particular activity特定の活動に費やされた期間https://www.oxfordlearnersdictionaries.com - Oxford Learner’s Dictionary 6
Session→ この単語だけだと曖昧7
Cookie を使った Session 管理略して Session8本スライドでは以後、断りなく Session と表記した場合、「Cookie を使った Session 管理」を表します。
今日、覚えて帰って欲しいこと9
● 1章 「生い立ち」● 2章 「技術的な仕組み」● 3章 「最低限の周辺知識」10
1章 「生い立ち」11
Cookieから始まった12
Cookie とは何か?どういう用途で作られた物なのか?13
World Wide Web1990 Nov : Tim Berners Lee1996 May : RFC 1945 (HTTP/1.0)→ ステートレスなプロトコルhttps://en.wikipedia.org/wiki/World_Wide_Web 14
ステートレス?15
「Webサーバーがアプリケーション状態を保存しない」制約Webを支える技術 (P80) - 技術評論社 16
状態(ステート)?17
● 何回アクセスがあった?● ログインしているか?● 前回アクセス時に何をカートに入れた18
Webの普及に伴って状態を持ちたいという要求が高まる19
Cookie1994 Oct : Mosaic Netscape (独自拡張)1997 Feb : RFC 21092000 Oct : RFC 29652011 Apr : RFC 6265https://en.wikipedia.org/wiki/HTTP_cookie 20
https://tools.ietf.org/html/rfc6265 - HTTP State Management MechanismCookieとはステートレスなHTTPで状態(ステート)を持つための技術21
22平たく言うと
HTTPでログインやお買い物カートを実現する技術💴23
24この章のおさらいHTTPはステートレス状態を持たせたいという欲求からCookieが登場した
2章 「技術的な仕組」25
まず、Cookieの仕組み26
HTTP Response HeaderHTTP Request HeaderにCookie情報を含めて送る27
Response HeaderにCookieを含める※Webアプリケーションがセットした情報28
HTTP Request Header29
ブラウザと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 名PHPSESSIDsession.name (php.ini)session_name 関数を使って変更可能50
Set-Cookie で SESSION ID がセットされる51
PHP の WAF が使う Session 実装52
SymfonyHttp Foundation ComponentDrupal, Joomla, Laravel… 多数53
PHP の $_SESSION, setcookie を安全に使うためのラッパー54
Super Global を直接いじらないで!という願いが込められている(多分)55
56この章のおさらいSession ID をキーにして状態を保存PHPではデフォルトで利用可能※ただし、安全のためにもWAFの利用が推奨される
3章 「最低限の周辺知識」57
Session 管理のセキュリティ58
仕組の前提としてCookie が使われている59
Cookie の正しい理解が不可欠60
61GoogleがセットするCookieの例
Cookieの属性Max-AgeExpiresDomainPathSecureHttpOnlySameSite属性はCase Insensitive大文字小文字関係なしSameSiteは策定中の最新仕様だが、すでにブラウザ側は実装済62
特に大事な属性63
SecureSSL/TLS通信でのみCookieを送信する盗聴対策64
HttpOnlyJavaScriptからはアクセス不可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 Token74
https://medium.com/@sachindilan/secure-software-development-synchronizer-token-pattern-9afe0cc92baSynchronizer Token Pattern75
Session 管理がアーキテクチャに与える影響76
Session Store が File の場合77
シングル構成なら問題ない78
LoadBalancer を使うと Session Store が分散79
対策1共有の Session Store80
共有 Session Store81
対策2Sticky Session82
LBが空気を読んで、ユーザ毎の到達エンドポイントを固定LBの機能なので、根本的な原因は解決されてない83
対策3Cookie を 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