ソフトウェアアーキテクチャ

API設計の基礎 ― REST/GraphQL/gRPC/WebSocket ― 生成AI時代のアーキテクチャ超入門

API設計の基礎 ― REST/GraphQL/gRPC/WebSocket ― 生成AI時代のアーキテクチャ超入門

本記事について

当サイトを閲覧いただきありがとうございます。 本記事はシリーズ『生成AI時代のアーキテクチャ超入門』の「ソフトウェアアーキテクチャ」カテゴリ第4弾として、API設計について解説する記事です。

「一度公開したAPIは契約書」命名・データ形式・エラー・認証方式まで、利用者が依存するため後から気軽に変えられません。本記事ではRESTGraphQLgRPCWebSocketの4大スタイルを比較し、用途別の使い分け・バージョニング戦略・認証方式・レート制限の数値基準まで解説します。

このカテゴリの他の記事

公開した瞬間、契約書になる

URLやパラメータの命名、データ形式、エラーの返し方、認証方式まで、「一度公開したAPIは契約書」になります。外部の利用者がその形に依存するため、後から気軽に変えられません。破壊的変更は利用者全員に修正を強要するため、事実上できないと思っておくべきです。

2023年にX(旧Twitter)が API v1.1 を実質即日有料化した際、Tweetbotなどの老舗サードパーティクライアントが一斉に停止した事件は、APIは契約であるという事実を最も乱暴な形で示したケースとして業界に残っています。提供者側から見ても、バージョニング戦略や廃止予告ポリシーが甘いと、利用者の信用を一瞬で失います。

URLやパラメータの命名まで、公開した瞬間に後方互換の鎖がかかります。初期設計の質が長く尾を引きます。

主要4スタイル

API設計には大きく4つのスタイルがあります。どれが優れているかではなく、用途によって使い分けるもので、外部公開向けとマイクロサービス内部向けでは求められる特性が全く違います。

flowchart TB
    Q{用途は?} -->|外部公開Web API| REST[REST<br/>HTTP+JSON]
    Q -->|多様なクライアント<br/>過取得回避| GQL[GraphQL<br/>HTTP+クエリ言語]
    Q -->|マイクロサービス間<br/>内部高速通信| GRPC[gRPC<br/>HTTP/2+Protobuf]
    Q -->|双方向リアルタイム| WS[WebSocket<br/>TCP双方向]
    REST -.- E1[最も普及・<br/>キャッシュしやすい]
    GQL -.- E2[Facebook 2015〜<br/>BFFと相性◎]
    GRPC -.- E3[Google発<br/>低レイテンシ]
    WS -.- E4[チャット・通知・<br/>株価ストリーム]
    classDef question fill:#fef3c7,stroke:#d97706;
    classDef rest fill:#dbeafe,stroke:#2563eb;
    classDef gql fill:#fae8ff,stroke:#a21caf;
    classDef grpc fill:#dcfce7,stroke:#16a34a;
    classDef ws fill:#f0f9ff,stroke:#0369a1;
    class Q question;
    class REST rest;
    class GQL gql;
    class GRPC grpc;
    class WS ws;
スタイル通信方式代表用途
RESTHTTP + JSON一般的なWeb API・外部公開
GraphQLHTTP + クエリ言語多様なクライアント向けAPI
gRPCHTTP/2 + Protobufマイクロサービス間の内部通信
WebSocketTCP双方向リアルタイム通信

実際のプロジェクトではREST + 一部 WebSocketのように複数を組み合わせるケースが多いです。

早期の判定フロー

詳細に入る前に、ユースケース別の第一候補を示します。まずこの表で当たりをつけてから、各方式の詳細を確認してください。

ユースケース第一候補次点
外部公開API(開発者向け)REST
社内マイクロサービス間通信gRPCREST
Web・Mobileの両方から使う画面向けAPIGraphQL or BFF + RESTREST
チャット・ゲーム・株価配信WebSocketServer-Sent Events
TypeScript単一スタック(Next.js等)tRPC(型共有)REST
公共・金融の既存資産と連携REST or SOAPgRPC

外部公開ならREST が既定値で、証明すべきはREST以外を選ぶ理由、という姿勢で十分です。

REST

