Flask の Cookie とセッション管理

Flask では Cookie とセッションを使ってクライアントの状態を保持できる。Cookie はブラウザに保存される小さなデータで、セッションはサーバー側でユーザーを識別するための仕組みである。

Cookie の設定と取得

Cookie は response.set_cookie() で設定し、request.cookies で取得する。

from flask import Flask, request, make_response

app = Flask(__name__)

@app.route('/set-cookie')
def set_cookie():
    resp = make_response('Cookie has been set')
    resp.set_cookie('username', 'Alice', max_age=3600)
    return resp

@app.route('/get-cookie')
def get_cookie():
    username = request.cookies.get('username', 'Guest')
    return f'Hello, {username}!'

max_age は Cookie の有効期限を秒単位で指定する。省略するとブラウザを閉じたときに削除される。

Cookie の削除

Cookie を削除するには、有効期限を過去に設定する。

@app.route('/delete-cookie')
def delete_cookie():
    resp = make_response('Cookie deleted')
    resp.delete_cookie('username')
    return resp

セッションの利用

セッションは署名付き Cookie としてクライアントに保存される。session オブジェクトを辞書のように操作できる。

from flask import Flask, session

app = Flask(__name__)
app.secret_key = 'your-secret-key'

@app.route('/login')
def login():
    session['user_id'] = 42
    return 'Logged in'

@app.route('/profile')
def profile():
    user_id = session.get('user_id')
    if user_id:
        return f'User ID: {user_id}'
    return 'Not logged in', 401

@app.route('/logout')
def logout():
    session.pop('user_id', None)
    return 'Logged out'

secret_key は署名に使われるため、本番環境では十分に複雑な値を設定し、外部に漏らさないこと。

セッションの注意点

Flask のデフォルトセッションはクライアント側に保存されるため、以下の点に注意が必要である。

データサイズCookie のサイズ制限(約4KB)を超えられない
機密情報暗号化されないため、パスワードなどは保存しない
改ざん検知署名により改ざんは検知できるが、内容は読める

サーバーサイドセッションが必要な場合は Flask-Session などの拡張を使う。