FastAPI

FastAPIとPostgreSQLで構築する認証システムの設計ガイド

ⓘ本ページはプロモーションが含まれています

もっとスキルを活かしたいエンジニアへ

スポンサードリンク
働き方から選べる

無料で使えて良質な案件の情報収集ができるサービス

エンジニアの世界では、「いつでも動ける状態を作っておけ」とよく言われます。
技術やポートフォリオがあっても、自分に合う案件情報を日常的に見れていないと、いざ動こうと思った時に比較や判断が難しくなってしまいます。
普段から案件情報が集まる環境を作っておくと、良い案件が出た時にすぐ動きやすくなりますよ。
筆者自身も、メガベンチャー勤務時代に年収1,500万円を超えた経験があります。振り返ると、技術だけでなく「どんな案件や働き方があるか」を日頃から見ていたことが、キャリアの選択肢を広げるきっかけになりました。
このブログを読んでくれた方に感謝を込めて、実際に使っている情報収集サービスを紹介します。

フルリモート・週3日・高単価、どんな条件も妥協したくないなら

フリーランスボードに無料会員登録する

利用者10万人以上。業界最大規模45万件の案件。AIマッチ機能や無料の相場情報が人気。

年収800万円以上のキャリアアップ・ハイクラス正社員を視野に入れているなら

Beyond Careerに無料相談する

内定獲得率90%以上。紹介先企業とは役員クラスのコネクションがある安心と信頼できるエージェント。


スポンサードリンク

FastAPIとPostgreSQLの環境構築

FastAPIとPostgreSQLを組み合わせた認証システムを構築するには、まず安定した環境設定が不可欠です。非同期処理やセキュリティ設計に配慮した接続方法を理解することで、スケーラビリティと信頼性を両立させることができます。以下では、async対応の接続手順とデータベースモデル設計のポイントを解説します。

非同期接続設定のポイント

