久々に Fastify を使ったらセッションってどのプラグイン使えばいいのだっけとなったので
https://fastify.dev/ecosystem
公式のプラグインだと 3 種類
◯ @fastify/cookie
◯ @fastify/session
◯ @fastify/secure-session
@fastify/cookie はセッションというよりは cookie を扱うライブラリ
だけど署名機能があるので koa の koa-session 相当のものならこれで十分
ただし あくまで cookie ライブラリなのでセッション風に特定のオブジェクトを更新するだけで後は自動でやってくれるということはない
cookie を読み取って署名チェックや cookie をレスポンスで送信するなどの制御は自分で実装する必要あり
それらを行うための関数は用意されるので addHook を使って onRequest や onSend にフックを追加すれば良い
@fastify/session はサーバーサイドのセッション
PHP みたいなもの
ID を cookie に書き込んでデータはサーバー側で持つ
デフォルトだとセッションデータはメモリ上に保持するのでセッション数が増えるとメモリを使うしサーバーのリスタートで消える
ストアの実装をカスタマイズできるのでちゃんとしたところで使うならファイル等に書き込んだほうがいい
redis に保存するなら一応コミュニティに別のプラグインがある
ただ スターがほとんどなくてマイナーみたいなのでストアを自作でもいいかも
このプラグインを使うのに @fastify/cookie が必須
内部で自動でやってくれないので自分でインストールと register しないといけない
@fastify/secure-session はクライアントサイドでデータを持つセッション
@fastify/cookie の署名とは違って暗号化してくれるのでユーザーが中身を見れない
hapi の iron 的なもの
暗号化には sodium-native を使ってる
sodium でググってると高速な暗号化というのを見かけたけど Node.js 組み込みの crypto と比べてどっちが速いのかはわからない
わざわざ外部のものを使ってるんだから組み込みよりは高速?
事前に付属ツールで鍵を発行しておいて プラグインの登録時にその鍵を渡す必要あり
鍵を使わずに secret にパスワード指定でも動かせるけど 起動時に毎回内部で鍵を生成してるので少し遅くなるらしい
内部で @fastify/cookie を使ってるけど @fastify/session とは違ってインストールも register も自動でやってくれるので意識しなくて良い
基本ブラウザ側しかいじらないから普段サーバ側ってあんまり気にしてなかったけど 触れることあったのでセッションのファイルサイズについて考えてみた
セッションは localStorage とかと違って サーバ側に保存するデータのこと
cookie で関連付けていて ユーザごとのデータが保存されてるもの
ということは 多くの人がアクセスするサーバってセッションだけですごくストレージつかってるんじゃないかな?って思った
大きいところは分散とかやってるのでしょうけど アクセスするサーバが違ってセッション情報引き継いでない なんてサービスとしてダメだと思うので共有させてるはず
それに サイトによってはほぼ永続みたいな期間でログイン情報が保存されていたりする
1年くらいしてもパスワードの再入力でないところってわりとあるし
無制限に保存するとして 1 ユーザあたり 100KB のデータを保存したとすると
100万人ユーザがいたら 0.1TB
1000万人ユーザだと 1TB
セッションだけですごいサイズ
100 万人と言っても 同じユーザかどうかは cookie だよりなのでリセットされてもサーバには残り続けて実際は数十万人くらいでもそれくらいいきそう
ログインするシステムだとアカウント作らない一見さんのセッション情報はもたないから無駄は減るけどやっぱり捨て垢で一時的な人はいっぱいいるし
人がいっぱい来るサービスってどうしてるんだろうねー
大規模なものならストレージが 1TB なんてどうということないのか それとも定期的に来てれば期限なしだけどアクセスなしが半年くらい続くとリセットしてるのかな
セッションは localStorage とかと違って サーバ側に保存するデータのこと
cookie で関連付けていて ユーザごとのデータが保存されてるもの
ということは 多くの人がアクセスするサーバってセッションだけですごくストレージつかってるんじゃないかな?って思った
大きいところは分散とかやってるのでしょうけど アクセスするサーバが違ってセッション情報引き継いでない なんてサービスとしてダメだと思うので共有させてるはず
それに サイトによってはほぼ永続みたいな期間でログイン情報が保存されていたりする
1年くらいしてもパスワードの再入力でないところってわりとあるし
無制限に保存するとして 1 ユーザあたり 100KB のデータを保存したとすると
100万人ユーザがいたら 0.1TB
1000万人ユーザだと 1TB
セッションだけですごいサイズ
100 万人と言っても 同じユーザかどうかは cookie だよりなのでリセットされてもサーバには残り続けて実際は数十万人くらいでもそれくらいいきそう
ログインするシステムだとアカウント作らない一見さんのセッション情報はもたないから無駄は減るけどやっぱり捨て垢で一時的な人はいっぱいいるし
人がいっぱい来るサービスってどうしてるんだろうねー
大規模なものならストレージが 1TB なんてどうということないのか それとも定期的に来てれば期限なしだけどアクセスなしが半年くらい続くとリセットしてるのかな