共通ガイドライン
本ガイドラインの目的
本ドキュメントは、REST/gRPC/GraphQL/メッセージング等、プロジェクトで扱う各種API設計に共通する基本方針・記述ルール・推奨例をまとめたものです。 各API仕様書テンプレートの該当セクションは本ガイドラインに準拠してください。
1. 認証・認可
- 方式例: OAuth2, JWT, API Key, mTLS, Cookie認証 など
- 記述例:
- どの方式を採用するか、トークンの発行・検証フロー、スコープ設計、認可エラー時のレスポンス例
- gRPCの場合はmetadata、GraphQLの場合はHTTPヘッダやcontextでの伝搬方法も明記
2. エラー設計
- 共通方針:
- エラーは一貫した構造・コード体系で返す
- REST: HTTPステータス+エラーボディ(code, message, details等)
- gRPC: status code+details、GraphQL: errors配列
- 記述例:
- エラーコード表、共通エラーレスポンス例
- 例外的なエラー(バリデーション、認可、システム障害等)の扱い
3. バージョニング
- 方針:
- URLパスによるバージョニングを採用する。APIのバージョンはURLパスに含める(例:
/v1/users)。 - 破壊的変更(既存のAPI利用者への影響がある変更)を伴う場合は、メジャーバージョンを上げる(例:
/v1から/v2)。 - 後方互換性のある変更(例: 新しいフィールドの追加、新しいエンドポイントの追加)の場合は、既存のバージョン内で対応する。
- メッセージスキーマの変更も、破壊的変更の場合はバージョンアップの対象とする。
- URLパスによるバージョニングを採用する。APIのバージョンはURLパスに含める(例:
- バージョンアップ手順・互換性維持方針:
- 新しいバージョンのAPIをリリースする際は、一定期間、旧バージョンとの並行稼働を保証する。
- 旧バージョンのAPIの廃止(Deprecation)ポリシーを明確にし、事前に利用者へ通知する。
4. 共通レスポンス構造
- 成功時:
- 必須フィールド(data, meta, status等)を統一
- ページング・メタ情報の表現方法
- 失敗時:
- エラー構造(上記参照)
5. ロギング・監査・トレーシング
- 推奨:
- 重要操作・エラー時のログ出力方針
- 監査証跡の記録(ユーザーID、操作内容、タイムスタンプ等)
- 分散トレーシング:
- リクエストの開始から終了まで、複数のサービスを横断して処理を追跡できるよう、トレースID(
trace-id)とスパンID(span-id)を伝搬させる。 - HTTPヘッダには、OpenTelemetryやW3C Trace Contextに準拠した形式(例:
traceparent,tracestate)を使用する。 - gRPCの場合は、
metadataを通じて伝搬させる。
- リクエストの開始から終了まで、複数のサービスを横断して処理を追跡できるよう、トレースID(
6. セキュリティ
6.1. 入力バリデーション
- 全てのAPI入力(パスパラメータ、クエリパラメータ、リクエストボディ)に対して、型、必須/任意、値の範囲、正規表現、最大長などの厳格なバリデーションをサーバーサイドで実施する。
- クライアントサイドでのバリデーションはUX向上のためであり、セキュリティ対策としてはサーバーサイドバリデーションを必須とする。
6.2. レートリミット
- APIごとに、一定時間あたりのリクエスト数に制限を設ける。
- 制限を超過した場合は、適切なHTTPステータスコード(例:
429 Too Many Requests)を返す。 - 認証エンドポイントやパスワードリセットエンドポイントなど、ブルートフォース攻撃の対象となりやすいAPIには、より厳格なレートリミットを適用する。
6.3. CORS (Cross-Origin Resource Sharing)
- 許可するオリジン、HTTPメソッド、ヘッダを明確に設定し、最小限のアクセスを許可する。
- ワイルドカード(
*)の使用は、開発環境など限定的な場合を除き、本番環境では避ける。
6.4. CSRF (Cross-Site Request Forgery) 対策
- 状態を変更するAPI(POST, PUT, DELETEなど)には、認証方式に応じたCSRF対策を適用する。特にCookie認証の場合は、CSRFトークン(Synchronizer Token Pattern)やSameSite Cookie属性(Lax/Strict)が重要となる。
- Refererヘッダの検証も補助的に行う。
6.5. XSS (Cross-Site Scripting) 対策
- APIからのレスポンスに含まれるユーザー入力由来のデータは、クライアントサイドで表示する際に適切にエスケープ処理を行う。
- Content-Security-Policy (CSP) ヘッダを適切に設定し、インラインスクリプトの実行や不正なリソースの読み込みを制限する。
6.6. SQLインジェクション対策
- データベースへのアクセスには、必ずプリペアドステートメント(パラメータ化クエリ)を使用し、SQL文とユーザー入力を分離する。
- ORM (Object-Relational Mapping) を使用する場合も、SQLインジェクション対策が適切に行われていることを確認する。
6.7. セキュリティヘッダ
- HSTS (Strict-Transport-Security), X-Content-Type-Options, X-Frame-OptionsなどのHTTPセキュリティヘッダを適切に設定する。
6.8. 機密データの保護
- パスワードやAPIキーなどの機密データは、平文で保存せず、強力なハッシュ関数(例: bcrypt, Argon2)を用いてハッシュ化して保存する。
- データベースやファイルシステムに保存される機密データは、暗号化を検討する。
- ログに機密情報が出力されないように注意する。
7. ドキュメント・スキーマ管理
- OpenAPI/Swagger, Protobuf, GraphQL SDL等の利用推奨
- 自動生成・バージョン管理の運用ルール
8. その他
- 用語・命名規則: 一貫した命名(キャメル/スネーク等)
- タイムゾーン・日付形式: 全てのAPIにおいて、日付と時刻はISO 8601形式(例:
YYYY-MM-DDTHH:mm:ssZ)で表現し、タイムゾーンはUTCに統一する。 - 国際化・多言語対応: 必要に応じて、
Accept-Languageヘッダの解釈や、ロケールに合わせたメッセージ返却の方針などを定義します。