用 PyJWT 实测 JWT 登录认证:三段结构与明文 payload、algorithms 必须显式指定、exp 默认不强制、leeway、alg=none 与篡改 role 的攻击被拒绝、HS256 与 RS256 的差别与算法混淆被挡住、令牌里的 role 在有效期内不随数据库变化。
实测 Refresh Token:短命访问令牌过期后用刷新令牌换新、刷新令牌轮换与重用检测(旧令牌再用会撤销整个家族)、响应丢失后合法重试被误判、登出后访问令牌仍可用到过期、刷新令牌过期、放进限定路径的 HttpOnly cookie。
实测 API 限流的实现细节:令牌桶的突发与补充、20 个线程抢 10 个名额时非原子 GET+SET 放行 20 个而 Lua 脚本只放行 10 个、429 的 Retry-After 与 RateLimit 头、无条件信任 X-Forwarded-For 时限流被随意绕过、按用户与按 IP 限流的差别。
在真实的无头 Chrome 里验证 CORS 预检:哪些请求触发预检(JSON、自定义头、PUT)与哪些不触发(GET、text/plain)、Max-Age 缓存让 OPTIONS 从 6 个降到 3 个、缺 Allow-Headers 时请求被拦、Authorization 必须明确列出、OPTIONS 要求认证时整个跨域 API 不可用。
实测 Flask API 的 ETag 缓存:add_etag 与 make_conditional 得到 304 与空正文、If-None-Match 列表与弱 ETag、哈希 ETag 的 304 仍要 64 ms 而版本号 ETag 的 304 只要 0.41 ms、Last-Modified 与 If-Modified-Since、48039 字节对 0 字节的带宽差别。
实测 Flask 的 OpenAPI 文档生成:用 apispec 从 marshmallow 与 docstring 生成 3.0.3 文档并通过 openapi-spec-validator 校验、校验规则自动变成 minLength 与 minimum 与 readOnly、flask-smorest 一个装饰器同时做校验序列化与文档并自带 /openapi.json 和 Swagger UI、422 的固定格式、schema 改了文档跟着变。
用 marshmallow 4.3.1 实测序列化与校验:dump 只输出声明的字段与 load_only、load 一次返回所有错误且嵌套用下标定位、未知字段的 RAISE 与 EXCLUDE 与 INCLUDE、partial 与钩子、Int 字段把 5.5 截断成 5、dump 10000 个对象比手写字典慢约 23 倍。
用 pydantic 2.13.5 实测 Flask 中的校验与序列化:宽松模式的类型转换与 int_from_float 错误、bool 的接受范围与 strict、直接 jsonify(e.errors()) 会因 bytes 与异常对象而 500、request.args.to_dict 丢掉重复参数、model_dump(mode=json) 与 exclude、校验 10000 个字典 18.6 ms。
实测 Flask 大批量 JSON 响应:10 万行 jsonify 95 ms、11.1 MB、峰值内存约 22 MB;orjson 比标准库快约 8 倍;debug 模式让响应变大;gzip 压到约 10%;真实 gunicorn 里首字节时间等于生成时间,超过 worker timeout 会被杀。
在 50 万行 PostgreSQL 数据上实测流式 JSON:一次性 jsonify 首字节 1698 ms、内存多 352 MB,流式首块 114 ms、内存只多约 1 MB 但总时间 3.1 倍;流式 JSON 数组合法性;流到一半出错时状态码已是 200、客户端 IncompleteRead;客户端断开时生成器收到 GeneratorExit。
实测 SECRET_KEY 的用途与风险:没设时 session 报 RuntimeError、cookie 载荷明文可读、知道 key 就能伪造 role=admin、换 key 让所有人被登出、SECRET_KEY_FALLBACKS 平滑轮换、弱 key 用词表瞬间被猜中而强 key 对 20 万个候选无一命中。
实测 Flask session cookie 的安全相关配置:默认只有 HttpOnly 没有 Secure 与 SameSite、每个配置项对应的 Set-Cookie 属性(含 __Host- 前缀与 Partitioned)、permanent 的 Expires、REFRESH_EACH_REQUEST 的续期与 Vary: Cookie、cookie 超过约 4093 字节时的警告、test client 不执行 Secure 规则。