REST(Representational State Transfer)は、HTTPの標準機能をそのまま使ったリソース指向のAPIスタイルです。URLでリソース(例:/users/123)を表し、操作はHTTPメソッド(GET・POST・PUT・DELETE)で表現します。シンプルで分かりやすく、外部公開APIの事実上の標準として最も広く普及しています。

HTTPの標準機能(キャッシュ・認証・ステータスコード)をそのまま活かせるため、CDNでの高速化やブラウザ対応がスムーズです。一方でクライアントが必要なデータを複数のエンドポイントから取得する必要があり、N+1問題(一覧取得の後に関連データを1件ずつ取得して大量のリクエストが飛ぶ現象)やオーバーフェッチ/アンダーフェッチが起きやすい弱点もあります。

代表的な設計意味
GET /users一覧取得
GET /users/:id1件取得
POST /users作成
PUT / PATCH /users/:id更新
DELETE /users/:id削除

外部公開APIなら迷わずRESTで、普及度と利用可能ツールの多さで他を圧倒します。

REST設計の原則

RESTを採用する場合、以下の原則を守ると長期的に運用しやすいAPIになります。単なる流儀ではなく、HTTPの思想に沿った設計のためのガイドラインです。

  • リソース指向で名詞を使う/getUsers ではなく /users
  • HTTPメソッドで操作を表現する(GET/POST/PUT/DELETE)
  • ステータスコードを正しく使う(200/201/400/401/404/500 など)
  • URLの階層で関連を表現する/users/123/orders
  • エラーレスポンスの形式を統一する(RFC 7807 Problem Details が定番)

GraphQL

GraphQL は2015年にFacebookが公開した、クライアントが欲しいデータの形を指定できるクエリ言語です。RESTのように固定されたエンドポイントではなく、単一のエンドポイント(通常 /graphql)に対して「この画面にはこのフィールドだけ欲しい」とクエリを投げます。

Webとモバイル、内部ダッシュボードなど複数のクライアントが異なるデータ形を必要とする場面で威力を発揮します。一方、HTTPキャッシュが効きにくく、N+1問題は自力で解決する必要があり、サーバ側の実装難度はRESTより高くなります。

強み弱み
必要なデータだけ取得できるキャッシュ戦略が複雑
型スキーマで自動ドキュメント生成N+1 は自力で解決が必要
モバイルの帯域節約に効く学習コストが高い
フロントエンドの開発体験が良いサーバ側の実装難度が高い

多様なクライアント向けなら選択肢に入ります。シンプルなAPIにはオーバースペックです。

gRPC

gRPC はGoogleが開発した、Protocol Buffers(Protobuf)によるバイナリ通信のAPIフレームワークです。HTTP/2 上で動作し、双方向ストリーミングにも対応しているため、大量のリクエストを高速に捌けます。.proto ファイルからクライアント・サーバーのコードを複数言語で自動生成できるのも大きな強みです。

スキーマファーストで型が厳格に管理されるため、マイクロサービス間の内部通信では第一候補になります。ただしブラウザからの直接利用は困難(gRPC-Webが必要)で、HTTPツールでのデバッグもしにくいため、外部公開APIには向きません。

強み弱み
圧倒的な性能(バイナリ通信)ブラウザ直接利用が困難
言語横断でコード自動生成デバッグしにくい
スキーマファーストで型安全HTTPツール(curl等)で叩きにくい
HTTP/2でストリーミング対応学習コストが中〜高

マイクロサービス間通信なら第一候補。外部公開には不向きです。

WebSocket

WebSocket は、クライアントとサーバー間で常時接続を維持し、双方向通信を行うプロトコルです。通常のHTTPリクエストは「クライアントが聞いて、サーバーが答える」の一往復ですが、WebSocketはサーバーからクライアントへ能動的にメッセージを送れる点が決定的に違います。

この性質から、リアルタイム性が求められる用途で使われます。チャット・株価表示・オンラインゲーム・ライブ配信・通知など、「サーバー側の状態変化を即座にクライアントに伝えたい」シーンではWebSocketが定番です。HTTP上でハンドシェイク後、独自プロトコルに昇格する仕組みになっています。

強み弱み
低遅延・双方向通信接続維持のリソース消費
サーバーからプッシュ可能ロードバランサ・プロキシに配慮が必要
ブラウザ標準対応再接続ロジックを自前で書く必要

