Aller au contenu
Réseaux medium

HTTP et HTTPS : le protocole du Web

18 min de lecture

HTTP (HyperText Transfer Protocol) est le protocole qui permet à votre navigateur de communiquer avec les serveurs web. Chaque fois que vous visitez une page, votre navigateur envoie une requête et le serveur renvoie une réponse avec un code de statut (200 OK, 404 Not Found, etc.). HTTPS ajoute une couche de chiffrement TLS pour sécuriser les échanges. Ce guide vous apprend à comprendre et diagnostiquer les communications HTTP avec curl.

  • HTTP = requête (GET/POST) → réponse (code + contenu)
  • HTTPS = HTTP + chiffrement TLS (port 443 au lieu de 80)
  • 200 = OK, 4xx = erreur client (404 = introuvable), 5xx = erreur serveur
  • curl -I url : voir les headers et le code de statut
  • curl -I https://google.com retourne “200 OK” ou “301/302”
  • Je sais distinguer 401 (pas authentifié) de 403 (pas autorisé)
  • curl -w "%{http_code}\n" -s -o /dev/null url me donne le code HTTP
Fenêtre de terminal
# 1. Voir les headers de réponse
curl -I https://github.com
# 2. Obtenir juste le code HTTP
curl -s -o /dev/null -w "%{http_code}\n" https://api.example.com/health
# 3. Débugger une connexion (DNS, TCP, TLS, HTTP)
curl -v https://api.example.com
  • Connaissances de base en réseau (IP, ports)
  • Un terminal Linux, macOS ou WSL
  • curl installé (présent par défaut sur la plupart des systèmes)

Quick check en 60 secondes (si vous êtes en incident)

Section intitulée « Quick check en 60 secondes (si vous êtes en incident) »

Si vous avez un problème HTTP/HTTPS maintenant, voici la séquence de diagnostic :

Fenêtre de terminal
# 1. Résolution DNS
dig +short api.example.com
# 2. Connectivité TCP (port 443 = HTTPS, 80 = HTTP)
nc -zv api.example.com 443
# 3. Handshake TLS + headers (k = ignore cert pour test)
curl -vkI https://api.example.com
# 4. Code de statut HTTP uniquement
curl -s -o /dev/null -w "%{http_code}\n" https://api.example.com/health
# 5. Si 5xx : vérifier les logs
# - Logs du reverse proxy (nginx, haproxy)
# - Logs du backend applicatif

HTTP fonctionne sur un modèle simple : le client (votre navigateur ou curl) envoie une requête au serveur, qui renvoie une réponse.

Le cycle requête/réponse HTTP : le client envoie une requête GET, le serveur répond avec un code et du contenu

Une requête HTTP contient :

ÉlémentDescriptionExemple
MéthodeL’action demandéeGET, POST, PUT, DELETE
URLLa ressource ciblée/api/users/123
HeadersMétadonnées de la requêteHost: example.com, User-Agent: curl/7.68
BodyDonnées envoyées (POST/PUT){"name": "Jean", "email": "jean@example.com"}

Une réponse HTTP contient :

ÉlémentDescriptionExemple
Code de statutRésultat de la requête200 OK, 404 Not Found
HeadersMétadonnées de la réponseContent-Type: application/json
BodyContenu retournéHTML, JSON, image…

HTTP définit plusieurs méthodes (aussi appelées “verbes”) qui indiquent l’action souhaitée sur une ressource.

MéthodeUsageIdempotent ?
GETRécupérer une ressourceOui
POSTCréer une ressourceNon
PUTRemplacer une ressourceOui
PATCHModifier partiellementNon
DELETESupprimer une ressourceOui
HEADRécupérer les headers seulementOui
OPTIONSConnaître les méthodes autoriséesOui

Les codes de statut sont regroupés en 5 familles selon leur premier chiffre. Connaître les plus courants vous fera gagner un temps précieux en diagnostic.

Le serveur a traité la requête avec succès.

CodeNomSignification
200OKRequête réussie, contenu retourné
201CreatedRessource créée (après POST)
204No ContentSuccès sans contenu (après DELETE)

Le client doit aller chercher la ressource ailleurs.

CodeNomSignificationMéthode conservée ?
301Moved PermanentlyRedirection permanenteNon (peut devenir GET)
302FoundRedirection temporaireNon (peut devenir GET)
307Temporary RedirectRedirection temporaireOui
308Permanent RedirectRedirection permanenteOui
304Not ModifiedRessource en cache encore valide

La requête est mal formée ou non autorisée.

CodeNomSignification
400Bad RequestRequête mal formée (JSON invalide, paramètre manquant)
401UnauthorizedAuthentification requise
403ForbiddenAuthentifié mais pas autorisé
404Not FoundRessource inexistante
405Method Not AllowedMéthode non supportée sur cette URL
429Too Many RequestsRate limiting déclenché

