Flaskのセッション管理

最近 Flask というWebアプリフレームワークを、いじってて気付いた事をメモとっておく。

セッション管理の仕方が、面白かったというか自分はそういう風に実装した事なかったのでへーと思った。

僕のなかでのセッションデータの管理イメージ

別にこれが普通というわけではないのだろうけど、なんとなくこういうイメージ

  • サーバサイドでセッションデータを発行
  • セッションキーをCookieとかクライアントサイドに持たせる。
  • 違うページにいったら、セッションキーを元にセッションデータを取得

この場合、クライアントサイドにもつ情報は、セッションデータに紐づくキーであって、セッションデータそのものはサーバサイドのストレージなりなんなりにもってるイメージ。

事の発端

Flaskは MicroFrameworkをうたっているフレームワークなので、フレームワークが備える機能も必要最低限になっていて、足りないところは自分たちで補って好きにやっちゃいなよ的なスタンス。

例えば今回の話に関係するところでいうと、DBやORMといったデータストレージを担うような部分は無かったりする。(extentionはあるお)

で、どうやって サーバサイドでセッションデータ管理してるんだろうというのが事の発端。

結論を簡単に言うと、

「そんなんじゃない」「やってない」とか「サーバサイドでデータ持つとか言ってない」

と、釣られた魚には餌をやらんぞ言わんばかりの感じだった。

Flaskの場合

そもそも、sessionを使うときは

from flask import session

を使うわけなのですが、こいつのソースを追っていくと↓にたどりつく。

from werkzeug.contrib.securecookie import SecureCookie

もう眠いんで色々ハショるけど、Flaskでは基本的にセッションキーを含め、暗号化した実データをまるっと、SecureCookieとしてブラウザのCookieにセットしているという感じ。(だからFlask製のアプリを仮にインストールするときはSECRET_KEYをちゃんと自分しか分からないものにした方が良いよ)

セッションの考え方?

なんでこうしたのか考えたり聞いてみたりした事

  • そもそもDBやORM的なものがないからシンプルなやり方にした。
  • セッションの役割は、認証情報だったり最低限の情報を格納するもの。
  • セッションデータを、サーバサイドでわざわざ大量に管理するものではない。(機密性の高い情報を乗っけたりもしないとか)

というのがFlaskのセッション管理の方針なのかも。

セッションデータそのものをCookieに持たせる事のメリットもある。

  • サーバサイドでセッションデータを管理する必要がなくなり、スケールさせやすい
  • ユーザー数が多いほどセッションデータは肥大化していくので、以外に管理めんどい。(有効期限切れデータを消すとか)

んーなるほどなーと思ったという話。

余談

ちなみにDjangoだとセッションストレージはデフォルトはDBです。

https://docs.djangoproject.com/en/1.3/topics/http/sessions/

最後に結局のところ、(サーバサイドの)セッションストレージという概念自体がFlaskにはないから、仮にセッション管理方法をDjangoみたいに、セッションストレージ差し替えたりしたいという場合は、自分でがんばるしかないっぽい。(逆にあったら是非おしえてください。)