GraphQLとREST:要件、費用、権限を比較する

要点

GraphQLは型付きスキーマからクライアントがフィールドを選べる仕組みで、RESTを補完できます。どちらも全用途で自動的に高速・安全になるわけではありません。

サーバーとネットワーク設備の無人セキュア通路
この記事の内容

リクエストと処理費用を理解する

例は架空のスキーマで、実際のAPIにはcustomer、orders、totalが必要です。一回のリクエストでもサーバー側では複数の読み取りが起こり得ます。RESTも用途別の応答を提供できます。単一のHTTPエンドポイントはGraphQLで一般的ですが、全構成の必須条件ではありません。

query RecentOrders($id: ID!) {
  customer(id: $id) {
    name
    orders(first: 5) {
      nodes { id total }
    }
  }
}

代表的な操作で比較する

  • 同じ画面、権限、現実的なデータ量で、通信量、遅延、エラー、サーバー負荷を測ります。
  • ページ分割、N+1を抑える一括読み取り、キャッシュ、アカウント間のデータ分離を確認します。
  • スキーマ変更、旧クライアントとの互換性、運用負担を評価します。RESTを残す方が簡単な場合もあります。

権限と負荷の制限を実施する

認証後、業務ロジックでオブジェクトとフィールドを認可します。リスト長、深さ、別名、一括操作、推定費用を制限します。リクエスト頻度だけでは負荷を表せません。イントロスペクションを隠すだけでは代替できず、拒否と部分応答もテストします。

一次資料

GraphQLスキーマとクエリコストを管理してください。

GraphQLではクライアントがフィールドを選択できますが、その柔軟性にはオブジェクトとフィールドの認証が必要です。サイズや深度の制限だけでは、クエリによって発生する処理量を測定する代わりにはなりません。

  • 機密性の高いフィールドと、別のアカウントが所有するオブジェクトをテストしてください。
  • サービスのコスト、深度、リクエスト量を制限し、監視してください。
  • スキーマの変更をバージョン管理し、古いクライアントの動作を確認してください。

一次資料:OWASP — GraphQL Cheat Sheet. 関連する方法:実践ガイドを読む.

ETag・HTTPキャッシュ・同時更新

この言語版の詳しい参照メモは英語で提供しています。

REST and GraphQL: separate representation and authorisation

An HTTP ETag applies to a selected representation. It is neither permission for every returned object nor a universal consistency contract for GraphQL entities.

  • Define which response variants have their own validators.
  • Test object and field access independently from HTTP conditions.
  • Do not automatically apply the PUT scenario to a GraphQL mutation; specify its concurrency contract.

Explore ETag comparisons and the simulator →

References reviewed · RFC 9110 · §13 · RFC 9111 · RFC 6585 · §3