madamasterclass.com

📔 Interaction client-serveur

Faire le point sur l'Interaction client-serveur


Dans ce cours, nous allons explorer les interactions client-serveur dans le développement web. Nous étudierons en détail les requêtes HTTP, la construction et gestion des formulaires, ainsi que les aspects sécuritaires essentiels. Nous verrons comment créer des applications web robustes qui communiquent efficacement entre le navigateur et le serveur.

L'interaction client-serveur est le fondement du web moderne. Elle permet l'échange de données entre le navigateur (client) et le serveur, rendant possible la création d'applications web dynamiques et interactives. La maîtrise de ces concepts est cruciale pour développer des applications web sécurisées et performantes.

Interaction client-serveur

1. Architecture client-serveur - Les fondamentaux
  • Client : Navigateur web qui envoie des requêtes
  • Serveur : Application qui traite et répond aux requêtes
  • Protocole HTTP/HTTPS : Langage de communication
📋 Mémo rapide : Client demande → Serveur traite → Serveur répond → Client affiche

2. Le protocole HTTP - Étude approfondie
  • ✦ HyperText Transfer Protocol - protocole de communication web
  • ✦ Stateless : chaque requête est indépendante
  • ✦ Structure requête/réponse standardisée
Méthode HTTP Usage Sécurité données
GET Récupérer des données Visible dans l'URL
POST Envoyer des données Dans le corps de requête
PUT Créer/Modifier ressource Dans le corps de requête
DELETE Supprimer ressource Paramètres URL
3. Anatomie d'une requête HTTP
  • ✦ Ligne de requête : méthode, URL, version HTTP
  • ✦ En-têtes : métadonnées de la requête
  • ✦ Corps : données envoyées (POST, PUT)
   📨 Exemple de requête HTTP GET :
   
   GET /api/users?page=1 HTTP/1.1
   Host: monsite.com
   User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
   Accept: application/json
   Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
   
   📨 Exemple de requête HTTP POST :
   
   POST /api/users HTTP/1.1
   Host: monsite.com
   Content-Type: application/json
   Content-Length: 87
   
   {
     "nom": "Dupont",
     "email": "dupont@email.com",
     "age": 25
   }
   
⚡ Points importants : Les en-têtes définissent le format, l'authentification, la langue, etc.
4. Codes de statut HTTP - Comprendre les réponses
Famille Codes courants Signification
2xx - Succès 200, 201, 204 Requête traitée avec succès
3xx - Redirection 301, 302, 304 Ressource déplacée ou mise en cache
4xx - Erreur client 400, 401, 403, 404 Erreur dans la requête du client
5xx - Erreur serveur 500, 502, 503 Problème côté serveur
5. Construction et gestion des formulaires HTML
  • ✦ Interface principale pour la saisie utilisateur
  • ✦ Validation côté client ET serveur obligatoire
  • ✦ Choix méticuleux entre GET et POST
   📝 Structure d'un formulaire complet :
   
   <form action="/traitement.php" method="POST" enctype="multipart/form-data">
       <!-- Champs de saisie -->
       <label for="nom">Nom :</label>
       <input type="text" id="nom" name="nom" required maxlength="50">
       
       <label for="email">Email :</label>
       <input type="email" id="email" name="email" required>
       
       <label for="age">Âge :</label>
       <input type="number" id="age" name="age" min="18" max="120">
       
       <!-- Upload de fichier -->
       <label for="photo">Photo :</label>
       <input type="file" id="photo" name="photo" accept="image/*">
       
       <!-- Protection CSRF -->
       <input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">
       
       <button type="submit">Envoyer</button>
   </form>
   