FastAPIでPostgreSQLを非同期に扱うには、asyncpgpsycopg2の非同期ライブラリを使用します。以下が基本的な接続手順です:

  1. asyncpgをインストールする(pip install asyncpg
  2. FastAPIアプリケーション内で非同期クエリを実行する際は、awaitキーワードで処理待ちを明示
  3. データベースプールを使用してコネクションの再利用を効率化

注意:async対応時は必ずイベントループに適したライブラリを使うことが重要です。psycopg2は非同期処理には不向きなため、asyncpgが推奨されます。

データベースモデル設計の基本

セキュリティ面では、ユーザー情報やトークンデータを保存するテーブル設計に配慮が必要です。以下のようなスキーマ構成が一般的です:

テーブル名 主なカラム 補足
users id, username, email, hashed_password hashed_passwordはBCryptなどで暗号化保存
refresh_tokens token, user_id, expires_at トークンの有効期限を管理
webauthn_credentials user_id, credential_id, public_key FIDO2認証用の公開鍵保存

セキュリティ設計:ユーザー名やメールアドレスはユニーク制約を設定し、SQLインジェクション対策としてORM(例: SQLAlchemy)を活用する必要があります。


OAuth2.0認証フローの実装

OAuth2.0は現代アプリケーションで広く利用される認証プロトコルです。FastAPIではfastapi.security.OAuth2PasswordBeareroauthlibを組み合わせて、安全な認証フローを構築できます。以下の手順が基本となります:

クライアント資格証明認証の実装例

OAuth2.0では「クライアント資格証明認証」がAPI間通信で利用されます。以下に/tokenエンドポイントのコード例を示します:

パスワード認証フローの実装例

ユーザーIDとパスワードを送信する「パスワード認証」はWebアプリケーションで頻繁に用いられます。以下に/loginエンドポイントのコード例を示します:

リダイレクトURI検証のコード例
OAuth2.0ではallow_unsafe_redirects=Falseパラメータを設定して、不正なリダイレクトを防ぎます。以下はFastAPIのOAuth2PasswordBearerでの例です:

トークンリフレッシュメカニズム

アクセストークンの有効期間は短く設定し、リフレッシュトークンを使用して無期限にセッションを維持します。以下が典型的な処理フローです:

  1. 初回認証時にアクセストークンとリフレッシュトークンを発行
  2. アクセストークンが切れた際は、リフレッシュトークンを使って新しいアクセストークンを取得
  3. リフレッシュトークンの有効期限は長く設定し、refresh_tokensテーブルで管理

注意:リフレッシュトークンは暗号化保存し、複数デバイスでの利用時は無効化処理が必要です。


JWTの発行・検証処理

JWT(JSON Web Token)は軽量で信頼性の高い認証トークンとして広く利用されています。FastAPIではPyJWTライブラリを使用し、署名アルゴリズムやペイロード設計を工夫することでセキュリティを高められます。

署名アルゴリズム選定

JWTの安全性は署名アルゴリズムに大きく依存します。以下が選択肢と比較です:

アルゴリズム 説明 推奨用途
HS256 同一のシークレットで署名 内部システムなど、信頼できる環境
RS256 公開鍵と秘密鍵ペアで署名 外部APIとの連携や大規模アプリ

選定基準:内部開発ではHS256が簡便ですが、セキュリティを重視する場合はRS256が推奨されます。

ペイロード設計ガイドライン

ペイロードにはユーザーIDや有効期限など重要な情報を含めます。以下が典型的な構成例です:

注意:ペイロードに個人情報は含めず、最小限の情報を限定するように設計しましょう。


WebAuthn(FIDO2)認証導入

パスワードレス認証として注目されているWebAuthn(FIDO2)は、バイオメトリクスやハードウェアトークンを活用してユーザー認証を行います。FastAPIではpyfidowebauthnライブラリを使って実装できます。

pyfidowebauthnの比較分析

項目 pyfido webauthn
FIDO2プロトコルサポート ✅ 完全対応 ✅ 完全対応
公開鍵保存機能 ✅ データベースに自動保存可能 ⚠️ 手動処理が必要
ブラウザ対応性 🟡 一部非対応(古いバージョン) ✅ Chrome/Edge/Firefox対応
コミュニティサポート 🔹 活発な更新なし 🟢 大規模なコミュニティ

選定根拠webauthnは最新のブラウザ対応性が高く、多数の開発者コミュニティで活用されているため、推奨されます。

ユーザーレジストレーションフロー

WebAuthnの導入にはまず、ユーザーが自身のデバイスで公開鍵ペアを登録する必要があります。以下の手順です:

  1. クライアント側でgetAssertioncreateCredentialなどのAPIを呼び出す
  2. サーバーでは生成された公開鍵をデータベースに保存(例: webauthn_credentialsテーブル)
  3. 認証時にクライアントから送信される署名付き情報を検証し、ユーザーIDを特定

技術仕様:FIDO2プロトコルはPublic Key Credential APIと連携し、ブラウザでのサポートが必要です(Chromeなどは対応済み)。

認証時のセキュリティチェック

認証処理では以下の点に注意する必要があります:

  • 送信された署名が有効期限内であるか検証
  • デバイスIDと公開鍵が一致することを確認
  • リプレイ攻撃を防ぐためにnonceなどの一時トークンを使用

実装例webauthnライブラリではverify_authentication_response()メソッドで署名検証が可能です。


セキュリティ設計の要点

FastAPIとPostgreSQLを組み合わせた認証システムは、セキュリティ面での設計ミスにより大きなリスクを引き起こす可能性があります。以下に重要な対策ポイントを解説します。

SQLインジェクション防止策

SQLインジェクション被害を防ぐには、以下の3点が不可欠です:

  1. ORMの活用
  2. SQLAlchemyなどのORMを使用し、クエリをバインドパラメータで構築する(例: session.query(User).filter_by(username=username)
  3. ユーザー入力の検証
  4. メールアドレスやパスワードは正規表現などで形式チェック
  5. PostgreSQL側のセキュリティ設定
  6. セッションタイムアウトや権限制限を設定し、データベースにアクセスできるユーザーを限定

注意:直接SQL文を構築する場合はparameterize()などの関数でパラメータ化しましょう。

通信暗号化の実装

すべての通信がHTTPS経由であることを確保し、認証情報の盗聴を防ぎます。以下の設定が必要です:

  • SSL証明書opensslなどで自己署名証明書を作成し、FastAPIサーバーで有効化
    bash
    openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 365

  • PostgreSQL接続sslmode=requireなどのパラメータで暗号通信を強制

  • トークンの暗号化:JWTはHS256/RS256などで署名し、リフレッシュトークンは暗号化保存

実装例:FastAPIではuvicornを使用し、--certfile--keyfileオプションでSSL証明書を指定できます。


スケーラビリティ設計とRedis活用

認証システムは高負荷な環境でも安定した運用が求められます。Redisを用いたキャッシュ管理や分散同期戦略の導入が有効です。

Redis導入時の実装手順

Redisを活用する際には、SSL証明書生成とuvicorn設定を含む具体的な手順が必要です。

  1. SSL証明書の生成openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 365で自己署名証明書を作成
  2. Redisサーバー設定:SSL通信を有効にし、以下のパラメータを設定
    yaml
    requirepass your_password
    maxmemory-policy allkeys-lru

  3. FastAPIとの接続設定uvicorn--certfile cert.pem --keyfile key.pemとしてSSL証明書を指定

注意:Redisの通信にも暗号化を施すことで、データの不正アクセスリスクを軽減できます。

セッションキャッシュ構成

Redisではセッション情報をキャッシュし、データベースへのアクセス頻度を抑えることができます。以下の設定が基本です:

  • セッショントークンの保存
  • アクセストークンやリフレッシュトークンをhash型で保存(例: access_token:{token_id}
  • 有効期限付きキャッシュ
  • TTLを使用し、一定時間後には自動で削除されるように設定

性能向上:RedisのLuaスクリプトで原子的な操作を実施すると、複数リクエストでの競合を防げます。

分散環境での同期戦略

複数サーバー構成では以下のような設計が推奨されます:

  1. リフレッシュトークンの共有
  2. Redisにrefresh_tokensテーブルをキャッシュし、各サーバーで一元管理
  3. データレプリケーション
  4. マスター-スレーヴ構成でRedisを複製し、可用性を高める
  5. キャッシュ戻しの制御
  6. TTLが切れると自動的にキャッシュから削除されるため、DBとの同期が不要

注意:リフレッシュトークンの有効期限はRedisで管理し、複数サーバー間での一貫性を確保しましょう。


記事まとめ

本記事ではFastAPIとPostgreSQLによる認証システム構築に必要な技術ポイントを解説しました。特に以下の要素が重要です:

  • 非同期接続の設計とデータベースモデルのセキュリティ設計
  • OAuth2.0フローの実装とトークン管理のベストプラクティス
  • JWTの署名アルゴリズム選定とペイロード設計
  • WebAuthnによるパスワードレス認証の導入手順
  • SQLインジェクション防止と通信暗号化の実施方法
  • Redisを活用したセッション管理とスケーラビリティ対策

これらの技術を組み合わせることで、堅牢な認証システムを構築できます。プロジェクトに応じて検索結果の情報と本記事の導入内容を参考に、実装時に活用してください。

スポンサードリンク

もっとスキルを活かしたいエンジニアへ

スポンサードリンク
働き方から選べる

無料で使えて良質な案件の情報収集ができるサービス

エンジニアの世界では、「いつでも動ける状態を作っておけ」とよく言われます。
技術やポートフォリオがあっても、自分に合う案件情報を日常的に見れていないと、いざ動こうと思った時に比較や判断が難しくなってしまいます。
普段から案件情報が集まる環境を作っておくと、良い案件が出た時にすぐ動きやすくなりますよ。
筆者自身も、メガベンチャー勤務時代に年収1,500万円を超えた経験があります。振り返ると、技術だけでなく「どんな案件や働き方があるか」を日頃から見ていたことが、キャリアの選択肢を広げるきっかけになりました。
このブログを読んでくれた方に感謝を込めて、実際に使っている情報収集サービスを紹介します。

フルリモート・週3日・高単価、どんな条件も妥協したくないなら

フリーランスボードに無料会員登録する

利用者10万人以上。業界最大規模45万件の案件。AIマッチ機能や無料の相場情報が人気。

年収800万円以上のキャリアアップ・ハイクラス正社員を視野に入れているなら

Beyond Careerに無料相談する

内定獲得率90%以上。紹介先企業とは役員クラスのコネクションがある安心と信頼できるエージェント。


-FastAPI