REST では表現できないリアルタイム用途に特化しており、用途が合えば代替不可です。

4スタイルの比較

各スタイルは得意分野が明確に異なるため、単純な優劣比較は意味がありません。以下は典型的な用途での比較です。

観点RESTGraphQLgRPCWebSocket
外部公開向き×
ブラウザ対応
性能
学習コスト
型安全×
キャッシュ活用××

「外部公開REST / 内部gRPC / リアルタイムWebSocketの使い分けが典型パターンです。

バージョニング戦略

API公開後は仕様変更が必ず発生するため、バージョン管理を最初から組み込む必要があります。バージョニングなしで運用すると、どんな小さな変更も利用者全員との調整が必要になり、「事実上APIを改良できなくなります」

方式特徴
URLパス方式/api/v1/users最もシンプル・普及度◎
Acceptヘッダ方式Accept: application/vnd.api.v1+jsonURLが汚れない・学習コスト高
クエリパラメータ方式/api/users?version=1簡単・規模が大きくなると辛い

URLパス方式が最もシンプルで普及しています。「既定はこれ」と割り切って良いです。

API ライフサイクルの実務段階表

※ 2026年4月時点の業界相場値です。テクノロジー・人材市場の変化で陳腐化するため、定期的にアップデートが必要です。

APIは「公開したら契約」なので、公開前〜廃止までの段階を「数値で管理する」のが運用の肝です。

フェーズ状態サポート方針移行猶予
Beta / Preview実験的・仕様変更ありSLA なし・破壊的変更あり得る
GA(General Availability)安定版・本番利用可後方互換維持
Deprecated非推奨新規利用非推奨継続動作・警告ヘッダ付与最低6ヶ月〜2年
Sunset廃止予告動作継続・廃止日予告最短3ヶ月
EOL(終了)停止動作しない

Deprecation → Sunset → EOL の猶予は最低6ヶ月」が業界標準です。Google Cloud / AWS / Stripe などは2年以上の猶予を公式にコミットしており、これを守れないと利用者の信頼を失います。

Deprecationの猶予は最低6ヶ月、理想は2年。突然の廃止は信用を一瞬で失います。

認証方式

APIには必ず認証が必要です。用途に応じて以下の中から選びます。

方式用途
Bearer TokenJWT(JSON Web Token、署名付きトークン)等)SPA(Single Page Application、1ページで画面遷移するWebアプリ)・モバイル向けの最も一般的な方式
OAuth 2.0 / OIDC外部サービス連携・SSO
API Keyサーバ間通信・B2B API
mTLS(相互TLS)極めて高いセキュリティが必要な内部通信

外部公開ならOAuth 2.0、内部通信ならAPI Key や mTLSBFF経由ならCookie + セッションが現実的です。

レート制限・エラー設計の数値Gate

※ 2026年4月時点の業界相場値です。テクノロジー・人材市場の変化で陳腐化するため、定期的にアップデートが必要です。

API 設計で「決めるべきこと」を曖昧なまま運用すると本番で事故るため、具体的な数値基準を最初に置きます。

設定項目推奨値理由
レート制限(公開API)ユーザー毎 60req/分、IP毎 600req/分ブルートフォース対策 + 公平性
レート制限(内部API)10,000req/秒以上許容内部利用は絞らない
タイムアウト30秒(GET)/ 60秒(POST)HTTPの慣例上限
ペイロード上限1MB(REST)/ 10MB(ファイルアップロード)DoS防止
バージョニングURLパス方式(/v1)必須最も普及・デバッグ容易
エラー形式RFC 7807(Problem Details)標準化されたエラー構造
廃止予告期間最低6ヶ月、理想は2年業界慣例

ステータスコードは「200(成功)/ 201(作成)/ 400(クライアントエラー)/ 401(未認証)/ 403(認可エラー)/ 404(存在しない)/ 409(競合)/ 429(レート超過)/ 500(サーバエラー)」を正しく使い分けます。「エラーを全部200で返す」は典型的な禁じ手で、クライアントがエラー処理できなくなります。

ケース別の選び方

公開Web API(外部開発者向け)

REST。普及度・ツール充実・学習コストで他を圧倒する。OpenAPIでドキュメント自動生成もできる。

