GraphQL e REST: comparar necessidades, custos e permissões

Em resumo

GraphQL permite selecionar campos de um esquema tipado e pode complementar REST. Nenhuma opção é automaticamente mais rápida ou segura para todas as cargas.

Corredor seguro de servidores e redes sem pessoas Ilustração · cena fictícia
Neste artigo

Compreender o pedido e o custo

O exemplo usa um esquema fictício: customer, orders e total têm de existir na API real. Um pedido pode gerar várias leituras no servidor. REST também pode fornecer respostas adaptadas. Um único endpoint HTTP é habitual em GraphQL, mas não obrigatório em toda a arquitetura.

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

Comparar uma tarefa representativa

  • Meça bytes, latência, erros e trabalho do servidor para o mesmo ecrã, permissões e volumes realistas.
  • Verifique paginação, leituras agrupadas contra N+1, cache e isolamento entre contas.
  • Avalie evolução do esquema, compatibilidade com clientes antigos e operação. Manter REST pode ser mais simples.

Aplicar permissões e limites

Autentique os pedidos e autorize objetos e campos na lógica de negócio. Limite listas, profundidade, aliases, operações agrupadas e custo estimado. A frequência dos pedidos não descreve toda a carga. Ocultar introspeção não substitui estes controlos; teste recusas e respostas parciais.

Fontes primárias

Controle o esquema GraphQL e o custo da consulta.

O GraphQL permite que os clientes selecionem campos, mas essa flexibilidade exige autorização de objetos e campos. Um limite de tamanho ou profundidade, por si só, não substitui a medição do trabalho que uma consulta causa.

  • Teste campos e objetos confidenciais pertencentes a outra conta.
  • Limite e observe o custo, a profundidade e o volume de solicitações para o serviço.
  • Verifique as alterações de esquema de versão e exercite clientes mais antigos.

Fonte primária: OWASP — GraphQL Cheat Sheet. Método relacionado: consultar o guia prático.

ETag, cache HTTP e alterações concorrentes

As notas detalhadas desta edição estão disponíveis em inglês.

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