GraphQL и REST: сравнение задач, затрат и прав доступа

Кратко

GraphQL позволяет выбирать поля типизированной схемы и может дополнять REST. Ни один подход не быстрее и не безопаснее автоматически для любой нагрузки.

Пустой защищённый коридор серверов и сетевого оборудования
В этой статье

Понимать запрос и его стоимость

Пример использует условную схему: 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