FastAPI利用時にCSRF検証はどう実装するか

無題FastAPI利用時にCSRF検証はどう実装するか、を調べる機会、検討する機会がありましたので、その検討結果を書いておきます。

  • asgi_csrf
  • starlette-csrf
  • fastapi-csrf-protect

Claudeを利用して情報を調べた上で、私が説明文章を記述しています。

前提知識

asgi_csrf

asgi_csrfは汎用ASGIミドルウェアです。PythonでASGIとして動くアプリケーション全般に差し込めます。つまりフレームワークに依存していません。

  • メリット
    • フレームワーク非依存で薄く、実装を読みやすい。
    • 作者がSimon Willison氏なので、信頼感がある。
  • デメリット
    • 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で行いましたので、省略します。

類似投稿

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です