Le serveur a rencontré un problème.

CodeNomSignification
500Internal Server ErrorBug côté serveur
502Bad GatewayLe reverse proxy ne joint pas le backend
503Service UnavailableServeur surchargé ou en maintenance
504Gateway TimeoutLe backend ne répond pas à temps

HTTP transmet les données en clair. Quiconque intercepte le trafic peut lire vos identifiants, vos données personnelles. HTTPS (HTTP Secure) chiffre la communication avec TLS (Transport Layer Security).

HTTP vs HTTPS : les données en clair versus les données chiffrées avec TLS

AspectHTTPHTTPS
Port80443
ChiffrementAucunTLS (AES-GCM, ChaCha20-Poly1305)
CertificatNon requisObligatoire
ConfidentialitéAucuneDonnées illisibles sans clé
IntégritéAucuneModification détectable

En TLS moderne (RFC 8446), l’établissement de connexion sécurisée utilise un échange de clés Diffie-Hellman éphémère (ECDHE), pas un chiffrement RSA de la clé de session (méthode obsolète).

  1. Client Hello

    Le client envoie la liste des algorithmes supportés, un nombre aléatoire, et sa contribution ECDHE (clé publique éphémère).

  2. Server Hello

    Le serveur choisit les algorithmes, envoie son certificat, sa contribution ECDHE, et une signature prouvant son identité.

  3. Vérification du certificat

    Le client vérifie que le certificat est signé par une autorité de confiance (CA) et que le nom de domaine correspond (CN ou SAN).

  4. Dérivation des clés de session

    Les deux parties combinent leurs contributions ECDHE pour calculer un secret partagé, d’où sont dérivées les clés de chiffrement. Personne d’autre ne peut calculer ce secret.

  5. Communication chiffrée

    Tout le trafic HTTP est chiffré avec les clés de session (AES-GCM ou ChaCha20-Poly1305).

En diagnostic, vous manipulerez souvent ces headers :

HeaderRôleExemple
HostDomaine ciblé (obligatoire en HTTP/1.1)Host: api.example.com
AuthorizationAuthentificationAuthorization: Bearer eyJhbG...
Content-TypeFormat des données envoyéesContent-Type: application/json
AcceptFormat attendu en réponseAccept: application/json
User-AgentIdentification du clientUser-Agent: curl/7.68.0
HeaderRôleExemple
Content-TypeFormat du contenu retournéContent-Type: text/html; charset=UTF-8
LocationURL de redirection (3xx)Location: https://www.example.com/
Cache-ControlPolitique de cacheCache-Control: max-age=3600
Set-CookieCréer un cookieSet-Cookie: session=abc123; HttpOnly
HeaderRôleExemple
X-Forwarded-ForIP réelle du clientX-Forwarded-For: 203.0.113.42
X-Forwarded-ProtoProtocole originalX-Forwarded-Proto: https
X-Real-IPIP du client (alternative)X-Real-IP: 203.0.113.42
Fenêtre de terminal
# Exemple : envoyer un header personnalisé
curl -H "Authorization: Bearer mon_token" \
-H "Accept: application/json" \
https://api.example.com/users

curl (Client URL) est l’outil incontournable pour tester des APIs et diagnostiquer des problèmes HTTP depuis le terminal.

Fenêtre de terminal
curl https://httpbin.org/get

Cette commande envoie une requête GET et affiche la réponse JSON.

Fenêtre de terminal
curl -I https://example.com

L’option -I (ou --head) envoie une requête HEAD et n’affiche que les headers, sans le body. Utile pour vérifier les redirections, le type de contenu ou la mise en cache.

Sortie typique :

HTTP/2 200
content-type: text/html; charset=UTF-8
content-length: 1256
cache-control: max-age=604800
Fenêtre de terminal
curl -v https://example.com

L’option -v affiche tout le processus : résolution DNS, connexion TCP, handshake TLS, requête et réponse.

Extrait de sortie :

* Connected to example.com (93.184.216.34) port 443
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* Server certificate:
* subject: CN=www.example.org
* issuer: C=US, O=DigiCert Inc
* SSL certificate verify ok.
> GET / HTTP/2
< HTTP/2 200
Fenêtre de terminal
curl -s -o /dev/null -w "%{http_code}\n" https://example.com
OptionEffet
-sMode silencieux (pas de barre de progression)
-o /dev/nullIgnore le body
-w "%{http_code}\n"Affiche uniquement le code de statut HTTP

Résultat : 200

Fenêtre de terminal
curl -X POST \
-H "Content-Type: application/json" \
-d '{"username": "devops", "email": "devops@example.com"}' \
https://httpbin.org/post
OptionEffet
-X POSTUtilise la méthode POST
-H "..."Ajoute un header
-d '...'Données à envoyer (body)

