GraphQL e REST: confrontare esigenze, costi e autorizzazioni

In sintesi

GraphQL consente di selezionare campi da uno schema tipizzato e può affiancare REST. Nessuna soluzione è automaticamente più veloce o sicura per ogni carico.

Corridoio sicuro di server e reti senza personale Illustrazione · scena fittizia
In questo articolo

Capire richiesta e costo

L’esempio usa uno schema fittizio: customer, orders e total devono esistere nell’API reale. Una richiesta può generare più letture sul server. Anche REST può offrire risposte mirate. Un singolo endpoint HTTP è comune con GraphQL, ma non obbligatorio per ogni architettura.

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

Confrontare un’attività rappresentativa

  • Misura byte, latenza, errori e lavoro del server per la stessa schermata, permessi e volumi realistici.
  • Verifica paginazione, letture raggruppate contro N+1, cache e isolamento tra account.
  • Valuta evoluzione dello schema, compatibilità dei client precedenti e gestione operativa. Conservare REST può essere più semplice.

Applicare diritti e limiti

Autentica le richieste e autorizza oggetti e campi nella logica di business. Limita liste, profondità, alias, operazioni raggruppate e costo stimato. La sola frequenza delle richieste non descrive il carico. Nascondere l’introspezione non sostituisce questi controlli; prova anche rifiuti e risposte parziali.

Fonti primarie

Gestire lo schema GraphQL e il costo delle query.

GraphQL consente ai client di selezionare i campi, ma questa flessibilità richiede l'autorizzazione di oggetti e campi. Un limite di dimensione o profondità da solo non sostituisce la misurazione del lavoro causato da una query.

  • Testare i campi sensibili e gli oggetti di proprietà di un altro account.
  • Limitare e monitorare costi, profondità e volume delle richieste per il servizio.
  • Gestire le modifiche allo schema di versione e testare i client meno recenti.

Fonte primaria: OWASP — GraphQL Cheat Sheet. Metodo correlato: consultare la guida pratica.

ETag, cache HTTP e modifiche concorrenti

Le note dettagliate di questa edizione sono disponibili in inglese.

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