Понимать запрос и его стоимость
Пример использует условную схему: customer, orders и total должны существовать в реальном API. Один запрос может вызвать несколько чтений на сервере. 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