多様なクライアント(Web・モバイル・IoT等)があるサービス

GraphQL。クライアントごとに欲しいデータが違う場合、RESTで複数エンドポイントを用意するよりもGraphQLが効率的。

マイクロサービス間の内部通信

gRPC。性能・型安全・コード自動生成の全てで有利。ブラウザ直接アクセスが無いためgRPCの弱点が影響しない。

チャット・通知・ゲーム等のリアルタイム機能

WebSocket。双方向通信が必須の用途では代替不可。

一般的なWebサービス + 一部リアルタイム

REST + WebSocketの併用。多くのサービスで採用されている組み合わせ。

API設計の鬼門・禁じ手

現場でよく見るAPI設計の失敗を、修正コストが大きい順に並べます。

禁じ手なぜダメか
URLに動詞を入れる/getUsers / /deleteUserHTTPメソッドと二重管理。/users + GET/DELETE が正解
エラーを全部 200 OKで返し body に {success: false}クライアントのエラー処理が壊れる。HTTP標準ステータスコードを使う
バージョニングなしで公開破壊的変更ができず APIが塩漬けに。/v1 を最初から
認証を後付け全エンドポイント修正が必要。最初から認証前提で設計
OpenAPI / Protobuf などのスキーマなし仕様が口頭伝承になり、クライアントと実装がずれる
N+1クエリをAPIで発生させるDB負荷が線形爆発。Includeパラメータや GraphQL で解決
ページネーションをOffset方式のみで提供大量データで性能崩壊。Cursorベースも用意
破壊的変更を予告なく実施利用者の信頼を一瞬で失う。X(旧Twitter)2023年のAPI v1.1有料化のパターン
冪等性の保証なしでPOSTリトライ許容二重決済・在庫二重減算の原因。Idempotency-Keyヘッダで対応
レート制限なしボット・悪意ある利用で高額請求・DoS事故

Stripe のAPIは「壊さないAPI」の模範例として業界で知られています。2011年の初版から現在まで、10年以上にわたって同じエンドポイントが動き続けており、「後方互換性を維持しながら機能を追加する」という難題を解いた事例です。

API設計の鉄則は「壊さない、消さない、曖昧にしない」

AI時代の視点

AI駆動開発が前提になると、API設計は「スキーマファーストか」が決定的に重要になります。OpenAPI・GraphQL Schema・Protocol Buffers のような機械可読な定義ファイルがあれば、AIはクライアント・サーバー・テスト・ドキュメントまで一気通貫で生成できる。

逆にスキーマのない「なんとなくRESTでは、AIは正確なコードを生成できず、ハルシネーションが頻発します。

AI時代に有利AI時代に不利
OpenAPI / GraphQL / gRPC(スキーマファースト)仕様書がExcel・Word・口頭
tRPC(TypeScript型共有)型のない手書きREST
スキーマから自動生成(型・クライアント・docs)手書きで型をクライアントに写す
標準的なRESTfulパターン独自の命名・独自のエラー形式

型共有の観点では、フロント・バック両方TypeScriptならtRPCが最強です。APIスキーマを書く必要すらなく、型推論で全てが接続される。AIは型情報から意図を汲めるため、補完・生成の精度が劇的に高まります。

AI時代は「スキーマファースト+型共有」が圧勝で、口頭仕様のAPIは負債になります。

よくある勘違い

  • GraphQLのほうが新しいから優れている → シンプルなCRUDアプリにGraphQLを採用すると、キャッシュ戦略やN+1対応で開発工数が逆に増える「新しい=優れている」は典型的な思考停止
  • gRPCは性能が速いから内部通信は全部gRPCHTTPデバッグツールが効かず、障害時の調査難度が跳ね上がります。内部でも小規模な連携ならRESTのほうが運用コストが低いケースは多い
  • WebSocketHTTPより速い → 接続維持のリソース消費と再接続ロジックのコストがあります。ポーリングで十分な用途にWebSocketを使うと、運用負荷が割に合わない
  • バージョニングは後で考えれば良い → 後付けできません。初期設計で v1 を組み込まないと、破壊的変更ができずAPIが塩漬けになる

「ある日突然止まったAPI」(業界事例)