⚠️ Important : Toujours utiliser `enctype="multipart/form-data"` pour les uploads de fichiers !
6. GET vs POST - Faire le bon choix
Critère GET POST
Visibilité données URL visible Corps de requête
Taille limite ~2048 caractères Théoriquement illimitée
Mise en cache Oui (navigateur/proxy) Non
Historique Stocké Non stocké
Usage recommandé Recherche, filtres Données sensibles, upload
7. Traitement des données côté serveur (PHP)
   🔄 Traitement sécurisé des formulaires PHP :
   
   <?php
   // Vérification de la méthode
   if ($_SERVER['REQUEST_METHOD'] === 'POST') {
       
       // Validation CSRF
       if (!hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {
           die('Token CSRF invalide');
       }
       
       // Nettoyage et validation des données
       $nom = filter_input(INPUT_POST, 'nom', FILTER_SANITIZE_STRING);
       $email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
       $age = filter_input(INPUT_POST, 'age', FILTER_VALIDATE_INT, 
                          ['options' => ['min_range' => 18, 'max_range' => 120]]);
       
       // Vérification des erreurs
       $erreurs = [];
       if (empty($nom)) $erreurs[] = "Le nom est requis";
       if (!$email) $erreurs[] = "Email invalide";
       if ($age === false) $erreurs[] = "Âge invalide";
       
       if (empty($erreurs)) {
           // Traitement des données (base de données, etc.)
           // Utilisation de requêtes préparées pour éviter l'injection SQL
           $stmt = $pdo->prepare("INSERT INTO users (nom, email, age) VALUES (?, ?, ?)");
           $stmt->execute([$nom, $email, $age]);
           
           // Redirection après traitement réussi
           header('Location: /success.php');
           exit;
       }
   }
   ?>
   
8. Sécurité - Les menaces et leurs contremesures
Menace Description Protection
Injection SQL Code SQL malveillant injecté Requêtes préparées
XSS Scripts malveillants dans pages Échappement HTML
CSRF Requêtes non autorisées Tokens CSRF
Session Hijacking Vol de session utilisateur HTTPS + Cookies sécurisés
   🔒 Exemple de protection CSRF :
   
   <?php
   // Génération du token CSRF
   if (empty($_SESSION['csrf_token'])) {
       $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
   }
   ?>
   
   <!-- Dans le formulaire -->
   <input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">
   
   🛡️ Protection contre l'injection SQL :
   
   // ❌ DANGEREUX - Vulnérable à l'injection
   $sql = "SELECT * FROM users WHERE email = '" . $_POST['email'] . "'";
   
   // ✅ SÉCURISÉ - Requête préparée
   $stmt = $pdo->prepare("SELECT * FROM users WHERE email = ?");
   $stmt->execute([$_POST['email']]);
   
   🔐 Échappement pour éviter XSS :
   
   // Affichage sécurisé
   echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
   
🚨 Règle d'or :
• Ne jamais faire confiance aux données utilisateur
• Valider côté client ET serveur
• Utiliser HTTPS pour les données sensibles
• Maintenir les systèmes à jour
9. Techniques avancées - AJAX et API REST
   🚀 Requête AJAX moderne avec Fetch API :
   
   // Envoi de données avec fetch()
   async function envoyerDonnees(donnees) {
       try {
           const response = await fetch('/api/users', {
               method: 'POST',
               headers: {
                   'Content-Type': 'application/json',
                   'X-CSRF-Token': document.querySelector('meta[name="csrf-token"]').content
               },
               body: JSON.stringify(donnees)
           });
           
           if (!response.ok) {
               throw new Error(`Erreur ${response.status}: ${response.statusText}`);
           }
           
           const resultat = await response.json();
           console.log('Succès:', resultat);
           
       } catch (error) {
           console.error('Erreur:', error);
           // Gestion d'erreur côté client
           document.getElementById('message-erreur').textContent = 
               'Une erreur est survenue. Veuillez réessayer.';
       }
   }
   
   // Utilisation
   const formData = {
       nom: 'Dupont',
       email: 'dupont@email.com',
       age: 25
   };
   
   envoyerDonnees(formData);
   
10. Exemple pratique complet - Système d'inscription sécurisé
   💡 Système d'inscription complet :
   
   <!-- HTML -->
   <form id="inscriptionForm" action="/inscription.php" method="POST">
       <div>
           <label for="nom">Nom complet :</label>
           <input type="text" id="nom" name="nom" required minlength="2" maxlength="50">
           <span class="erreur" id="erreur-nom"></span>
       </div>
       
       <div>
           <label for="email">Email :</label>
           <input type="email" id="email" name="email" required>
           <span class="erreur" id="erreur-email"></span>
       </div>
       
       <div>
           <label for="motdepasse">Mot de passe :</label>
           <input type="password" id="motdepasse" name="motdepasse" required minlength="8">
           <span class="erreur" id="erreur-motdepasse"></span>
       </div>
       
       <input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">
       <button type="submit">S'inscrire</button>
   </form>
   
   <!-- JavaScript pour validation temps réel -->
   <script>
   document.getElementById('inscriptionForm').addEventListener('submit', async function(e) {
       e.preventDefault();
       
       // Validation côté client
       const nom = document.getElementById('nom').value.trim();
       const email = document.getElementById('email').value.trim();
       const motdepasse = document.getElementById('motdepasse').value;
       
       let erreurs = false;
       
       if (nom.length < 2) {
           document.getElementById('erreur-nom').textContent = 'Le nom doit contenir au moins 2 caractères';
           erreurs = true;
       }
       
       if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
           document.getElementById('erreur-email').textContent = 'Email invalide';
           erreurs = true;
       }
       
       if (motdepasse.length < 8) {
           document.getElementById('erreur-motdepasse').textContent = 'Le mot de passe doit contenir au moins 8 caractères';
           erreurs = true;
       }
       
       if (!erreurs) {
           // Envoi via fetch
           const formData = new FormData(this);
           
           try {
               const response = await fetch('/inscription.php', {
                   method: 'POST',
                   body: formData
               });
               
               const result = await response.json();
               
               if (result.success) {
                   window.location.href = '/connexion.php?inscription=success';
               } else {
                   // Affichage des erreurs serveur
                   result.erreurs.forEach(erreur => {
                       console.error(erreur);
                   });
               }
           } catch (error) {
               console.error('Erreur réseau:', error);
           }
       }
   });
   </script>
   
11. Résumé des points essentiels
💡 Points clés à retenir :
  • 🔸 HTTP est un protocole stateless avec structure requête/réponse
  • 🔸 Choisir GET pour récupérer, POST pour envoyer des données sensibles
  • 🔸 Toujours valider les données côté client ET serveur
  • 🔸 Implémenter les protections CSRF, XSS et injection SQL
  • 🔸 Utiliser HTTPS pour chiffrer les échanges et protéger les données
  • 🔸 Gérer proprement les erreurs (codes HTTP appropriés)
  • 🔸 Optimiser les performances (compression, cache, requêtes minimes)
  • 🔸 Documenter clairement les APIs (Swagger/OpenAPI)
  • 🔸 Mettre en place un système d'authentification sécurisé (JWT/OAuth)
  • 🔸 Respecter les bonnes pratiques REST pour les APIs (verbes HTTP, URLs)
  • 🔸 Prévoir des mécanismes de limitation de requêtes (rate limiting)
  • 🔸 Tester différents scénarios (succès, échec, edge cases)