Ignorer les erreurs de certificat (test uniquement)

Section intitulée « Ignorer les erreurs de certificat (test uniquement) »
Fenêtre de terminal
curl -k https://self-signed.example.com

Pour tester un serveur avec un CA interne ou un certificat auto-signé de manière sécurisée :

Fenêtre de terminal
# Spécifier le certificat CA
curl --cacert /path/to/ca.pem https://internal.example.com
# Ou un dossier de CAs
curl --capath /path/to/ca-certs/ https://internal.example.com

Cela valide le certificat contre votre CA, sans désactiver toute la sécurité TLS.

Fenêtre de terminal
curl -L https://example.com/redirect

L’option -L (ou --location) suit automatiquement les redirections 3xx.

  1. Vérifier que le port est ouvert

    Fenêtre de terminal
    nc -zv api.example.com 443
    • Connection succeeded → port ouvert
    • Connection refused → service non démarré
    • Timeout → pare-feu ou réseau
  2. Tester avec curl verbose

    Fenêtre de terminal
    curl -v https://api.example.com/health

    Examinez à quelle étape la connexion échoue.

  3. Vérifier la résolution DNS

    Fenêtre de terminal
    dig api.example.com +short

    Pas de résultat ? Problème DNS.

Le reverse proxy (Nginx, HAProxy) ne peut pas joindre le backend.

Cause probableVérificationSolution
Backend arrêtésystemctl status backendRedémarrer le service
Mauvais portVérifier la config du proxyCorriger le proxy_pass
Timeout trop courtLogs du proxyAugmenter proxy_read_timeout

Le serveur est surchargé ou en maintenance.

Cause probableVérificationSolution
Trop de requêteshtop, logs applicatifsScaler horizontalement
Maintenance planifiéePage de maintenanceAttendre
Pool de connexions épuiséLogs backendAugmenter les workers
Fenêtre de terminal
curl -v https://example.com 2>&1 | grep -i "ssl\|certificate"
MessageCauseSolution
certificate has expiredCertificat expiréRenouveler avec certbot
certificate verify failedCA non reconnueInstaller le certificat CA
hostname mismatchDomaine incorrectVérifier le CN/SAN du certificat

Testez vos connaissances avec ces exercices :

  1. Obtenir le code HTTP d’une URL

    Fenêtre de terminal
    curl -s -o /dev/null -w "%{http_code}" https://google.com

    Attendu : 301 (redirection vers www.google.com)

  2. Suivre la redirection et obtenir le code final

    Fenêtre de terminal
    curl -sL -o /dev/null -w "%{http_code}" https://google.com

    Attendu : 200

  3. Afficher les headers d’un site

    Fenêtre de terminal
    curl -I https://github.com

    Identifiez le Server, le Content-Type et les headers de sécurité.

  4. Tester une API POST

    Fenêtre de terminal
    curl -X POST -H "Content-Type: application/json" \
    -d '{"test": "data"}' \
    https://httpbin.org/post

    Vérifiez que votre JSON apparaît dans la réponse.

SymptômeCause probableSolution
Connection refusedService non démarréVérifier systemctl status
Connection timed outPare-feu ou réseauVérifier les règles firewall
SSL certificate problemCertificat invalide/expiréRenouveler ou ignorer avec -k (test)
curl: (6) Could not resolveProblème DNSVérifier /etc/resolv.conf
401 UnauthorizedToken manquant/expiréVérifier l’authentification
403 ForbiddenDroits insuffisantsVérifier les permissions/rôles
502 Bad GatewayBackend inaccessibleVérifier le service backend
  • HTTP est un protocole requête/réponse : le client demande, le serveur répond
  • Les codes 2xx = succès, 4xx = erreur client, 5xx = erreur serveur
  • HTTPS = HTTP + TLS : chiffrement des données en transit
  • curl -I affiche les headers, curl -v montre tout le processus
  • Pour diagnostiquer : commencer par le code HTTP, puis les headers, puis les logs serveur
  • 502 Bad Gateway = le proxy ne joint pas le backend
  • 503 Service Unavailable = backend surchargé ou en maintenance

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

10 questions
10 min.
80% requis

Informations

  • Le chronomètre démarre au clic sur Démarrer
  • Questions à choix multiples, vrai/faux et réponses courtes
  • Vous pouvez naviguer entre les questions
  • Les résultats détaillés sont affichés à la fin

Lance le quiz et démarre le chronomètre

SujetSource
HTTP sémantiqueRFC 9110
Codes de statut HTTPMDN HTTP Status Codes
TLS 1.3RFC 8446
Ports officielsIANA Service Name and Port Number Registry
curl —write-outEverything curl
Let’s Encryptletsencrypt.org