非機能要件定義書
プロジェクト: シュートボクシング協会 統合PWAアプリ(SB-Ticket)
バージョン: 2.0
作成日: 2026-03-16
ソース: SB_要件定義書_v2.0.docx
1. セキュリティ要件
1-1. 通信セキュリティ
| 項目 | 仕様 | 備考 |
|---|
| HTTPS強制 | 全通信をHTTPS化。HTTP→HTTPSへの自動リダイレクト | Vercel/Render標準対応 |
| HSTS | Strict-Transport-Security ヘッダーを設定 | max-age=31536000; includeSubDomains |
| セキュリティヘッダー | Content-Security-Policy / X-Frame-Options: DENY / X-Content-Type-Options: nosniff を全レスポンスに付与 | |
| CORS | 許可オリジンを明示的に指定。ワイルドカード(*)使用禁止 | 本番ドメインのみ許可 |
1-2. 認証・認可セキュリティ
| 項目 | 仕様 | 備考 |
|---|
| JWT管理 | アクセストークン有効期限:15分。リフレッシュトークン:7日。HttpOnly Cookieで管理 | localStorageへの保存禁止 |
| セッション管理 | ログアウト時にサーバー側でトークン無効化 | |
| 権限チェック | 全APIエンドポイントでロールベースアクセス制御(RBAC)を実装。フロントの表示制御だけに頼らない | |
| アカウントロック | 5回連続ミスでロック・協会管理者のみ解除可能 | ロック状態はDBに記録 |
| パスワードハッシュ | bcrypt(コストファクター12以上)でハッシュ化。平文保存・MD5/SHA1使用禁止 | |
| 総当たり攻撃防止 | ログイン試行にレートリミット(IP単位:10回/分)を設定 | Redis or Supabaseで管理 |
1-3. データ保護
| 項目 | 仕様 | 備考 |
|---|
| 個人情報暗号化 | 選手・ファンの電話番号・メールアドレスはDBに暗号化保存(AES-256) | |
| SQLインジェクション防止 | 全DB操作にパラメータ化クエリ(Supabase Client使用)。生SQLの文字列結合禁止 | |
| XSS防止 | ユーザー入力を全てサニタイズ。ReactのデフォルトエスケープをバイパスするdangerouslySetInnerHTML使用禁止 | |
| CSRF防止 | state付きOAuthフロー・SameSite=StrictなCookieを使用 | |
| ファイルアップロード | 画像アップロード時にMIMEタイプ・サイズ(最大5MB)・拡張子を検証。実行ファイルアップロード拒否 | |
| ログ管理 | 個人情報・パスワード・トークンはログに出力しない | |
1-4. API・インフラセキュリティ
| 項目 | 仕様 | 備考 |
|---|
| APIレートリミット | 全エンドポイントにレートリミット設定。認証API:10回/分。通常API:100回/分/ユーザー | |
| Webhook検証 | チケットぴあからのWebhookはHMAC-SHA256署名を検証してから処理 | |
| 環境変数管理 | APIキー・DB接続情報は全て環境変数で管理。コードへのハードコード禁止 | |
| 依存パッケージ | 既知の脆弱性を持つパッケージを使用しない。npm auditを定期実行 | |
| Supabase RLS | Row Level Security(RLS)を全テーブルに設定。選手は自分のデータのみアクセス可能なポリシーを定義 | |
| エラーハンドリング | 本番環境ではスタックトレース・内部エラー情報をクライアントに返さない | |
1-5. 管理画面アクセス制限
- 協会管理画面(/admin/*)はIPアドレス制限 or VPN経由のみアクセス可能な設定を推奨
- concept管理画面(/concept/*)はIP制限必須
- 管理者の操作ログを全て記録(誰が・いつ・何を変更したか)
2. パフォーマンス要件
2-1. ページ読み込み
| 指標 | 目標値 |
|---|
| FCP (First Contentful Paint) | < 1.8s |
| LCP (Largest Contentful Paint) | < 2.5s |
| CLS (Cumulative Layout Shift) | < 0.1 |
| Lighthouse Performance | 90+ |
2-2. API応答時間
| API種別 | 目標値 |
|---|
| 一般API | < 200ms |
| LP生成(AI) | < 30s(非同期処理) |
| 画像合成 | < 10s |
| QRコード生成 | < 1s |
2-3. 同時接続
| 項目 | 目標値 |
|---|
| 同時接続ユーザー | 100+ |
| 選手登録数 | 数十名〜100名 |
| ファンデータ | 数千〜数万件 |
3. 可用性要件
| 項目 | 目標値 |
|---|
| 稼働率 | 99.5%以上 |
| 計画停止通知 | 24時間前 |
| 障害復旧目標(RTO) | 4時間以内 |
| データ復旧目標(RPO) | 1時間以内 |
4. PWA要件
| 項目 | 仕様 |
|---|
| Service Worker | オフラインキャッシュ戦略実装 |
| ホーム画面追加 | manifest.json設定。アプリアイコン・スプラッシュスクリーン |
| プッシュ通知 | Web Push API(Service Worker経由) |
| 対応ブラウザ | Safari / Chrome / Edge(最新2バージョン) |
| 対応OS | iOS / Android / Windows / macOS |
5. レスポンシブ要件
| ブレークポイント | 用途 |
|---|
| < 640px | モバイル |
| 640px〜768px | タブレット縦 |
| 768px〜1024px | タブレット横 |
| 1024px〜1280px | デスクトップ |
| 1280px〜 | ワイドデスクトップ |
全画面でPC/タブレット/スマホの3パターンを完全対応。
協会管理画面も現場(スマホ)から確認可能な設計。
6. アクセシビリティ要件
| 項目 | 基準 |
|---|
| WCAG準拠レベル | AA |
| コントラスト比 | 4.5:1以上(テキスト) |
| タッチターゲット | 44px以上 |
| キーボード操作 | 全主要操作がキーボードのみで完結 |
| スクリーンリーダー | aria-label適切に設定 |
7. データ管理要件
7-1. バックアップ
| 項目 | 仕様 |
|---|
| 自動バックアップ | 日次(Supabase標準) |
| 手動バックアップ | 協会管理者がCSV出力可能 |
| データ保持期間 | 無期限(削除は論理削除) |
7-2. 個人情報管理
| 項目 | 仕様 |
|---|
| 暗号化対象 | 電話番号・メールアドレス・振込先情報 |
| 暗号化方式 | AES-256(Python cryptographyライブラリ) |
| ログ除外 | 個人情報・パスワード・トークンはログ出力禁止 |
8. 運用要件
8-1. 監視
| 項目 | 仕様 |
|---|
| ヘルスチェック | エンドポイント /health |
| エラー監視 | Sentry等のエラートラッキング |
| API監視 | レスポンスタイム・エラー率 |
8-2. ログ
| ログ種別 | 用途 |
|---|
| アクセスログ | APIリクエスト記録 |
| 操作ログ | 管理者操作の全記録(誰が・いつ・何を) |
| エラーログ | エラー詳細(個人情報除外) |
| セキュリティログ | ログイン試行・ロック・権限エラー |
9. ホスティング・インフラ要件
| 項目 | 仕様 |
|---|
| フロントエンド | Vercel |
| バックエンド | Render |
| データベース | Supabase(PostgreSQL) |
| ファイルストレージ | Supabase Storage |
| キャッシュ/レートリミット | Redis(Upstash) |
| SMS | Twilio |
| AI(LP生成) | Claude API(Anthropic) |
10. 国際化・ローカライズ
| 項目 | 仕様 |
|---|
| 対応言語 | 日本語のみ(Phase 1) |
| タイムゾーン | JST(Asia/Tokyo) |
| 通貨 | JPY(日本円) |
| 文字コード | UTF-8 |
Generated by CCAGI SDK Phase 1 - 2026-03-16