API (Application Programming Interface)
約 5 分で読めます
最終更新: 2026-04-28
API とは
API (Application Programming Interface) とは、ソフトウェア同士がデータや機能をやり取りするための取り決め (インターフェース) です。レストランに例えると、客 (アプリケーション) がメニュー (API 仕様) を見て注文し、ウェイター (API) が厨房 (サーバー) に伝えて料理 (データ) を運んでくる仕組みに似ています。
スマートフォンの天気アプリが最新の気象データを表示できるのは、気象サービスの API を通じてデータを取得しているからです。現代の Web サービスは、裏側で数十から数百の API を組み合わせて動いています。
API の主な種類
API の認証と認可
API を安全に利用するには、「誰がアクセスしているか」(認証) と「何を許可するか」(認可) の仕組みが不可欠です。
- API キー: 最もシンプルな認証方式。リクエストヘッダーやクエリパラメータに固定の文字列を含める。手軽だが、キーが漏洩すると誰でもアクセスできてしまう。
- OAuth 2.0: 「Google でログイン」のような第三者認証を実現する標準プロトコル。ユーザーのパスワードを直接共有せず、アクセストークンを介して権限を委譲する。
- JWT (JSON Web Token): 認証情報をトークンに埋め込み、サーバー側でセッションを保持しなくても検証できる方式。ステートレスな API 設計と相性が良い。
API キーをソースコードにハードコードしたり、公開リポジトリにコミットしたりする事故は後を絶ちません。シークレット管理ツールを使い、環境変数や専用のシークレットストアで管理するのが鉄則です。
レート制限と API の保護
レート制限 (Rate Limiting) とは、一定時間内に受け付ける API リクエスト数に上限を設ける仕組みです。これがないと、悪意のあるユーザーが大量のリクエストを送りつけてサーバーをダウンさせる DDoS 攻撃が容易になります。
一般的なレート制限の実装パターンには以下があります。
- 固定ウィンドウ: 1 分間に 100 リクエストまで、のように固定の時間枠で制限。実装が簡単だが、ウィンドウの境界でバーストが発生しうる。
- スライディングウィンドウ: 直近 1 分間のリクエスト数を常に追跡。固定ウィンドウのバースト問題を解消する。
- トークンバケット: 一定速度でトークンが補充され、リクエストごとにトークンを消費する。短時間のバーストを許容しつつ、長期的な平均レートを制御できる。
レート制限に達すると、サーバーは HTTP ステータスコード 429 (Too Many Requests) を返します。API を利用する側は、429 を受け取ったらリトライ間隔を空ける (エクスポネンシャルバックオフ) 実装が必要です。
API セキュリティの実践
API は現代の Web サービスの中核であり、攻撃者にとっても主要な標的です。OWASP API Security Top 10 では、認証の不備、オブジェクトレベルの認可不備、過剰なデータ公開などが上位に挙げられています。
- 入力バリデーション: すべてのリクエストパラメータを検証し、SQL インジェクションや XSS を防ぐ。
- HTTPS の強制: API 通信は必ず TLS で暗号化する。平文の HTTP で API キーやトークンを送信すると、ネットワーク上で傍受される。
- 最小権限の原則: API トークンには必要最小限の権限だけを付与する。読み取り専用の用途に書き込み権限を与えない。
- ログと監視: API の呼び出しパターンを監視し、異常なアクセスを早期に検知する。
よくある誤解
- API は開発者だけが関係するもの
- API はスマートフォンアプリ、IoT デバイス、決済システムなど、日常生活のあらゆる場面で使われています。SNS にログインする、電子マネーで支払う、配車アプリを使うといった行為はすべて API を介しています。
- API を公開しなければ安全
- 内部 API であっても、社内ネットワークに侵入された場合やサプライチェーン攻撃を受けた場合に悪用されるリスクがあります。内部 API にも認証・認可・暗号化を適用するゼロトラストの考え方が重要です。
- REST API は古い技術で GraphQL に置き換わる
- GraphQL は特定のユースケースで優れていますが、REST がすべての場面で劣っているわけではありません。シンプルな CRUD 操作やキャッシュの活用では REST の方が適しており、両者は共存しています。