FastAPI利用時にCSRF検証はどう実装するか
無題FastAPI利用時にCSRF検証はどう実装するか、を調べる機会、検討する機会がありましたので、その検討結果を書いておきます。
- asgi_csrf
- starlette-csrf
- fastapi-csrf-protect
Claudeを利用して情報を調べた上で、私が説明文章を記述しています。
前提知識
asgi_csrf
asgi_csrfは汎用ASGIミドルウェアです。PythonでASGIとして動くアプリケーション全般に差し込めます。つまりフレームワークに依存していません。
- メリット
- フレームワーク非依存で薄く、実装を読みやすい。
- 作者がSimon Willison氏なので、信頼感がある。
- デメリット
- FastAPIと統合されていないので、エンドポイント単位での調整はしにくい。
- デフォルトが全エンドポイントに適用されて、ホワイトリストで除外する形式。
- ドキュメントや情報量が少ない
- FastAPIと統合されていないので、エンドポイント単位での調整はしにくい。
Simon Willison氏は、Djangoの共同作者で、Python SoftwareFoundationの理事でもあります。私は、氏のブログを日々、拝見しています。
starlette-csrf
starlette-csrfは、ASGIフレームワークである。Starlette用のミドルウェアです。Startletteで構築されたフレームワークに差し込めます。FastAPIはStarletteの上で動いているため、差し込めます。
- メリット
- URL正規表現があったり、条件別の制御ができる
- ミドルウェアとして、FastAPIに差し込みやすい。
- デメリット
- SSRには向いてない。
- FastAPIのルーティング管理と別でルーティングの管理が必要になる
fastapi-csrf-protect
fastapi-csrf-protectは、FastAPIに特化したCSRF保護ライブラリです。
- メリット
- FastAPIのエンドポイント単位で制御できる。
- SPAでもテンプレートでも両対応している。
- デメリット
- ミドルウェア方式ではないので、デフォルトで全部守れない。
- エンドポイント個別に対して設定する必要があり、設定漏れしやすい。
当時の選択
- 私の場合、基本的にセキュリティはデフォルトで全て保護して、例外のみを記載する方が好きです。
- なので、asgi_csrfの選択が優勢になりました。(当然、作る対象によりますが)
以下のようになります。実装は、Claude Codeで行いましたので、省略します。