2023年にX(旧Twitter)がAPI v1.1 を実質終了して有料化した際、Tweetbot などの老舗サードパーティクライアントが一斉に停止した、という事例があります。利用者からすれば「API仕様=永久に続く契約」のつもりで依存していたものが、ある日突然引き剥がされた事件でした。

当時、TweetbotがTwitter社の意向一つで一夜にして沈んでいく様子を見ていて、APIの契約性というものを生々しく感じた人も多かったはずです。この件は「APIは契約である」という事実を最も乱暴な形で示したケースとして知られています。

API設計の議論で「命名を後から変えられない」と言われる時、念頭にあるのはこうした事態です。

API公開は契約締結であり、廃止・変更のルールを最初から設計に組み込んでおきます。

決めるべきこと — あなたのプロジェクトでの答えは?

以下の項目について、あなたのプロジェクトの答えを1〜2文で言語化してみてください。曖昧なまま着手すると、必ず後から「なぜそう決めたんだっけ」が問われます。

  • APIスタイルREST / GraphQL / gRPC / WebSocket / 組み合わせ)
  • 認証方式(Bearer Token / OAuth / API Key / mTLS
  • エラーレスポンス形式(RFC 7807 等)
  • バージョニング戦略(URLパス / Acceptヘッダ)
  • レート制限(ユーザー毎・IP毎・何req/分)
  • ドキュメント管理(OpenAPI / GraphQL Schema / Protobuf)
  • 公開 or 内部のみの線引き

よくある失敗

  • RESTの命名が動詞だらけ/getUsers/deleteUser のように、URLに動詞を含めるとHTTPメソッドと二重管理になる
  • GraphQLを闇雲に採用 ― シンプルなCRUDアプリにGraphQLを採用すると、キャッシュ戦略やN+1対応で開発工数が逆に増える
  • バージョニング無しで公開 ― 後から破壊的変更ができず、APIが塩漬けになる
  • 認証を後付け ― 認証基盤を後から足そうとすると、全エンドポイントの修正が必要になる

最終的な判断の仕方

API設計は「一度公開したら壊せない契約」で、他のどの領域より後戻りコストが高い。命名・データ形式・エラー形式・バージョニング方針まで、外部に公開した瞬間に利用者が依存し、破壊的変更は実質不可能になります。

だから選定の核は「流行のスタイルを使いたいか」ではなく「利用者は誰か・用途は何か」に絞られる。外部開発者向けならREST一択、マイクロサービス間ならgRPC、多様なクライアントが必要ならGraphQL、リアルタイムならWebSocket。用途が決まれば答えはほぼ一意に決まります。

現代の決定的な軸は「スキーマファーストか」です。OpenAPI・Protobuf・GraphQL Schema・tRPCの型共有のように、機械可読な定義があればAIがクライアント・サーバー・テスト・ドキュメントを一気通貫で生成できる。

逆に「なんとなくRESTで型が口頭伝承だと、AIはハルシネーションを起こし、人間も仕様のズレに苦しみます。迷ったらREST + OpenAPIが最も安全な出発点で、必要が出てきたら内部通信だけgRPC、リアルタイム部分だけWebSocketを足すのが健全な育て方です。

選定の優先順位をまとめると次の通りです。

  1. 公開か内部かを最初に切り分ける(外部公開=REST、内部=gRPC候補)
  2. 利用者の形で決める(Web・モバイル・外部開発者・サービス間)
  3. スキーマファーストを必須条件にする(OpenAPI / Protobuf / GraphQL
  4. 逸脱理由がなければRESTに寄せる(普及度・ツール・AI精度で圧倒的有利)

「APIは契約、契約は壊せない」を肝に銘じ、初期設計は慎重に、スタイル選定は用途に忠実に行います。

まとめ

本記事はAPI設計について、4大スタイル・バージョニング・認証・レート制限の数値基準まで含めて解説しました。如何だったでしょうか。

外部公開はREST + OpenAPI、内部はgRPC、画面別はGraphQL、リアルタイムはWebSocketスキーマファーストでAIに優しい設計に倒すのが現代の本命です。

次回はフレームワーク(Spring / Next.js / FastAPI / Rails 等)について解説します。

シリーズ目次に戻る → 『生成AI時代のアーキテクチャ超入門』の歩き方

それでは次の記事も閲覧いただけると幸いです。