Sécurisation des API REST et GraphQL : authentification, autorisation et détection d’attaques

Publié le 23 juillet 2025

Cybersécurité
Développement Web
API

Les API exposent des données et des services essentiels, ce qui en fait des cibles privilégiées pour les attaquants.
Cet article couvre les modèles d’authentification, la gestion des permissions, la protection contre les attaques courantes et la mise en place d’une surveillance proactive pour vos API REST et GraphQL.

Plan de l’article

  • Modèles d’authentification : OAuth2, JWT, API Keys
  • Gestion des permissions : RBAC et ABAC
  • Sécurisation dans Express (Node.js)
  • Sécurisation dans Django REST Framework
  • Sécurisation dans Apollo Server (GraphQL)
  • Protection contre les attaques : injection, brute-force, DoS
  • Monitoring et alerting des API
  • Automatisation des tests de sécurité
  • Conclusion et recommandations

Modèles d’authentification

OAuth2

# Exemple de configuration d’un flow "authorization_code" avec Express
const oauth2 = require('simple-oauth2').create({
  client: { id: CLIENT_ID, secret: CLIENT_SECRET },
  auth: { tokenHost: 'https://auth.example.com' }
});

Astuce : Préférez le flow authorization_code avec PKCE pour les applications publiques (mobile, SPAs).

JSON Web Tokens (JWT)

// Création d’un JWT
const jwt = require('jsonwebtoken');
const token = jwt.sign({ userId: user.id }, JWT_SECRET, { expiresIn: '1h' });

Attention : Stockez JWT_SECRET de façon sécurisée (ex. HashiCorp Vault).

API Keys

  • Génération d’API Key unique pour chaque client
  • Transmission dans l’en-tête Authorization: ApiKey <clé>

Gestion des permissions

RBAC (Role-Based Access Control)

# Django REST Framework: définition d’un groupe et permissions
from django.contrib.auth.models import Group, Permission
admin_group, _ = Group.objects.get_or_create(name='API Admin')
perm = Permission.objects.get(codename='change_user')
admin_group.permissions.add(perm)

ABAC (Attribute-Based Access Control)

  • Politique basée sur les attributs utilisateur, la ressource et le contexte
  • Exemple : autoriser la lecture si user.department == resource.owner_department

Sécurisation dans Express (Node.js)

// Protection HTTP et rate limit
const helmet = require('helmet');
const rateLimit = require('express-rate-limit');

app.use(helmet());
app.use(rateLimit({ windowMs: 15 * 60 * 1000, max: 100 }));

Astuce : Activez CORS de façon restrictive (origins autorisés seulement).

Sécurisation dans Django REST Framework

# settings.py
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': ('rest_framework.authentication.TokenAuthentication',),
    'DEFAULT_THROTTLE_CLASSES': ('rest_framework.throttling.UserRateThrottle',),
    'DEFAULT_THROTTLE_RATES': {'user': '100/hour'}
}

Sécurisation dans Apollo Server (GraphQL)

const depthLimit = require('graphql-depth-limit');
const { ApolloServer } = require('apollo-server');

const server = new ApolloServer({
  typeDefs,
  resolvers,
  context: ({ req }) => {
    const token = req.headers.authorization || '';
    return { user: authenticate(token) };
  },
  validationRules: [depthLimit(5)]
});

Attention : Limitez la profondeur et la complexité des requêtes GraphQL pour prévenir les attaques par requête lourde.

Protection contre les attaques

  • Injection (SQL, NoSQL) : utilisez des requêtes paramétrées ou ORM
  • Brute-force : limitez les tentatives et bannissez automatiquement
  • DoS : déployez des WAF (ModSecurity, Cloudflare) et rate limiting

Monitoring et alerting des API

# Exemple configuration Prometheus pour un endpoint d’API
- job_name: 'api'
  static_configs:
    - targets: ['api.example.com:9000']

Astuce : Surveillez spécialement les codes 4xx/5xx et les latences élevées.

Automatisation des tests de sécurité

  • Postman avec scripts Newman
  • OWASP ZAP pour scans DAST
  • Trivy pour l’analyse des images Docker
newman run collection.json --environment env.json
zap-cli quick-scan http://api.example.com

Conclusion et recommandations

La sécurité des API nécessite une approche globale :

  • Authentification forte (OAuth2, JWT)
  • Contrôle fin des permissions (RBAC/ABAC)
  • Protection contre les attaques courantes
  • Surveillance et tests automatisés

Mettez en place ces bonnes pratiques pour garantir la fiabilité et la sécurité de vos API.

Besoin d'aide sur ce sujet ?

Notre équipe d'experts est là pour vous accompagner dans vos projets.

Contactez-nous

Articles similaires qui pourraient vous intéresser