API設計・開発における品質は「設計原則・セキュリティ・バージョニング・認証認可・ドキュメント・エラー設計・パフォーマンス・ガバナンス」の8領域を体系的に押さえることで担保されます。
API設計、セキュリティ、バージョニング、認証・認可、ドキュメント化など開発・運用時の推奨事項をまとめるセクションです。
直感的なURI設計とHTTPメソッドの適切な使い分けが、拡張性・保守性の高いAPIの出発点です。
API設計の基本は、直感的で分かりやすく、拡張性や保守性を保つことにあります。RESTfulなWeb APIの場合、HTTPメソッド(GET, POST, PUT, DELETE など)を用いてリソース(データやオブジェクトなど)へ操作を行い、リソースを表すURIを設計します。URIには動詞ではなく名詞を使用し、コレクションには複数形を用いる慣例が一般的です。階層構造は2〜3層に抑え、過剰なネストや内部構造のリークを避けることも重要です。
URI設計の良い例・悪い例
| 項目 | 良い例 | 悪い例 |
|---|---|---|
| リソース名 | /users | /getUsers, /user_list |
| 単一リソース | /users/123 | /users/getById?id=123 |
| ネスト(適切) | /users/123/orders | /users/123/orders/items/detail/price |
| 操作の表現 | DELETE /users/123 | /users/deleteUser/123 |
| 複数形 | /products | /product |
設計原則まとめ
| 原則 | 内容 |
|---|---|
| 名詞ベースURI | URIにはリソース名(名詞)を使い、動詞は使わない |
| 複数形コレクション | リソース一覧は複数形(/users, /orders) |
| 階層は2〜3層まで | 深いネストは可読性・保守性を下げる |
| HTTPメソッドで操作を表現 | GET=取得、POST=作成、PUT/PATCH=更新、DELETE=削除 |
| 後方互換性の維持 | 破壊的変更はバージョンアップで対応 |
💡 ポイント:
PUTはリソース全体の置き換え、PATCHは部分更新です。更新APIを設計する際は用途に応じて使い分けることで、クライアント実装の誤解を防げます。
APIセキュリティは設計段階から組み込むべきであり、OWASP Top 10対応・最小権限原則・APIゲートウェイによる集中管理が三本柱です。
APIのセキュリティは設計段階から考えるべき重要な要素です。全通信にTLS(HTTPS)を使い暗号化を徹底します。認証や認可にはOAuth 2.0やOpenID Connectなど業界標準の方式を推奨し、APIキーは短期間でローテーションし安全に管理します。認可はエンドポイント単位でもオブジェクト単位でも行い、最小権限の原則(PoLP)を徹底することが重要です。APIゲートウェイを介してレートリミットやIPフィルタ、ロギング、監査などを集中管理し、不正アクセスやDoS攻撃への対策も講じます。さらに、セキュリティレビューやペネトレーションテストを定期的に実施し、OWASP Top 10 APIセキュリティリスクへの対応も忘れず行います。
OWASP API Security Top 10(主要リスク)
| # | リスク名 | 概要 |
|---|---|---|
| 1 | オブジェクトレベルの認可不備 | 他ユーザーのリソースIDを指定してアクセスできてしまう(BOLA/IDOR) |
| 2 | 認証の不備 | 弱いトークン・期限切れトークンの再利用・ブルートフォース対策漏れ |
| 3 | オブジェクトプロパティレベルの認可不備 | 不要なフィールドの露出や、権限外フィールドへの書き込み |
| 4 | リソース消費の無制限 | レートリミット未設定によるDoS・過剰なAPIコスト |
| 5 | 機能レベルの認可不備 | 管理機能エンドポイントへの一般ユーザーアクセス |
| 6 | 機密ビジネスフローへの無制限アクセス | 自動スクレイピング・大量注文・不正なフロー操作 |
| 7 | サーバーサイドリクエストフォージェリ(SSRF) | APIが内部リソースへ誘導されるリクエストを実行してしまう |
| 8 | セキュリティ設定ミス | デフォルト設定・不要なHTTPメソッド開放・詳細エラーの露出 |
| 9 | 不適切なインベントリ管理 | 古いバージョンのAPI・ドキュメント未整備エンドポイントの放置 |
| 10 | 安全でないAPIの消費 | サードパーティAPIのレスポンスを検証せずに処理する |
💡 ポイント: APIキーや秘密情報をGitリポジトリにハードコードしないことは最低限のルールです。AWS Secrets Manager・HashiCorp Vaultなどの秘密管理サービスを活用してください。
参考
APIのバージョン管理は「破壊的変更時のみ新バージョン」を原則とし、組織内で統一した方式を採用することで、クライアント側の移行コストを最小化します。
APIは仕様変更や新機能追加によりバージョン管理が不可欠です。バージョニングの方法としては、URIにバージョン(例: /v1/users)、リクエストヘッダー、またはクエリパラメータ等が使われます。一貫性を重視し、組織内API全体で同一方式を採用します。バージョンアップは「破壊的変更」時のみ行い、マイナー変更は後方互換性を保った実装にします。
バージョニング方式の比較
| 方式 | 例 | メリット | デメリット |
|---|---|---|---|
| URIパス(最も一般的) | /v1/users | 直感的・ログで識別しやすい | URIが変わりブックマーク等への影響あり |
| リクエストヘッダー | Api-Version: 2024-01 | URIをクリーンに保てる | ヘッダー指定忘れが起きやすい |
| クエリパラメータ | /users?version=1 | 実装が容易 | URLキャッシュ設計が複雑になる |
| コンテンツネゴシエーション | Accept: application/vnd.api+json;version=1 | RESTful的に純粋 | 実装・テストが複雑 |
破壊的変更 vs 非破壊的変更
| 変更種別 | 例 | バージョンアップ要否 |
|---|---|---|
| 破壊的変更 | フィールド削除・型変更・エンドポイント廃止 | 必要(v1 → v2) |
| 非破壊的変更 | 新フィールド追加・新エンドポイント追加 | 不要(後方互換) |
💡 ポイント: 旧バージョンの廃止(サンセット)スケジュールは事前にドキュメントと
Sunsetレスポンスヘッダーで通知し、クライアントの移行準備期間を確保することがベストプラクティスです。
「誰か(認証)」と「何ができるか(認可)」は別の概念であり、OAuth 2.0/OIDC・JWT・PoLPを組み合わせた多層防御が現代APIの標準です。
認証(Authentication)は誰がAPIにアクセスしているかを確認し、認可(Authorization)はそのユーザーがどのリソースや操作にアクセスできるかを制御します。OAuth 2.0やOpenID Connectによるトークンベース認証が理想的であり、シングルサインオン(SSO)が容易になります。APIキーやJWT(JSON Web Token)による認証も一般的ですが、機密性の高いリソースには多要素認証やPoLP(必要最小限の権限付与)を組み合わせることが推奨されます。
認証・認可方式の比較
| 方式 | 概要 | 向いているケース |
|---|---|---|
| APIキー | 固定の秘密キーをヘッダーに付与 | 社内API・シンプルな公開API |
| OAuth 2.0 | 認可サーバー発行のアクセストークンを利用 | 外部サービス連携・ユーザー代理アクセス |
| OpenID Connect(OIDC) | OAuth 2.0拡張、IDトークンでユーザー認証も行う | SSO・ユーザー認証が必要なAPI |
| JWT | 署名付き自己完結トークン、サーバー側セッション不要 | マイクロサービス間通信・SPA認証 |
| mTLS(相互TLS) | クライアント証明書による相互認証 | 金融・医療など高セキュリティ要件の内部API |
OAuth 2.0 認可コードフロー(概略)
クライアント → 認可サーバー: 認可リクエスト
認可サーバー → ユーザー: ログイン・同意画面
ユーザー → 認可サーバー: 同意
認可サーバー → クライアント: 認可コード
クライアント → 認可サーバー: コード + クライアント認証
認可サーバー → クライアント: アクセストークン(+リフレッシュトークン)
クライアント → リソースサーバー: APIリクエスト(Bearerトークン付与)
💡 ポイント: JWTはステートレスで高速ですが、トークン失効(ブラックリスト処理)が難しい欠点があります。短い有効期限(15〜60分)+リフレッシュトークンの組み合わせが推奨です。
APIドキュメントは開発者の採用率・生産性に直結する「製品の顔」であり、OpenAPI標準+自動生成ツールによる仕様と実装の一致維持が鍵です。
有効なAPIドキュメントは開発者の生産性やAPIの採用率を大きく向上させます。ドキュメントには、エンドポイントの説明、リクエストとレスポンスの例、認証方式、エラーコード、レートリミット、バージョン情報、移行ガイドなどを網羅的に記載します。Swagger/OpenAPIなどの標準フォーマットや自動生成ツールを使うことで、仕様の一貫性と更新のしやすさが保たれます。
ドキュメントに含めるべき要素
| 要素 | 内容 |
|---|---|
| エンドポイント一覧 | URI・HTTPメソッド・概要 |
| リクエスト仕様 | パラメータ・ヘッダー・ボディのスキーマと例 |
| レスポンス仕様 | 成功・エラーごとのステータスコード・ボディ例 |
| 認証方式 | 認証フロー・トークン取得手順 |
| エラーコード一覧 | 独自エラーコードと意味・対処法 |
| レートリミット情報 | 上限値・超過時の挙動・リセット周期 |
| バージョン・変更履歴 | 変更内容・廃止予定・移行ガイド |
| サンプルコード | 主要言語(curl・Python・JavaScript等)での呼び出し例 |
# OpenAPI 3.0 定義例
openapi: 3.0.0
info:
title: Sample API
version: 1.0.0
paths:
/users:
get:
summary: ユーザー一覧を取得する
parameters:
- name: limit
in: query
schema:
type: integer
default: 20
responses:
'200':
description: OK
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/User'
'401':
description: 認証エラー
components:
schemas:
User:
type: object
properties:
id:
type: integer
name:
type: string
💡 ポイント: OpenAPI定義ファイルをソースコードと同一リポジトリで管理し、CIパイプラインで仕様と実装の乖離を自動検出する仕組みを整えると、ドキュメントの陳腐化を防げます。
エラーレスポンスはHTTP標準ステータスコードと機械可読なエラー構造体を組み合わせることで、クライアントの自動リトライ・ユーザー通知・デバッグを効率化します。
APIはエラーや失敗にも明確なレスポンスを返すべきです。HTTP標準ステータスコード(200, 400, 401, 403, 404, 500 など)を適切に使い、エラー時には機械可読なコード、わかりやすいメッセージ、詳細なフィールド情報、ドキュメントへのリンクを含めることが推奨されます。
エラーレスポンスの推奨フォーマット例
{
"error": {
"code": "VALIDATION_ERROR",
"message": "リクエストの検証に失敗しました",
"details": [
{
"field": "email",
"issue": "有効なメールアドレス形式ではありません"
}
],
"docsUrl": "https://api.example.com/docs/errors#VALIDATION_ERROR",
"requestId": "req_abc123xyz"
}
}
ステータスコードの使い分け指針
| コード | 意味 | 使用シーン |
|---|---|---|
| 200 OK | 成功 | GETの取得成功、PUTの更新成功 |
| 201 Created | 作成成功 | POSTでリソース新規作成 |
| 204 No Content | 成功(ボディなし) | DELETEの削除成功 |
| 400 Bad Request | リクエスト不正 | バリデーションエラー・必須項目欠落 |
| 401 Unauthorized | 認証失敗 | トークン未付与・期限切れ |
| 403 Forbidden | 認可失敗 | 権限不足でアクセス拒否 |
| 404 Not Found | 未存在 | 指定IDのリソースが存在しない |
| 409 Conflict | 競合 | 重複登録・楽観的ロック失敗 |
| 429 Too Many Requests | レート超過 | レートリミット到達 |
| 500 Internal Server Error | サーバーエラー | 予期しない内部エラー |
💡 ポイント: 500エラーに内部スタックトレースを含めることはセキュリティリスクです。詳細は内部ログに記録し、クライアントにはリクエストIDのみを返してサポート問い合わせに活用する設計が推奨です。
APIのパフォーマンスはクライアント体験とインフラコストに直結するため、過剰なリクエスト数・レスポンスサイズ・負荷集中を設計段階から排除します。
API設計では、過度な「チャッティ」設計(細かなリソース分割による膨大なリクエスト)や重すぎるオブジェクトレスポンスを避け、必要な情報だけを効率的に返すことが求められます。ページネーション、フィルタリング、ソート機能を提供し、クライアントが最小限のリクエストで望むデータ取得ができるように設計します。
パフォーマンス改善手法
| 手法 | 内容 | 効果 |
|---|---|---|
| ページネーション | カーソル型またはオフセット型で大量データを分割取得 | レスポンスサイズ削減・DB負荷分散 |
| フィールド選択 | ?fields=id,name で必要列のみ返却 | Over-fetchの解消 |
| フィルタリング・ソート | クエリパラメータで条件指定 | クライアント側処理の削減 |
| キャッシュ制御 | Cache-Control, ETag, Last-Modified ヘッダーを活用 | サーバー負荷・通信量削減 |
| レートリミット | エンドポイント・ユーザー単位で呼び出し頻度を制限 | DoS対策・コスト管理 |
| 非同期処理 | 重い処理はジョブキュー化し、ポーリングやWebhookで通知 | タイムアウト防止 |
| 圧縮 | gzip/Brotli でレスポンスボディを圧縮 | 転送量削減 |
# ページネーション(カーソル型)のレスポンス例
{
"data": [ ... ],
"pagination": {
"nextCursor": "eyJpZCI6MTAwfQ==",
"hasMore": true
}
}
💡 ポイント: オフセット型ページネーション(
?page=3&limit=20)はシンプルですが、大量データでDB全スキャンが発生しパフォーマンスが低下します。大規模データセットではカーソル型(?after=cursor_id)が推奨です。
APIガバナンスは個々のAPIの品質管理にとどまらず、組織全体のAPI資産を戦略的に管理するための体制・プロセス・標準の整備です。
APIガバナンスは、開発・運用方針や標準化・ライフサイクル管理全般を定義するものです。組織内APIの設計規則、命名規則、セキュリティ基準、レビューと検証、バージョン管理、ドキュメント更新等を体系的にまとめ、統一されたAPI運用を実現します。
ガバナンス体制の主要要素
| 領域 | 管理内容 |
|---|---|
| 設計標準 | URI命名規則・データ形式・エラー形式・バージョニング方針の統一 |
| セキュリティ基準 | 認証方式・暗号化要件・PoLP・定期レビュー・ペネトレーションテスト |
| ライフサイクル管理 | API登録・公開・バージョンアップ・サンセット(廃止)プロセスの標準化 |
| ドキュメント管理 | OpenAPI仕様の必須化・変更時の同期更新ルール |
| APIカタログ | 組織内API一覧の整備・検索可能な内部ポータルの運用 |
| 監視・可観測性 | レイテンシ・エラー率・レートリミット到達率のモニタリングとアラート設定 |
| 変更管理 | 破壊的変更時の影響範囲調査・ステークホルダー通知・移行支援 |
💡 ポイント: APIガバナンスの実効性は「ルールの制定」より「Lint・テスト・CIへの組み込みによる自動化」で決まります。Spectral(OpenAPI Linter)などのツールを活用し、標準への準拠を開発フローに組み込むことが推奨です。