Builders Academy
HTTP en Profondeur — Le Protocole du Web
2 of 3

Chapitre 1 · Leçon 2

Headers HTTP

Cache, CORS, cookies et headers de sécurité

Section 1

Cache HTTP

Step 1

Cache-Control et ETag

Le cache HTTP évite des requêtes inutiles. Cache-Control définit la politique de cache, ETag permet la validation conditionnelle.

snippet.typescript

typescript
1// Configurer le cache dans Express
2
3// ✅ Ressources statiques — cache long
4app.use('/static', express.static('public', {
5  maxAge: '30d',  // Cache 30 jours côté client
6  etag: true,     // Activer ETag pour validation conditionnelle
7  lastModified: true,
8}));
9
10// ✅ Réponse API — pas de cache (données dynamiques)
11app.get('/api/tutorials', (req, res) => {
12  res.set({
13    'Cache-Control': 'no-store',  // Ne pas cacher du tout
14    'Pragma': 'no-cache',         // Legacy HTTP/1.0
15  });
16  res.json(tutorials);
17});
18
19// ✅ Page rendue — cache court avec revalidation
20app.get('/tutorials/:slug', (req, res) => {
21  res.set('Cache-Control', 'public, max-age=60, stale-while-revalidate=300');
22  // max-age=60 : frais pendant 60s
23  // stale-while-revalidate=300 : servir l'ancien pendant 5min en background
24  res.json(tutorial);
25});
26
27// ✅ Assets immutables (hash dans le nom) — cache permanent
28// tutorial-abc123.js → jamais modifié, si l'app change → nouveau hash
29app.get('/assets/*', (req, res) => {
30  res.set('Cache-Control', 'public, max-age=31536000, immutable');
31  // Pas de revalidation nécessaire car le nom de fichier change avec le contenu
32});

snippet.typescript

typescript
1// Configurer le cache dans Express
2
3// ✅ Ressources statiques — cache long
4app.use('/static', express.static('public', {
5  maxAge: '30d',  // Cache 30 jours côté client
6  etag: true,     // Activer ETag pour validation conditionnelle
7  lastModified: true,
8}));
9
10// ✅ Réponse API — pas de cache (données dynamiques)
11app.get('/api/tutorials', (req, res) => {
12  res.set({
13    'Cache-Control': 'no-store',  // Ne pas cacher du tout
14    'Pragma': 'no-cache',         // Legacy HTTP/1.0
15  });
16  res.json(tutorials);
17});
18
19// ✅ Page rendue — cache court avec revalidation
20app.get('/tutorials/:slug', (req, res) => {
21  res.set('Cache-Control', 'public, max-age=60, stale-while-revalidate=300');
22  // max-age=60 : frais pendant 60s
23  // stale-while-revalidate=300 : servir l'ancien pendant 5min en background
24  res.json(tutorial);
25});
26
27// ✅ Assets immutables (hash dans le nom) — cache permanent
28// tutorial-abc123.js → jamais modifié, si l'app change → nouveau hash
29app.get('/assets/*', (req, res) => {
30  res.set('Cache-Control', 'public, max-age=31536000, immutable');
31  // Pas de revalidation nécessaire car le nom de fichier change avec le contenu
32});

Section 2

CORS — Cross-Origin Resource Sharing

Step 2

Comprendre et configurer CORS

CORS est une politique de sécurité du navigateur qui bloque les requêtes vers un domaine différent. Le serveur déclare quels origines sont autorisés via des headers.

snippet.typescript

typescript
1// Configurer le cache dans Express
2
3// ✅ Ressources statiques — cache long
4app.use('/static', express.static('public', {
5  maxAge: '30d',  // Cache 30 jours côté client
6  etag: true,     // Activer ETag pour validation conditionnelle
7  lastModified: true,
8}));
9
10// ✅ Réponse API — pas de cache (données dynamiques)
11app.get('/api/tutorials', (req, res) => {
12  res.set({
13    'Cache-Control': 'no-store',  // Ne pas cacher du tout
14    'Pragma': 'no-cache',         // Legacy HTTP/1.0
15  });
16  res.json(tutorials);
17});
18
19// ✅ Page rendue — cache court avec revalidation
20app.get('/tutorials/:slug', (req, res) => {
21  res.set('Cache-Control', 'public, max-age=60, stale-while-revalidate=300');
22  // max-age=60 : frais pendant 60s
23  // stale-while-revalidate=300 : servir l'ancien pendant 5min en background
24  res.json(tutorial);
25});
26
27// ✅ Assets immutables (hash dans le nom) — cache permanent
28// tutorial-abc123.js → jamais modifié, si l'app change → nouveau hash
29app.get('/assets/*', (req, res) => {
30  res.set('Cache-Control', 'public, max-age=31536000, immutable');
31  // Pas de revalidation nécessaire car le nom de fichier change avec le contenu
32});

Topics and skills covered

  • HTTP
  • Cache-Control
  • CORS
  • Cookies
  • Headers