リクエストと処理費用を理解する
例は架空のスキーマで、実際の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
