4-5. ユーザー認証・認可とWebセキュリティ対策

パスワードのハッシュ化

パスワードを平文(生のテキスト)で保存することは厳禁です。Passlib(Passlib / bcrypt / argon2)などを用いて不可逆なハッシュ値に変換します。

Python

from passlib.context import CryptContext

pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")

# パスワードのハッシュ化
hashed_password = pwd_context.hash("MySecurePassword123")

# パスワード検証
is_valid = pwd_context.verify("MySecurePassword123", hashed_password)

JWT(JSON Web Token)によるステートレス認証

サーバー側にセッション状態を持たせないため、分散サーバーやSPA・モバイルアプリ認証で広く採用されています。

Python

import jwt
from datetime import datetime, timedelta, timezone

SECRET_KEY = "your_jwt_secret_key"
ALGORITHM = "HS256"

# JWTの生成
def create_access_token(data: dict):
    to_encode = data.copy()
    expire = datetime.now(timezone.utc) + timedelta(minutes=30)
    to_encode.update({"exp": expire})
    return jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)

Webセキュリティの主要な脆弱性と対策

  1. SQLインジェクション: 悪意あるSQL文の注入。
    • 対策: ORM(SQLAlchemy)やプレースホルダを用いたパラメータ化クエリを徹底する。
  2. XSS(クロスサイトスクリプティング): 悪質なスクリプトの実行。
    • 対策: HTML出力時にエスケープ処理(Jinja2は自動処理)を実施。
  3. CSRF(クロスサイトリクエストフォージェリ): ユーザーの意図しない不正リクエストの送信。
    • 対策: CSRFトークンの付与・検証。
  4. CORS(Cross-Origin Resource Sharing)設定: 異種オリジン間通信の制御。
    • 対策: FastAPI等のMiddlewareで許可するドメインを厳格に指定する。

Python

from fastapi.middleware.cors import CORSMiddleware

# CORSの設定例
app.add_middleware(
    CORSMiddleware,
    allow_origins=["https://your-frontend-domain.com"],  # 許可オリジン
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

コメント

タイトルとURLをコピーしました