Session管理
Sessionを管理すること
具体的な実装のことを指すわけではない
「管理」なのでそらそうmrsekut.icon
Session管理には大きく分けて2つの方法がある
ただのIDをclient/server間でやりとりするもの
これがいわゆるSessionID
server側で、Session IDとuserの情報を結びつけて保存しておく必要がある
「Session管理」と言うと普通こっちを指す気がする
statefulになる
meta dataを含んだtokenをclient/server間でやりとりするもの
userIdなどを含んだtokenをやりとりする
JWTを使うことが多そう
clientから送られてきたtokenからuserIdを取り出して使える
そのため、server側で管理する必要がない
statelessになる
たぶんToken認証などと呼ぶ
何ができればSessionを管理できるか
一意のclientを特定する情報をbackendに送れば良い
client上で一意のidか何かを生成し、毎度のrequestにそれを紐付ける
backendでは、そのidと管理したいデータを紐付けて、どこかに保存しておく
server上のファイルでも良いし、DBでも良い
保存できれば何でも良い
そうすれば、statelessなHTTP通信の上であっても、
userはloginし続けられるし、
guest状態でもカートの中身を保存し続けられる
つまり、以下の2つがあればSessionを管理できる
clientからrequestに一意のidを乗せる仕組み
serverでそのidを管理する仕組み
何を使ってSession管理をするか
clientからrequestに一意のidを乗せる仕組みの例
Cookie
LocalStorage
SessionStorage
query paramsにidを付与する
<input type="hidden">
serverでそのidを管理する仕組み
server上のファイル
server上のメモリ
DB
JWT
ただ、どれを選択するかでセキュリティリスクが大きく変わる
Session IDさえ知れば、そのアカウントにloginできる
query paramsにidを付与するなどは、明らかに脆弱であると言える
よくある組み合わせは、
Cookie & server上のファイル
Session ID
Session Data
#WIP
sessionで何を管理したいのか?にもよる
ログイン状態を管理したいのであれば、SessionStorageは向いていない
タブが消えるとログアウトされるとことになる
Session IDとそれ以外で話が大きく異なるので、分けたほうが良いかも
後者は単純
主に前者の話になる
この3つで話を分けるべきな気がする
Session ID
JWT
他の機密情報
password
クレカの番号
APIキー
その他、個人情報
etc.
Cookieに関してのSessionIDと他の機密情報の取り扱いについてはなんとなく見えてきたmrsekut.icon
jwtについてはまだ見えていない
JWTも見えたら、XSSすればCookie内のSession IDを知らずとも攻撃できるに追記したい
どこに保存するか
機密情報をどこに保存するのが安全か?という話
候補
Local Storage
全くセキュアでない
JSが容易にアクセスできる
悪意のあるthrid party libraryが含まれている
XSSでJSがinjectされる
https://techracho.bpsinc.jp/hachi8833/2019_10_09/80851#:~:text=local%20storageが危険な理由と%E3%80%81そこに秘密データを保存してはならない理由
Session Storage
Local Storageとだいたい同じ
Cookie
optionを正しくつけていればそこそこ安全?
Set-Cookie: HttpOnlyを付けておくと、JSからはアクセスできなくなる
Set-Cookie: SameSite=strict
CSRFの防止になる
Set-Cookie: Secure=true
Cookieを暗号化された経路のみを通る
XSSされれば無力
XSSでreq投げるコードを含めておけば、browserが勝手にCookie載せてくれる
https://blog.codinghorror.com/protecting-your-cookies-httponly/
IndexedDB
string以外も保存できる
セキュアではない
XSSがないならLocalStorageでも、Cookieでも安全
LocalStorageの方は、保存する機密情報の種類に依る
クレカとかパスワードとかは良くない
特にSession Idの場合は、安全、といえる
これはSession IDの用途が特殊だから
WebアプリケーションでJWTをセッションに使う際の保存先は(自分なりに説明できれば)どちらでもよいと思います - 日々量産
Q1.機密情報をlocalstorageに入れるべきではないのでは?徳丸本でもそう言ってた
A1.はい。見られて困るものは入れてはいけないですね
Q2.じゃあセッション情報(セッションIDとかセッションとしてのJWT)を入れるべきではないのでは?
A2.いいえ。XSSが無いなら、見られても無意味ですし、改ざんされても無意味なので入れてもいいと思いますよ。
なるほどmrsekut.icon
Set-Cookie: SameSiteを適用しておけば、たとえSessionIDが流出しても問題にならない
(XSSがなければ)
SameSiteからreqを送る手段がないので
XSSがあるならLocalStorageでも、Cookieでも危険
XSSすればCookie内のSession IDを知らずとも攻撃できる
こんな感じだろうか
Cookieの中の機密情報はちゃんとしていれば漏れはしない
XSSなどがあってもJSから読み取られることはない
対して、WebStorgageはXSSなどがあれば、容易にJSから読み取れる
ただし、Cookie内のSession IDに関しては、Cookieから取り出さなくても攻撃できる
XSSすればCookie内のSession IDを知らずとも攻撃できる
Session IDをどこに保存するか?のような話で以下を混同しないように気をつける
そのstorageの内容が第三者に見られるかどうか
web storageは見られる
cookieは見られない
session idを使って行う本来の目的を達成できるかどうか
xssがあればweb storage/cookieどちらに入っていても攻撃可能
Refresh Tokenを利用する
https://ryozi.hatenadiary.jp/entry/2022/02/12/073014#:~:text=れません%E3%80%82-,Chatworkさんの事例,-徳丸先生の
Access tokenの有効期限を30minにする
流出してから30minの間は悪用されることを妥協する
従来の方法だと、そもそも流出に気付け無い
だから、流出に気付いてから無効にしても手遅れ
読んだ
HTML5のLocal Storageを使ってはいけない(翻訳)|TechRacho by BPS株式会社
長い
localStorageは危険、Cookieを使えという感じ
Cookieなら何でも安全という風に読めてしまう
WebアプリケーションでJWTをセッションに使う際の保存先は(自分なりに説明できれば)どちらでもよいと思います - 日々量産
良い
Web Storage: セッショントークンのマシな手段 ― cookieとセキュリティ面を比較してみる | POSTD
逆張り
CookieよりWebStorageの方が安全という主張
Cookieとlocal storageの話でよく参照されてる記事にすごく疑問がある
良い
Secureな指定をしていないCookieを使っている時の攻撃方法
BeEF
http://beefproject.com/
私が思うに、現在の有能な攻撃者は カスタムCSRFペイロード を用いてXSSをエクスプロイトするか、 BeEFフック を利用するでしょう ref
https://www.slideshare.net/ockeghem/phpconf2021spasecurity
/zakuni/JWTをセッション管理に使っていいだのよくないだのいう話
https://ritou.hatenablog.com/archive/category/JWT
https://www.slideshare.net/ockeghem/phpconf2021spasecurity
/mrsekut-book-4797393165/469
↓client/serverの話が混ざっていいるmrsekut.icon
https://auth0.com/docs/secure/security-guidance/data-security/token-storage#browser-local-storage-scenarios
JWTなどをlocalStorageに保存するのはあまり安全ではない
https://tech.hicustomer.jp/posts/modern-authentication-in-hosting-spa/
https://blog.frevo-works.co.jp/entry/2019/09/24/112603
server上の、DB・メモリ・JWTの比較
cleint上の、cookie・localstrageの比較
dbでsession管理
https://lukesilvia.hatenablog.com/entry/20090523/p1
sessionの特性を考慮する必要がある
AmplifyはlocalStorageに3つのtokenを保存する
docs
https://tech.hicustomer.jp/posts/modern-authentication-in-hosting-spa/#:~:text=AWS%20AmplifyはlocalStorageに認証情報を保存
セキュリティ的にはAmplifyよりもAuth0のほうがいい
https://zenn.dev/link/comments/149b4887067e28
https://qiita.com/pipiox/items/95554673ba3b078ac112#sessionについて
https://ritou.hatenablog.com/entry/2019/12/01/060000
/mrsekut-book-4797393165/227 (4.6 セッション管理の不備)
↓全体的に間違っている気がする
根本の理解がおかしい
https://qiita.com/hththt/items/07136ad74127999df271#セッション基本
何も知らない状態でこれを読んだから理解がバグった感じがあるmrsekut.icon
いいねが多いので翻弄された
利用例
Login情報
Login Session
https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F62264%2F5f13c0d7-335c-8530-1351-84f89985f501.png?ixlib=rb-1.2.2&auto=format&gif-q=60&q=75&w=1400&fit=max&s=0f229973f33b33a395980851e867faf0
これでlocalにpassを保存しなくて済むのね
session idが漏洩したら誰でもログインできる
任意のリクエスト時に全session idも添付するの?
ブラウザを閉じて開き直してもloginし続けてるのはなんで?
ECサイトで、買い物かごの中身を入れておくといった、一時的なデータの保存にも使われる
有効期限
http://pentan.info/php/session_gc.html
セッションタイムアウト
あるWebサイトにアクセスして、そのサイトから出て行くかブラウザを閉じるまでが1セッションとなる。1セッションで1ページしか閲覧しない場合もあれば、1セッションで何ページも見る場合もある。
ただし、Webページを開いたままにするなど、ページ閲覧とページ閲覧の間にある程度の時間が経過した場合は新たなセッションとしてカウントされる。通常、ページ閲覧とページ閲覧の間が30分以上空くと、新たなセッションとしてカウントされることが多い。
https://webtan.impress.co.jp/g/セッション
削除したい
セッションが不要になった場合は、session_unsetファンクションを使ってセッションの内容を全て削除する。
Session Hijacking
セッションアダプション
https://www.php.net/manual/ja/book.session.php
https://qiita.com/aminevsky/items/2c00b6ef2849e1b71476