- Après 6 ans d’utilisation depuis 2018, j’étais un véritable passionné de GraphQL, mais j’ai désormais des réserves
- Je veux expliquer pourquoi je ne recommande plus GraphQL aujourd’hui et quelles alternatives me paraissent meilleures
Surface d’attaque
- GraphQL expose un langage de requête, ce qui présente le risque d’élargir la surface d’attaque.
- Les problèmes liés à l’autorisation sont particulièrement importants.
- Il faut effectuer des vérifications d’autorisation appropriées pour chaque champ.
- Avec une API REST, il est plus simple de vérifier les autorisations à chaque endpoint.
Autorisation
- Il faut vérifier les permissions de l’utilisateur pour chaque champ.
- Avec une API REST, il est plus simple de vérifier les autorisations à chaque endpoint.
Limitation de débit
- Les requêtes GraphQL n’ont pas de limite de taille, ce qui peut imposer une lourde charge au serveur.
- Il existe des méthodes pour estimer la complexité d’une requête et limiter celles qui dépassent un certain seuil.
- Avec une API REST, il est plus simple de limiter le nombre de requêtes.
Analyse des requêtes
- Une chaîne de requête invalide peut entraîner une consommation excessive de mémoire côté serveur.
- Il existe une méthode consistant à définir un nombre maximal d’erreurs pour interrompre l’analyse.
Performances
Récupération des données et problème de N+1
- Les field resolvers peuvent appeler plusieurs fois des sources de données externes.
- On peut résoudre ce problème avec le pattern Dataloader.
- Avec REST, il est plus simple de traiter le problème de N+1 dans le contrôleur.
Autorisation et problème de N+1
- Le code d’autorisation peut provoquer un problème de N+1.
- Avec REST, ce problème ne se pose pas.
Couplage
- Dans un codebase GraphQL, la logique métier est fortement couplée à la couche de transport.
- Des tests d’intégration sont nécessaires et le débogage est difficile.
Complexité
- Les différentes méthodes nécessaires pour résoudre les problèmes de sécurité et de performance de GraphQL augmentent la complexité du codebase.
- Les solutions REST sont généralement plus simples.
Alternatives
- Il recommande une API REST JSON utilisant OpenAPI 3.0+.
- Si l’on dispose de clients écrits dans un langage à typage statique, OpenAPI peut être un meilleur choix.
- OpenAPI peut générer automatiquement du code client type-safe.
L’avis de GN⁺
- GraphQL est puissant, mais résoudre ses problèmes de sécurité et de performance demande beaucoup d’efforts.
- Les API REST sont relativement simples et peuvent être plus adaptées dans de nombreux cas.
- OpenAPI fournit de la type safety et des outils automatisés, ce qui peut améliorer la productivité du développement.
- Lorsqu’on adopte GraphQL, il faut prendre pleinement en compte les questions de sécurité et de performance.
- Il est important de comparer les avantages et les inconvénients de REST et de GraphQL afin de choisir la technologie adaptée au projet.
8 commentaires
GraphQL est assez agaçant (2022)
L’ère du grand retour du RPC arrive.
Évidemment... Ce n’est pas parce qu’un truc un peu fancy sort qu’il faut se jeter dessus et l’encenser.. Maintenant, c’est au tour des ORM. Ton heure n’est plus très loin non plus...
Les ORM existent depuis plus de 20 ans...
En 2018, les PQ n’étaient déjà plus vraiment une nouveauté (en fait, c’était recommandé dès la première annonce de GraphQL), donc c’est assez surprenant qu’ils n’aient pas essayé pendant 6 ans...
Il est difficile, pour toutes les raisons évoquées plus haut, d’implémenter GraphQL entièrement à la main, tant du point de vue de la complexité que de la stabilité. Il semble préférable de développer en plaçant une couche comme hasura ou postgraphile au-dessus de la base de données, puis d’y ajouter selon les besoins GraphQL ou REST.
Réactions sur Hacker News