Interaction Client-Serveur : Requêtes HTTP, Formulaires et Sécurité

Exercice 1: Envoi de requête GET avec Fetch API ★ ★ ☆ ☆ ☆

Objectif pédagogique : Comprendre les requêtes HTTP GET et manipuler les réponses JSON.

Énoncé :
1. Créez un bouton qui déclenche une requête GET vers l'API JSONPlaceholder (https://jsonplaceholder.typicode.com/posts/1)
2. Affichez le titre du post reçu dans un élément HTML
Conseil : Utilisez fetch().then() pour gérer la réponse asynchrone.

Correction détaillée :

HTML :
<button id="fetchBtn">Charger un post</button>
<div id="result"></div>


JavaScript :
document.getElementById('fetchBtn').addEventListener('click', () => {
  fetch('https://jsonplaceholder.typicode.com/posts/1')
    .then(response => {
      if (!response.ok) throw new Error('Erreur réseau');
      return response.json();
    })
    .then(data => {
      document.getElementById('result').textContent = data.title;
    })
    .catch(error => {
      console.error('Erreur:', error);
    });
});


Points clés :
• Vérification du statut HTTP avec response.ok
• Conversion de la réponse en JSON
• Gestion des erreurs avec catch


Exercice 2: Soumission de formulaire avec POST ★ ★ ★ ☆ ☆

Objectif pédagogique : Maîtriser l'envoi de données via POST et la prévention du rechargement de page.

Énoncé :
1. Créez un formulaire avec champs "nom" et "email" qui envoie les données en POST à https://jsonplaceholder.typicode.com/users
2. Empêchez le rechargement de page et affichez la réponse du serveur
Astuce : Utilisez preventDefault() et FormData pour collecter les données.

Étapes pas à pas :

HTML :
<form id="userForm">
  <input type="text" name="name" placeholder="Nom" required>
  <input type="email" name="email" placeholder="Email" required>
  <button type="submit">Envoyer</button>
</form>
<div id="response"></div>


JavaScript :
document.getElementById('userForm').addEventListener('submit', async (e) => {
  e.preventDefault();
  const formData = new FormData(e.target);
  const data = Object.fromEntries(formData);

  try {
    const response = await fetch('https://jsonplaceholder.typicode.com/users', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify(data)
    });
    const result = await response.json();
    document.getElementById('response').textContent = JSON.stringify(result, null, 2);
  } catch (error) {
    console.error('Erreur:', error);
  }
});


Bonnes pratiques :
• Utilisation de async/await pour une meilleure lisibilité
• Headers précisés explicitement
• Conversion des données en JSON


Exercice 3: Sécurité - Validation côté client ★ ★ ★ ★ ☆

Objectif pédagogique : Implémenter des mesures de sécurité basiques côté client.

Énoncé :
Créez un formulaire de connexion avec :
1. Validation de l'email (format valide)
2. Validation du mot de passe (8 caractères minimum, 1 majuscule, 1 chiffre)
3. Protection contre les attaques XSS en échappant les entrées utilisateur

Attention : La validation côté client ne remplace pas la validation côté serveur!
Solution complète :

HTML :
<form id="loginForm">
  <input type="email" id="email" placeholder="Email" required>
  <span id="emailError" class="error"></span>
  <input type="password" id="password" placeholder="Mot de passe" required>
  <span id="passwordError" class="error"></span>
  <button type="submit">Connexion</button>
</form>


