はじめに:なぜ今、APIセキュリティが最重要なのか?
2025年現在、私たちが開発するアプリケーションのほとんどはAPIを中心に構築されています。Webフロントエンド(SPA)、スマートフォンアプリ、そしてマイクロサービス間の通信。その全てがAPIを介して行われます。APIは現代アプリケーションの「神経系」であり、最も重要なデータを扱う通路です。
しかし、その重要性とは裏腹に、APIのセキュリティ対策は見過ごされがちです。「とりあえず動くAPI」を公開してしまった結果、深刻なデータ漏洩につながる事件は後を絶ちません。
この記事では、Webセキュリティの専門家集団であるOWASPが発表した「OWASP API Security Top 10 (2023年版)」をベースに、現代のAPIが直面する最も重大な10のリスクと、それに対する実践的な防御策を、具体的な攻撃例を交えて徹底的に解説します。
最短で課題解決する一冊
この記事の内容と高い親和性が確認できたベストマッチです。早めにチェックしておきましょう。
OWASP API Security Top 10 (2023年版) 徹底解説
API1: Broken Object Level Authorization (BOLA) - オブジェクトレベル認可の不備
これは何か? APIにおいて最も頻繁に見つかる、最もクリティカルな脆弱性です。ユーザーが、**自分にアクセス権の"ない"**特定のデータ(オブジェクト)を、IDを推測・変更するだけで閲覧・改ざん・削除できてしまう状態を指します。
具体的な攻撃例:
あるユーザーが、自身の注文情報を取得するAPI GET /api/orders/123 を呼び出したとします。この時、リクエストの123というIDを、別のユーザーの注文IDである456に書き換えて GET /api/orders/456 を送信したところ、他人の注文情報が閲覧できてしまいました。
どう防ぐか?
**「この操作は、誰が、どのデータに対して行おうとしているのか?」**を常に検証します。
APIリクエストを受け取ったら、認証情報(例: JWT)からリクエスト元のユーザーIDを取得し、そのユーザーがリクエストされたオブジェクト(この場合は注文ID: 456)の所有者であるかを、データベース等で必ずチェックします。
// Go言語での対策例
func GetOrder(c *gin.Context) {
// JWTからログインユーザーIDを取得
userID, _ := c.Get("userID")
// URLからリクエストされた注文IDを取得
orderID := c.Param("orderID")
// DBから注文情報を取得
order := db.GetOrder(orderID)
// ★★★ 所有権の検証 ★★★
if order.UserID != userID {
c.JSON(http.StatusForbidden, gin.H{"error": "Forbidden"})
return
}
c.JSON(http.StatusOK, order)
}API2: Broken Authentication - 認証の不備
これは何か? 認証メカニズムそのものに不備があり、攻撃者が他人のアカウントを乗っ取れてしまう脆弱性です。パスワードのブルートフォース攻撃、JWTの署名検証の不備、セッショントークンの推測しやすさなどが含まれます。
どう防ぐか?
- 強力なパスワードポリシーと、ログイン試行回数の制限(アカウントロックアウト)を実装する。
- **多要素認証(MFA)**を導入する。
- OAuth 2.0や**OpenID Connect (OIDC)**といった標準化された認証フローを利用する。
- JWTを利用する場合、署名アルゴリズムに
noneを許可しない、署名検証を必ず行うといった基本を徹底する。
API3: Broken Object Property Level Authorization - オブジェクトプロパティレベル認可の不備
これは何か? オブジェクト全体へのアクセスは許可されていても、そのオブジェクトの**特定のプロパティ(属性)**に対するアクセス制御が不十分な状態です。過剰なデータをAPIが返してしまい、クライアント側でフィルタリングしている場合に発生しがちです。
具体的な攻撃例:
GET /api/users/me というAPIが、ユーザー自身の情報を返す際に、DBから取得したユーザーオブジェクトをそのまま返してしまうケース。このオブジェクトに isAdmin: true のような管理者フラグが含まれていると、一般ユーザーに管理者権限の情報が漏洩します。
どう防ぐか?
- APIが返すレスポンス専用のDTO (Data Transfer Object) を定義し、クライアントに見せるべきプロパティだけを詰め替えてから返す。
- ユーザーのロールに応じて、返却するプロパティを動的に変更する。
API4: Unrestricted Resource Consumption - リソース消費の制限不備
これは何か? APIがリクエスト数やリソース消費量を制限していないため、DoS(サービス拒否)攻撃に対して脆弱な状態です。
具体的な攻撃例:
/api/postsという記事一覧APIにページネーションがなく、一度に数百万件のデータをDBから取得させ、サーバーをダウンさせる。- 特定のユーザーが、1秒間に数千回のリクエストを送りつけ、サーバーリソースを枯渇させる。
どう防ぐか?
- レートリミットを実装する(例: 1ユーザーあたり1分間に60リクエストまで)。
- ページネーションを強制し、一度に取得できるデータの上限を設ける。
- リクエストのタイムアウト、ペイロードサイズの制限などを設定する。
API5: Broken Function Level Authorization - 機能レベル認可の不備
これは何か? BOLA(API1)が「データ」に対する認可の不備だったのに対し、こちらは「機能」に対する認可の不備です。一般ユーザーが、管理者向けのAPIエンドポイントを呼び出せてしまうような状態を指します。
具体的な攻撃例:
一般ユーザーが、POST /api/admin/createUser のような管理者用APIの存在を知り、直接リクエストを送信したところ、ユーザーが作成できてしまった。
どう防ぐか?
- ユーザーのロール(役割)に基づいて、APIエンドポイントへのアクセス制御を厳格に行う。
- デフォルトで全てのアクセスを拒否し、許可されたロールにのみアクセスを許可する「デフォルト拒否」の原則を適用する。
API6: Unrestricted Access to Sensitive Business Flows - ビジネスフローへの無制限アクセス
- 例: 購入APIを大量に呼び出し、限定商品を買い占める。
- 対策: ビジネスロジックレベルでの流量制限(例: 1ユーザー1つまで)。
API7: Server-Side Request Forgery (SSRF) - サーバーサイドリクエストフォージェリ
- 例: ユーザーが指定したURLをサーバーが取得する機能で、
http://localhost:8080/adminのような内部ネットワークのURLを指定され、内部情報が漏洩する。 - 対策: ユーザーが指定するURLは、厳格な許可リスト(Allowlist)で検証する。
API8: Security Misconfiguration - セキュリティ設定の不備
- 例: 詳細なエラーメッセージ(スタックトレース等)がユーザーに見える、CORSの設定がワイルドカード (
*) になっている。 - 対策: 本番環境ではエラー詳細を隠す、CORSは許可するドメインを明示的に指定する。
API9: Improper Inventory Management - 不適切なインベントリ管理
- 例: テスト用に公開した古いバージョンのAPI (
/v1) が削除されずに残り、そこから情報が漏洩する。 - 対策: 公開している全てのAPIエンドポイント、バージョン、環境を文書化し、不要になったものは適切に停止する。
API10: Unsafe Consumption of APIs - 安全でないAPIの利用
- 例: 内部で利用しているサードパーティAPIを無条件に信頼し、そのAPIから返されたデータを検証せずに自社のDBに保存・実行してしまう。
- 対策: 外部APIからの入力も、ユーザーからの入力と同様に扱う。厳格なバリデーションを行う。
さらに理解を深める参考書
関連記事と相性の良い実践ガイドです。手元に置いて反復しながら進めてみてください。
まとめ:セキュリティは「あとから」では遅すぎる
APIセキュリティは、一度実装すれば終わり、というものではありません。
- 設計段階から考慮する (セキュリティ・バイ・デザイン): 開発の初期段階から、どのような脅威があり、どう防ぐかを設計に組み込むことが最も重要です。
- 継続的な評価: OWASP Top 10をチェックリストとして、定期的に自分たちのAPIの脆弱性を評価するプロセスを導入しましょう。
- 基本の徹底: 完璧なセキュリティは存在しません。しかし、今回紹介したような基本的な対策を徹底することが、最大のリスク軽減策となります。
安全なAPIは、信頼されるサービスの土台です。機能開発とセキュリティ対策を両輪で進めていきましょう。
さらに理解を深める参考書
関連記事と相性の良い実践ガイドです。手元に置いて反復しながら進めてみてください。
![Ansible実践ガイド 第4版[基礎編] impress top gearシリーズ](https://m.media-amazon.com/images/I/516W+QJKg1L._SL500_.jpg)
