0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Flaskアプリケーションのセッション問題

Last updated at Posted at 2022-09-29

Flaskでアプリケーションを作っていて、ちょっとはまったのでメモ。

複数のFlaskアプリケーション

Flask でセッションを使うには、

app = Flask(__name__)
app.config['SECRET_KEY'] = b'適当なキー文字列'

と設定するのは周知の通り。

たとえば、Flask のアプリケーションを2つ稼働しているとして、
どちらもセッション情報を使う(たとえばログイン情報を保持しておくとか)場合。
同じブラウザの別タグで、それぞれのアプリケーションを開いて、タブを切り替えたりしていると、片方のセッションが消えてしまう現象が発生する。
FlaskはCookie にセッション情報を保存するが、デフォルトだと、"session" という名前になる。
cookie1.png

アプリケーション1つなら問題ないが、2つの場合、同じ"session" という名前でCookie に書き込まれるので、後から開いた方のセッション情報で、前の情報が上書きされてしまうことになる。

これを回避するためには、cookie に保存するときの名前を設定する。

app.config['SESSION_COOKIE_NAME'] = 'hogehogeApp01_Cookie_name'

もちろん、それぞれのアプリケーションで名前は変えておく。
cookie2.png
設定した名前でCookie が保存されるので、上書きされることがなくなる。

iPhone 対応

本番稼働直前の最後のテストで、iPhone で試していて発覚した問題。
FlaskがSession情報をCookieに保存するのは前述の通りだが、デフォルトだとiPhone にはCookieが保存されなかった。
どうやらiPhoneではサードパーティクッキーとして認識されると、そのCookie をさくっと削除してしまうらしい。
いろいろ試した結果、

app.config['SESSION_COOKIE_SECURE'] = True
app.config['SESSION_COOKIE_SAMESITE'] = 'None'

この2つを追加したところ、iPhoneにもCookie が保存されるようになった。
ちなみに、
app.config['SESSION_COOKIE_SAMESITE'] = None
ではなく、
app.config['SESSION_COOKIE_SAMESITE'] = 'None'
と文字列で設定しないとNG。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?