检查 Flask 会话 cookie 的大小

Check the size of Flask's session cookie

我正在使用 Flask 的默认安全 cookie 会话。我已经看到 cookie 的大小限制是 4KB。如何检查 Flask 会话 cookie 的大小?

如果序列化的 cookie 值太大(> 4093 字节),Werkzeug 在生成 set-cookie header 时已经显示了详细的警告。

UserWarning: The 'session' cookie is too large: the value was 4050 bytes but the header required 50 extra bytes. The final size was 4100 bytes but the limit is 4093 bytes. Browsers may silently ignore cookies larger than this.

这只是一个警告,因为我们实际上并不知道任何给定的浏览器会接受什么,4093 只是几年前常用的最低值。 (What is the maximum size of a web browser's cookie's key?)

如果您在 session cookie 中存储超过 4k 的数据,您可能需要重新评估存储数据的方式,而不是尝试添加大小检查。 4k cookie 意味着每次请求和响应都会发送 4k 数据。例如,您可能想从数据库或 Store large data or a service connection per Flask session 中检索数据,在这种情况下,您需要在 session 中存储的只是一个用于获取数据的 ID。


如果您真的想以编程方式检查 cookie 的大小,您可以从 response.headers 获取它们并检查它们的长度。 Flask 仅在返回响应之前序列化 session cookie,但您可以手动触发它以便 cookie 值可用。

from flask.globals import _request_ctx_stack

@app.after_request()
def error_for_large_cookie(response):
    ctx = _request_ctx_stack.top
    app.session_interface.save_session(app, ctx, response)
    
    for value in response.headers.getlist("Set-Cookie", as_bytes=True):
        if len(value) >= 4093:
            raise ValueError("Cookie too large.")

如果包含 session 的任何 cookie 太大,这将导致 500 错误(并在终端中显示回溯)。或者将警告转为错误,效果相同但代码更少:

import warnings

warnings.filterwarnings("error", r".* cookie is too large", module=r"werkzeug\.http")

sys.getsizeof() 递归检查 Python 中 session 字典的大小没有用,因为重要的是序列化 cookie header 的大小,而不是Python object 尺寸。