Travaux Pratiques : Protocole HTTP

TP 1 – Exploration avec les outils développeur (DevTools)

Objectifs : Analyser les requêtes/réponses HTTP, comprendre les en-têtes, observer les codes de statut.

1.1 Ouvrir les DevTools
Chrome/Firefox : F12 ou Ctrl+Shift+I → onglet Network. Cochez Preserve log.

1.2 Observer une requête simple
Naviguez vers https://httpbin.org/get. Cliquez sur la requête.

1.3 Tester différentes méthodes (Console)

fetch('https://httpbin.org/get').then(r => r.json()).then(console.log);
fetch('https://httpbin.org/post', {
  method: 'POST',
  headers: {'Content-Type': 'application/json'},
  body: JSON.stringify({name: 'John', age: 30})
}).then(r => r.json()).then(console.log);

1.4 Codes de statut
Tester :
https://httpbin.org/status/200 → code 200
https://httpbin.org/status/404 → code 404
https://httpbin.org/status/500 → code 500
https://httpbin.org/redirect/3 → redirige 3 fois avant d'arriver.

Tableau à compléter (exemple de réponses)

URLMéthodeCodeContent-Type
httpbin.org/getGET200application/json
httpbin.org/postPOST200application/json
httpbin.org/status/201GET201text/html; charset=utf-8

TP 2 – Maîtrise de cURL

Objectifs : Utiliser cURL en ligne de commande, comprendre les options, envoyer différents types de requêtes.

2.1 GET simple

curl https://httpbin.org/get
curl -i https://httpbin.org/get   # inclus les en-têtes
curl -v https://httpbin.org/get   # mode verbeux
Réponse : -i affiche uniquement les en-têtes de réponse ; -v affiche tout le dialogue (requête + réponse, y compris les négociations TLS).

2.2 POST avec données

curl -X POST -d "name=John&email=john@example.com" https://httpbin.org/post
curl -X POST -H "Content-Type: application/json" -d '{"name":"John","email":"john@example.com"}' https://httpbin.org/post

2.3 En-têtes personnalisés

curl -H "Authorization: Bearer mon-token-secret" -H "Accept: application/json" https://httpbin.org/headers

2.4 Suivre les redirections

curl https://httpbin.org/redirect/3      # s'arrête
curl -L https://httpbin.org/redirect/3    # suit les redirections

2.5 Télécharger un fichier

curl -o image.png https://httpbin.org/image/png
curl -O https://example.com/fichier.pdf
Exercice avancé – commande cURL complète :
curl -X POST -H "Content-Type: application/json" -H "X-Custom-Header: MonHeader" -d '{"action":"test","value":42}' -i https://httpbin.org/post

TP 3 – API REST avec JavaScript (Fetch)

Objectifs : Utiliser l'API Fetch, gérer les promesses et async/await, traiter les erreurs HTTP.

3.1 GET basique

fetch('https://jsonplaceholder.typicode.com/users')
  .then(response => response.json())
  .then(users => console.log(users));

async function getUsers() {
  const response = await fetch('https://jsonplaceholder.typicode.com/users');
  const users = await response.json();
  console.log(users);
}

3.2 POST – Créer une ressource

async function createPost(data) {
  const response = await fetch('https://jsonplaceholder.typicode.com/posts', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify(data)
  });
  if (!response.ok) throw new Error(`HTTP ${response.status}`);
  return response.json();
}
createPost({ title: 'Mon article', body: 'Contenu', userId: 1 }).then(console.log);

3.3 PUT – Modifier une ressource

async function updatePost(id, data) {
  const response = await fetch(`https://jsonplaceholder.typicode.com/posts/${id}`, {
    method: 'PUT',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify(data)
  });
  return response.json();
}

3.4 DELETE – Supprimer une ressource

async function deletePost(id) {
  const response = await fetch(`https://jsonplaceholder.typicode.com/posts/${id}`, {
    method: 'DELETE'
  });
  return response.ok;
}
Exercice pratique : Fonction fetchWithRetry (voir démo interactive ci-dessous)
Cliquez pour exécuter un test avec une URL simulée (503).

TP 4 – Analyse des en-têtes de sécurité

Objectifs : Comprendre les en-têtes de sécurité, analyser la configuration d'un site, identifier les améliorations.

4.1 Vérifier les en-têtes d'un site

curl -I https://google.com
curl -s -D - https://github.com -o /dev/null | grep -i "strict\|x-frame\|x-content\|content-security"

4.2 Security Headers : https://securityheaders.com

En-têteRôleValeur recommandée
Strict-Transport-SecurityForcer HTTPSmax-age=31536000; includeSubDomains
X-Frame-OptionsAnti-clickjackingDENY ou SAMEORIGIN
X-Content-Type-OptionsAnti-MIME sniffingnosniff
Content-Security-PolicySources autoriséesdefault-src 'self'
Referrer-PolicyContrôle du referrerstrict-origin-when-cross-origin
Exemple d’analyse :
- github.com : HSTS présent, X-Frame-Options = DENY, CSP partielle → note A
- google.com : HSTS présent, X-Frame-Options = SAMEORIGIN, Referrer-Policy → note A+
- (site personnel) : souvent absent, note F

TP 5 – Cache HTTP et validation (ETag)

Objectifs : Comprendre le fonctionnement du cache, observer les en-têtes de cache, tester la validation avec ETag.

5.1 Observer le cache

curl -i https://httpbin.org/cache/60   # Cache-Control, ETag, Expires

5.2 Requête conditionnelle

curl -i https://httpbin.org/etag/test123
curl -i -H "If-None-Match: test123" https://httpbin.org/etag/test123   # retourne 304 Not Modified

5.3 Simulation navigateur : DevTools → Network, recharger (F5) vs rechargement forcé (Ctrl+Shift+R).

Exemple de configuration cache (Apache .htaccess) :
<FilesMatch "\.(css|js)$">
  Header set Cache-Control "max-age=86400, public"
</FilesMatch>

Exercices récapitulatifs

Synthèse : Client HTTP minimaliste et questions théoriques.

Exercice 1 – Client HTTP minimaliste

Formulaire complet avec URL, méthode, corps (body), affichage du statut, des en-têtes et du corps de la réponse.

La réponse apparaîtra ici.

Exercice 2 – Questions théoriques (réponses intégrées)

  1. Différence entre no-cache et no-store :
    no-cache autorise la mise en cache mais oblige à revalider la ressource à chaque utilisation ; no-store interdit totalement la mise en cache (ni en mémoire, ni sur disque).
  2. Pourquoi POST n'est-il pas idempotent ?
    Une méthode idempotente produit le même effet quelle que soit le nombre de répétitions. POST peut créer des ressources différentes à chaque appel (ex: double achat, duplication).
  3. Que se passe-t-il si le serveur renvoie un code 301 ?
    Redirection permanente. Le client mémorise la nouvelle URL et l’utilise pour les futures requêtes. Les moteurs de recherche transfèrent le « PageRank ».
  4. À quoi sert l'en-tête Origin ?
    Il indique l’origine (protocole, domaine, port) de la requête et est utilisé par la politique CORS pour autoriser ou refuser l’accès aux ressources.
  5. Pourquoi utiliser HttpOnly sur les cookies de session ?
    Il empêche l’accès au cookie via JavaScript, protégeant ainsi contre le vol de session par attaque XSS.