JavaScript :
function escapeHtml(unsafe) {
  return unsafe.replace(/[&<"'>]/g, function(m) {
    return {'&': '&', '<': '<', '>': '>', '"': '"', "'": '''}[m];
  });
}

document.getElementById('loginForm').addEventListener('submit', (e) => {
  e.preventDefault();
  let isValid = true;

  // Validation email
  const email = escapeHtml(document.getElementById('email').value);
  const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
  if (!emailRegex.test(email)) {
    document.getElementById('emailError').textContent = 'Email invalide';
    isValid = false;
  } else {
    document.getElementById('emailError').textContent = '';
  }

  // Validation mot de passe
  const password = escapeHtml(document.getElementById('password').value);
  const passwordRegex = /^(?=.*[A-Z])(?=.*\d).{8,}$/;
  if (!passwordRegex.test(password)) {
    document.getElementById('passwordError').textContent = '8 caractères min, 1 majuscule, 1 chiffre';
    isValid = false;
  } else {
    document.getElementById('passwordError').textContent = '';
  }

  if (isValid) {
    // Envoyer les données au serveur
    console.log('Données validées:', { email, password });
  }
});


Sécurité :
• Échappement des caractères spéciaux
• Expressions régulières robustes
• Feedback utilisateur clair


Exercice 4: Authentification avec JWT ★ ★ ★ ★ ★

Objectif pédagogique : Gérer l'authentification JWT côté client (stockage, envoi, expiration).

Énoncé :
1. Après une "connexion" réussie, stockez le JWT reçu de manière sécurisée
2. Ajoutez le JWT aux en-têtes des requêtes suivantes
3. Implémentez une déconnexion qui supprime le token
4. Vérifiez l'expiration du token avant de l'utiliser

Méthode : Utilisez HttpOnly cookies pour la production, localStorage/sessionStorage pour cet exercice.
Analyse approfondie :

HTML :
<div id="authSection">
  <form id="loginForm">
    <input type="text" id="username" placeholder="Nom d'utilisateur">
    <input type="password" id="password" placeholder="Mot de passe">
    <button type="submit">Se connecter</button>
  </form>
  <button id="logoutBtn" style="display:none;">Déconnexion</button>
  <button id="fetchDataBtn" style="display:none;">Charger données protégées</button>
</div>
<div id="dataContainer"></div>


JavaScript :
// Simuler une API d'authentification
async function fakeAuthApi(username, password) {
  return new Promise(resolve => {
    setTimeout(() => {
      // En réalité, ceci viendrait du serveur
      const token = btoa(JSON.stringify({
        sub: username,
        iat: Math.floor(Date.now() / 1000),
        exp: Math.floor(Date.now() / 1000) + 3600 // Expire dans 1h
      }));
      resolve({ token });
    }, 500);
  });
}

// Stocker le token
function storeToken(token) {
  localStorage.setItem('jwt', token);
  document.getElementById('loginForm').style.display = 'none';
  document.getElementById('logoutBtn').style.display = 'block';
  document.getElementById('fetchDataBtn').style.display = 'block';
}

// Vérifier si le token est valide
function isTokenValid() {
  const token = localStorage.getItem('jwt');
  if (!token) return false;
  try {
    const payload = JSON.parse(atob(token.split('.')[1]));
    return payload.exp > Math.floor(Date.now() / 1000);
  } catch {
    return false;
  }
}

// Gestion de la connexion
document.getElementById('loginForm').addEventListener('submit', async (e) => {
  e.preventDefault();
  const { token } = await fakeAuthApi(
    document.getElementById('username').value,
    document.getElementById('password').value
  );
  storeToken(token);
});

// Gestion de la déconnexion
document.getElementById('logoutBtn').addEventListener('click', () => {
  localStorage.removeItem('jwt');
  document.getElementById('loginForm').style.display = 'block';
  document.getElementById('logoutBtn').style.display = 'none';
  document.getElementById('fetchDataBtn').style.display = 'none';
});

// Requête authentifiée
document.getElementById('fetchDataBtn').addEventListener('click', async () => {
  if (!isTokenValid()) {
    alert('Session expirée, veuillez vous reconnecter');
    return;
  }
  try {
    const response = await fetch('https://api.example.com/protected', {
      headers: {
        'Authorization': `Bearer ${localStorage.getItem('jwt')}`
      }
    });
    const data = await response.json();
    document.getElementById('dataContainer').textContent = JSON.stringify(data);
  } catch (error) {
    console.error('Erreur:', error);
  }
});


Exercice 5: Upload de fichiers avec progression ★ ★ ★ ★ ★

Objectif pédagogique : Gérer l'upload de fichiers avec suivi de progression et validation.

Énoncé :
1. Créez un formulaire d'upload acceptant uniquement les images (max 2MB)
2. Affichez la progression de l'upload
3. Prévisualisez l'image avant envoi
4. Affichez un message de succès/erreur

Rappel : • Utilisez FormData pour l'envoi de fichiers
• L'objet XMLHttpRequest permet de suivre la progression
• FileReader permet la prévisualisation
Explications :

HTML :
<form id="uploadForm">
  <input type="file" id="fileInput" accept="image/*">
  <button type="submit">Uploader</button>
</form>
<div id="preview" style="margin:10px 0;"></div>
<progress id="progressBar" value="0" max="100" style="width:100%; display:none;"></progress>
<div id="status"></div>


JavaScript :
const MAX_SIZE = 2 * 1024 * 1024; // 2MB

// Prévisualisation
document.getElementById('fileInput').addEventListener('change', function(e) {
  const file = e.target.files[0];
  if (!file) return;
  if (!file.type.match('image.*')) {
    alert('Seules les images sont autorisées');
    return;
  }
  if (file.size > MAX_SIZE) {
    alert('Fichier trop volumineux (max 2MB)');
    return;
  }

  const reader = new FileReader();
  reader.onload = function(e) {
    document.getElementById('preview').innerHTML = `<img src="${e.target.result}" style="max-width:200px;">`;
  };
  reader.readAsDataURL(file);
});

// Upload
document.getElementById('uploadForm').addEventListener('submit', function(e) {
  e.preventDefault();
  const file = document.getElementById('fileInput').files[0];
  if (!file) {
    document.getElementById('status').textContent = 'Aucun fichier sélectionné';
    return;
  }

  const formData = new FormData();
  formData.append('file', file);

  const xhr = new XMLHttpRequest();
  xhr.open('POST', 'https://api.example.com/upload', true);

  // Suivi de progression
  xhr.upload.onprogress = function(e) {
    if (e.lengthComputable) {
      const percent = Math.round((e.loaded / e.total) * 100);
      document.getElementById('progressBar').value = percent;
      document.getElementById('progressBar').style.display = 'block';
    }
  };

  xhr.onload = function() {
    if (xhr.status === 200) {
      document.getElementById('status').textContent = 'Upload réussi!';
    } else {
      document.getElementById('status').textContent = 'Erreur lors de l\'upload';
    }
  };

  xhr.send(formData);
});


Fonctionnalités :
• Validation du type et taille du fichier
• Prévisualisation avant envoi
• Barre de progression visuelle
• Feedback utilisateur clair


Exercice 1: ★ ★ ★ ☆ ☆

Soit la droite d'équation \( 2x + 5y - 10 = 0 \). Déterminez un vecteur normal à cette droite et vérifiez votre réponse en montrant qu'il est perpendiculaire à un vecteur directeur de la droite.

Pour déterminer le vecteur normal :
  1. Dans l'équation \( 2x + 5y - 10 = 0 \), on identifie \( a = 2 \) et \( b = 5 \).
  2. Le vecteur normal est donc \( \vec{n} = (2, 5) \).
  3. Vérification : Un vecteur directeur de la droite est \( \vec{u} = (-b, a) = (-5, 2) \).
  4. Produit scalaire : \( \vec{n} \cdot \vec{u} = 2 \times (-5) + 5 \times 2 = -10 + 10 = 0 \).
Le produit scalaire étant nul, les vecteurs sont bien perpendiculaires.
Réponse : \( \vec{n} = (2, 5) \)


Exercice 2: ★ ★ ★ ★ ☆

Déterminez l'équation cartésienne de la droite passant par le point \( A(3, -2) \) et admettant \( \vec{n} = (1, -4) \) comme vecteur normal.

Pour déterminer l'équation de la droite :
  1. Utilisons la formule : \( a(x - x_0) + b(y - y_0) = 0 \)
  2. Avec \( \vec{n} = (a, b) = (1, -4) \) et \( A(x_0, y_0) = (3, -2) \)
  3. L'équation devient : \( 1(x - 3) + (-4)(y - (-2)) = 0 \)
  4. Développons : \( (x - 3) - 4(y + 2) = 0 \)
  5. Soit : \( x - 3 - 4y - 8 = 0 \)
  6. Finalement : \( x - 4y - 11 = 0 \)
Réponse : \( x - 4y - 11 = 0 \)


Exercice 3: ★ ★ ★ ★ ★

Soit le point \( M(4, 1) \) et la droite \( (d) : x - 2y + 3 = 0 \). Déterminez les coordonnées du projeté orthogonal \( H \) de \( M \) sur la droite \( (d) \). Calculez également la distance de \( M \) à la droite.

Pour déterminer le projeté orthogonal :
  1. Identifions les coefficients : \( a = 1 \), \( b = -2 \), \( c = 3 \)
  2. Point \( M(4, 1) \) donc \( x_M = 4 \), \( y_M = 1 \)
  3. Calculons : \( ax_M + by_M + c = 1(4) + (-2)(1) + 3 = 4 - 2 + 3 = 5 \)
  4. Et : \( a^2 + b^2 = 1^2 + (-2)^2 = 1 + 4 = 5 \)
  5. Coordonnées de \( H \) : \[ x_H = 4 - \frac{1 \times 5}{5} = 4 - 1 = 3 \] \[ y_H = 1 - \frac{(-2) \times 5}{5} = 1 + 2 = 3 \]
  6. Distance \( MH = \frac{|ax_M + by_M + c|}{\sqrt{a^2 + b^2}} = \frac{|5|}{\sqrt{5}} = \sqrt{5} \)
Réponse : \( H(3, 3) \) et distance = \( \sqrt{5} \)


Exercice 4: ★ ★ ★ ★ ☆

L'équation \( x^2 + y^2 + 6x - 4y - 12 = 0 \) représente-t-elle un cercle ? Si oui, déterminez son centre et son rayon.

Pour déterminer si c'est un cercle :
  1. L'équation est de la forme \( x^2 + y^2 + Dx + Ey + F = 0 \)
  2. Avec \( D = 6 \), \( E = -4 \), \( F = -12 \)
  3. Calculons le discriminant : \( D^2 + E^2 - 4F = 6^2 + (-4)^2 - 4(-12) = 36 + 16 + 48 = 100 > 0 \)
  4. C'est donc bien un cercle !
  5. Centre : \( \Omega\left(-\frac{D}{2}, -\frac{E}{2}\right) = \Omega\left(-\frac{6}{2}, -\frac{-4}{2}\right) = \Omega(-3, 2) \)
  6. Rayon : \( r = \frac{1}{2}\sqrt{D^2 + E^2 - 4F} = \frac{1}{2}\sqrt{100} = \frac{10}{2} = 5 \)
Réponse : Oui, c'est un cercle de centre \( (-3, 2) \) et de rayon 5


Exercice 5: ★ ★ ★ ★ ★

Un cercle passe par les points \( A(1, 0) \), \( B(0, 1) \) et \( C(-1, 0) \). Déterminez l'équation de ce cercle sous forme canonique, puis vérifiez que le point \( D(0, -1) \) appartient également à ce cercle.

Pour déterminer l'équation du cercle :
  1. Soit l'équation générale : \( x^2 + y^2 + Dx + Ey + F = 0 \)
  2. Le point \( A(1, 0) \) appartient au cercle : \( 1 + 0 + D + 0 + F = 0 \) ⟹ \( D + F = -1 \)
  3. Le point \( B(0, 1) \) appartient au cercle : \( 0 + 1 + 0 + E + F = 0 \) ⟹ \( E + F = -1 \)
  4. Le point \( C(-1, 0) \) appartient au cercle : \( 1 + 0 - D + 0 + F = 0 \) ⟹ \( -D + F = -1 \)
  5. Résolvons le système : - De (1) et (3) : \( D + F = -1 \) et \( -D + F = -1 \) ⟹ \( D = 0 \) et \( F = -1 \) - De (2) : \( E + F = -1 \) ⟹ \( E = 0 \)
  6. L'équation est donc : \( x^2 + y^2 - 1 = 0 \) ou \( x^2 + y^2 = 1 \)
  7. Forme canonique : \( (x - 0)^2 + (y - 0)^2 = 1^2 \)
  8. Vérification avec \( D(0, -1) \) : \( 0^2 + (-1)^2 = 0 + 1 = 1 \) ✓
Réponse : \( x^2 + y^2 = 1 \) (cercle centré à l'origine de rayon 1). Le point D appartient bien au cercle.


Exercices de Géométrie Repérée - Problèmes avec Contexte
Exercice 1: ★ ★ ★ ☆ ☆

Contexte architectural : Un architecte dessine les plans d'un bâtiment sur un repère orthonormé où l'unité correspond à 1 mètre. Il souhaite tracer un mur rectiligne qui suit l'équation \( 3x + 4y - 24 = 0 \). Pour des raisons de sécurité, il doit installer un système d'éclairage perpendiculaire à ce mur.

Questions :
a) Déterminez un vecteur normal au mur.
b) Si le système d'éclairage part du point \( A(4, 3) \) situé sur le mur, donnez l'équation de la droite supportant ce système d'éclairage.
c) Vérifiez que le point A appartient bien au mur.

a) Vecteur normal au mur :
  1. L'équation du mur est \( 3x + 4y - 24 = 0 \)
  2. Le vecteur normal est \( \vec{n} = (3, 4) \)
b) Équation du système d'éclairage :
  1. Le système d'éclairage est perpendiculaire au mur, donc il suit la direction du vecteur normal
  2. Il passe par \( A(4, 3) \) avec la direction \( \vec{n} = (3, 4) \)
  3. L'équation paramétrique est : \( \begin{cases} x = 4 + 3t \\ y = 3 + 4t \end{cases} \)
  4. Pour obtenir l'équation cartésienne, éliminons \( t \) : \( 4x - 3y - 7 = 0 \)
c) Vérification :
  1. Substituons \( A(4, 3) \) dans l'équation du mur :
  2. \( 3(4) + 4(3) - 24 = 12 + 12 - 24 = 0 \) ✓
Réponses : a) \( \vec{n} = (3, 4) \) ; b) \( 4x - 3y - 7 = 0 \) ; c) Vérifié


Exercice 2: ★ ★ ★ ★ ☆

Contexte géographique : Une station météorologique surveille une zone circulaire autour de sa position. Dans un système de coordonnées où l'unité représente 1 km, la station est située au point \( S(-2, 5) \) et sa portée de surveillance s'étend sur un rayon de 8 km.

Un avion se déplace en ligne droite selon la trajectoire d'équation \( x + 2y - 11 = 0 \). Le pilote souhaite savoir s'il va traverser la zone de surveillance et, si oui, à quelle distance minimale de la station il va passer.

Questions :
a) Écrivez l'équation du cercle représentant la zone de surveillance.
b) Calculez la distance minimale entre la station et la trajectoire de l'avion.
c) L'avion traverse-t-il la zone de surveillance ? Justifiez.

a) Équation du cercle de surveillance :
  1. Centre : \( S(-2, 5) \), Rayon : \( r = 8 \) km
  2. Équation : \( (x - (-2))^2 + (y - 5)^2 = 8^2 \)
  3. Soit : \( (x + 2)^2 + (y - 5)^2 = 64 \)
b) Distance minimale station-trajectoire :
  1. Trajectoire : \( x + 2y - 11 = 0 \), donc \( a = 1 \), \( b = 2 \), \( c = -11 \)
  2. Station : \( S(-2, 5) \)
  3. Distance = \( \frac{|a \cdot x_S + b \cdot y_S + c|}{\sqrt{a^2 + b^2}} \)
  4. Distance = \( \frac{|1(-2) + 2(5) + (-11)|}{\sqrt{1^2 + 2^2}} = \frac{|-2 + 10 - 11|}{\sqrt{5}} = \frac{|-3|}{\sqrt{5}} = \frac{3}{\sqrt{5}} = \frac{3\sqrt{5}}{5} \) km
  5. Valeur numérique : \( \frac{3\sqrt{5}}{5} \approx 1.34 \) km
c) Traversée de la zone :
  1. La distance minimale est \( \frac{3\sqrt{5}}{5} \approx 1.34 \) km
  2. Le rayon de surveillance est 8 km
  3. Comme \( 1.34 < 8 \), l'avion traverse bien la zone de surveillance
Réponses : a) \( (x + 2)^2 + (y - 5)^2 = 64 \) ; b) \( \frac{3\sqrt{5}}{5} \) km ; c) Oui, car la distance minimale < rayon


Exercice 3: ★ ★ ★ ★ ★

Contexte sportif : Sur un terrain de football américain représenté dans un repère orthonormé (unité : 1 yard), un joueur se trouve au point \( J(15, 25) \). Il veut lancer le ballon perpendiculairement à la ligne de touche représentée par la droite d'équation \( 2x - 3y + 18 = 0 \).

Pour analyser la stratégie, l'entraîneur veut connaître précisément où le ballon va toucher la ligne de touche, ainsi que la distance que le ballon va parcourir.

Questions :
a) Déterminez les coordonnées du point \( T \) où le ballon va toucher la ligne de touche.
b) Calculez la distance \( JT \) que le ballon va parcourir.
c) Écrivez l'équation cartésienne de la trajectoire du ballon.
d) Si le ballon doit parcourir au moins 10 yards pour être valide, ce lancer est-il réglementaire ?

a) Coordonnées du point T :
  1. Ligne de touche : \( 2x - 3y + 18 = 0 \), donc \( a = 2 \), \( b = -3 \), \( c = 18 \)
  2. Joueur : \( J(15, 25) \)
  3. Formules du projeté orthogonal :
  4. \( x_T = x_J - \frac{a(ax_J + by_J + c)}{a^2 + b^2} \)
  5. \( y_T = y_J - \frac{b(ax_J + by_J + c)}{a^2 + b^2} \)
  6. Calculons : \( ax_J + by_J + c = 2(15) + (-3)(25) + 18 = 30 - 75 + 18 = -27 \)
  7. Et : \( a^2 + b^2 = 2^2 + (-3)^2 = 4 + 9 = 13 \)
  8. \( x_T = 15 - \frac{2(-27)}{13} = 15 + \frac{54}{13} = \frac{195 + 54}{13} = \frac{249}{13} \)
  9. \( y_T = 25 - \frac{(-3)(-27)}{13} = 25 - \frac{81}{13} = \frac{325 - 81}{13} = \frac{244}{13} \)
b) Distance JT :
  1. Distance = \( \frac{|ax_J + by_J + c|}{\sqrt{a^2 + b^2}} = \frac{|-27|}{\sqrt{13}} = \frac{27}{\sqrt{13}} = \frac{27\sqrt{13}}{13} \) yards
  2. Valeur numérique : \( \frac{27\sqrt{13}}{13} \approx 7.49 \) yards
c) Équation de la trajectoire :
  1. La trajectoire passe par \( J(15, 25) \) et a pour vecteur normal \( (2, -3) \)
  2. Équation : \( 2(x - 15) + (-3)(y - 25) = 0 \)
  3. Développement : \( 2x - 30 - 3y + 75 = 0 \)
  4. Soit : \( 2x - 3y + 45 = 0 \)
d) Validité du lancer :
  1. Distance parcourue : \( \frac{27\sqrt{13}}{13} \approx 7.49 \) yards
  2. Distance minimale requise : 10 yards
  3. Comme \( 7.49 < 10 \), le lancer n'est pas réglementaire
Réponses : a) \( T\left(\frac{249}{13}, \frac{244}{13}\right) \) ; b) \( \frac{27\sqrt{13}}{13} \) yards ; c) \( 2x - 3y + 45 = 0 \) ; d) Non, distance insuffisante


Exercice 4: ★ ★ ★ ★ ☆

Contexte technologique : Une entreprise de télécommunications installe une antenne-relais dont la portée de transmission forme un cercle parfait. Les ingénieurs ont collecté les données suivantes : l'antenne émet un signal qui atteint les points \( A(2, 1) \), \( B(-1, 4) \) et \( C(5, 2) \) situés exactement à la limite de sa portée.

L'entreprise veut installer une seconde antenne au point \( D(3, -2) \) et souhaite savoir si cette position sera couverte par la première antenne. De plus, elle veut connaître l'équation de la zone de couverture pour optimiser l'implantation du réseau.

Questions :
a) Déterminez l'équation du cercle représentant la zone de couverture de l'antenne.
b) Identifiez le centre et le rayon de cette zone de couverture.
c) Le point \( D(3, -2) \) est-il dans la zone de couverture ? Justifiez votre réponse.
d) Calculez la distance entre le centre de la zone et le point D.

a) Équation du cercle :
  1. Soit l'équation générale : \( x^2 + y^2 + Dx + Ey + F = 0 \)
  2. Point A(2,1) : \( 4 + 1 + 2D + E + F = 0 \) ⟹ \( 2D + E + F = -5 \) ... (1)
  3. Point B(-1,4) : \( 1 + 16 - D + 4E + F = 0 \) ⟹ \( -D + 4E + F = -17 \) ... (2)
  4. Point C(5,2) : \( 25 + 4 + 5D + 2E + F = 0 \) ⟹ \( 5D + 2E + F = -29 \) ... (3)
  5. Résolvons le système :
  6. (1) - (2) : \( 3D - 3E = 12 \) ⟹ \( D - E = 4 \) ... (4)
  7. (3) - (1) : \( 3D + E = -24 \) ... (5)
  8. (4) + (5) : \( 4D = -20 \) ⟹ \( D = -5 \)
  9. De (4) : \( E = D - 4 = -5 - 4 = -9 \)
  10. De (1) : \( F = -5 - 2D - E = -5 - 2(-5) - (-9) = -5 + 10 + 9 = 14 \)
  11. Équation : \( x^2 + y^2 - 5x - 9y + 14 = 0 \)
b) Centre et rayon :
  1. Centre : \( \Omega\left(-\frac{D}{2}, -\frac{E}{2}\right) = \Omega\left(\frac{5}{2}, \frac{9}{2}\right) \)
  2. Rayon : \( r = \frac{1}{2}\sqrt{D^2 + E^2 - 4F} = \frac{1}{2}\sqrt{25 + 81 - 56} = \frac{1}{2}\sqrt{50} = \frac{5\sqrt{2}}{2} \)
c) Point D dans la zone :
  1. Substituons D(3,-2) dans l'équation :
  2. \( 3^2 + (-2)^2 - 5(3) - 9(-2) + 14 = 9 + 4 - 15 + 18 + 14 = 30 \)
  3. Comme \( 30 > 0 \), le point D est à l'extérieur du cercle
d) Distance centre-D :
  1. Distance = \( \sqrt{\left(3 - \frac{5}{2}\right)^2 + \left(-2 - \frac{9}{2}\right)^2} \)
  2. = \( \sqrt{\left(\frac{1}{2}\right)^2 + \left(-\frac{13}{2}\right)^2} = \sqrt{\frac{1}{4} + \frac{169}{4}} = \sqrt{\frac{170}{4}} = \frac{\sqrt{170}}{2} \)
Réponses : a) \( x^2 + y^2 - 5x - 9y + 14 = 0 \) ; b) Centre \( \left(\frac{5}{2}, \frac{9}{2}\right) \), rayon \( \frac{5\sqrt{2}}{2} \) ; c) Non, D est hors couverture ; d) \( \frac{\sqrt{170}}{2} \)


Exercice 5: ★ ★ ★ ★ ★

Contexte industriel : Une usine chimique dispose d'un système de sécurité qui surveille les fuites de gaz toxiques. Le détecteur principal est situé au point \( P(4, 6) \) et peut détecter des fuites dans un rayon de 12 mètres. Une canalisation rectiligne de gaz suit l'équation \( 3x + 4y - 36 = 0 \).

Les ingénieurs de sécurité veulent installer un second détecteur sur cette canalisation, au point le plus proche du détecteur principal, pour maximiser la couverture. Ils veulent aussi s'assurer que cette canalisation passe bien dans la zone de surveillance du détecteur principal.

Questions :
a) Déterminez les coordonnées du point \( Q \) sur la canalisation le plus proche du détecteur principal.
b) Calculez la distance \( PQ \).
c) La canalisation passe-t-elle dans la zone de surveillance du détecteur principal ?
d) Écrivez l'équation du cercle représentant la zone de surveillance.
e) Si on place le second détecteur en Q avec un rayon de surveillance de 8 mètres, les deux zones de surveillance se chevauchent-elles ?

a) Point Q le plus proche :
  1. Canalisation : \( 3x + 4y - 36 = 0 \), donc \( a = 3 \), \( b = 4 \), \( c = -36 \)
  2. Détecteur : \( P(4, 6) \)
  3. Q est le projeté orthogonal de P sur la canalisation
  4. \( ax_P + by_P + c = 3(4) + 4(6) - 36 = 12 + 24 - 36 = 0 \)
  5. \( a^2 + b^2 = 9 + 16 = 25 \)
  6. \( x_Q = 4 - \frac{3 \times 0}{25} = 4 \)
  7. \( y_Q = 6 - \frac{4 \times 0}{25} = 6 \)
  8. Le point P appartient déjà à la canalisation ! Donc \( Q = P = (4, 6) \)
b) Distance PQ :
  1. Comme \( Q = P \), la distance \( PQ = 0 \) mètre
c) Canalisation dans la zone de surveillance :
  1. La distance de P à la canalisation est 0 (P est sur la canalisation)
  2. Le rayon de surveillance est 12 mètres
  3. Comme \( 0 < 12 \), la canalisation passe dans la zone de surveillance
d) Équation du cercle de surveillance :
  1. Centre : \( P(4, 6) \), Rayon : 12 mètres
  2. Équation : \( (x - 4)^2 + (y - 6)^2 = 144 \)
e) Chevauchement des zones :
  1. Détecteur principal : centre P(4,6), rayon 12 m
  2. Second détecteur : centre Q(4,6), rayon 8 m
  3. Distance entre centres : \( PQ = 0 \) m
  4. Somme des rayons : \( 12 + 8 = 20 \) m
  5. Comme la distance entre centres (0) < somme des rayons (20), il y a chevauchement
  6. En fait, le second cercle est entièrement contenu dans le premier !
Réponses : a) \( Q(4, 6) \) ; b) 0 mètre ; c) Oui, entièrement ; d) \( (x - 4)^2 + (y - 6)^2 = 144 \) ; e) Oui, chevauchement total


Forum(s) associé(s)

L'Art de la Philosophie : Interprétations et Débats

08 Apr, 2016

Explorez comment l'art et la philosophie s'entrelacent pour questionner notre perception de la réalité et de l'esthétique.

Read more.

Voyage à Travers la Liberté : Concepts et Dilemmes

27 Jan, 2014

Plongez dans les débats philosophiques sur la liberté, ses implications éthiques et les défis contemporains qui l'entourent.

Read more.

La Quête de la Vérité : Philosophies et Perspectives

30 Feb, 2015

Découvrez les différentes approches philosophiques de la vérité et comment elles influencent notre compréhension du monde.

Read more.
Page: