Activité À la découverte de HTTP

Situation

Vous êtes employé par une entreprise de développement et vous n’avez pas d’expérience dans le développement d’applications Web. Vous avez néanmoins été récemment affecté à un projet d’application web. Dans le cadre de ce projet, vous avez été chargé de la réalisation des tests fonctionnels de la partie serveur. Puisqu’il s’agit de test de type « boîte noire », vous n’avez pas accès au code de l’application. Vous ne pouvez voir et contrôler que les messages que s’échangent le client et le serveur HTTP. Pour comprendre ce qui passe, vous devez connaître les règles qui gouvernent leurs conversations : le protocole HTTP.

Consigne

Dans un premier temps, on vous demande d’effectuer une capture des paquets qui transitent par l’interface du serveur pendant que vous naviguez sur un site composé de quelques pages HTML. Dans un second temps, on vous demande d’analyser les échanges entre le client HTTP (le navigateur) et le serveur HTTP en ouvrant le résultat de la capture dans l’analyseur de paquets Wireshark. Enfin, on vous demande de répondre à un certain nombre de questions à propos de ces échanges.

Objectifs

À la fin de ce travail, vous devez :

  • Connaître les notions de ligne de requête (request line) et de ligne de réponse (response line).
  • Connaître la notion d'en-tête HTTP (HTTP header).
  • Connaître la notion de contenu d'une requête ou d'une réponse.
  • Connaître les principaux en-têtes d'un requête et d'une réponse.
  • Connaître deux manières dont la taille du contenu est spécifié dans le protocole HTTP.
  • Connaître la notion d'URL.
  • Être capable de décrire une conversation entre un client et un serveur HTTP.

Résultat attendu

Le compte rendu de votre travail et les réponses aux questions dans une section de votre rapport de module.

Ressources

Documents :

Logiciel :

  • Vagrant,
  • Visual Studio Code, git et maven
  • OpenJDK 11 ou supérieur
  • Wireshark
  • Chrome et Firefox

Mise en route

Installation du site web à analyser

Le site web que devez utiliser pour cette activité est hébergé dans une machine virtuelle qui doit être installée sur votre ordinateur à l’aide de l’outil Vagrant. Pour cela, commencez par créer, sur un disque local, un répertoire dans lequel vous stockerez tous les projets du module. Ouvrez ensuite une fenêtre de terminal sans privilège, rendez-vous dans ce répertoire et lancez la commande suivante :

1
git clone https://gitlab.epai-ict.ch/m133/demo-app-vm.git

Cette commande doit avoir créé un nouveau répertoire nommé demo-app-vm contenant un fichier nommé Vagrantfile. Il s’agit d’un script Vagrant pour la création de la machine virtuelle. Assurez-vous d’être connecté au réseau local de l’école (n’utilisez pas la 4g) et rendez-vous dans le répertoire demo-app-vm et lancez la commande ci-dessous pour créer la machine virtuelle dans VirtualBox (l’exécution de la commande prend quelques minutes).

1
vagrant up

Effecturer la capture du trafic HTTP

Lorsque l’exécution de la commande est terminée, toujours dans le répertoire demo-app-vm, lancez la commande ci-dessous pour ouvrir une session ssh sur la machine virtuelle.

1
vagrant ssh

Les commandes que vous tapez dans la fenêtre de terminal sont maintenant exécutées par la machine virtuelle. Lancez la commande ci-après pour démarrer la capture des paquets. Le programme tcpdump capture tout les paquets tcp qui passent par les interfaces de la machine virtuelle dans le fichier capture.pcap (le répertoire /vagrant correspond au répertoire demo-app-vm de votre machine). Laissez la fenêtre du terminal ouverte et poursuivez.

1
sudo tcpdump -i any -w /vagrant/capture.pcap "tcp port 7000"

Ouvrez un navigateur et saisissez l’URL http://localhost:7000 dans la barre d’adresse, puis parcourez les différentes pages du site. Lorsque vous avez affiché au moins une fois chaque page, fermez le navigateur, revenez dans la fenêtre du terminal et tapez la combinaison de touches ctrl-c pour interrompre la capture.

Lancez Wireshark et, avec le menu file -> open, ouvrez le fichier caputre.pcap qui se trouve dans votre répertoire demo-app-vm. Cliquez enfin le menu Analyse -> Follow -> TCP Stream pour ouvrir une fenêtre contenant les échanges entre le navigateur et le serveur HTTP de la machine virtuelle.

Parcourez une première fois cette conversation pour essayer de voir le lien avec ce que vous avez fait dans le navigateur, puis répondez aux questions. Vous devez justifier chacune de vos réponses, ou en d’autres termes, vous devez expliquer comment vous savez que la réponse que vous donnez est correcte.

Questions

  1. Quelle est la signification des deux couleurs ?
  2. Quelles sont les trois informations contenues dans la première ligne d’un message de requête ?
  3. Comment appelle-t-on la première ligne d’un message de requête ?
  4. À quoi sert la ligne vide à la fin de chaque requête ?
  5. À quoi sert l’en-tête Host d’un message de requête ? Que contient-il ?
  6. À quoi sert l’en-tête Accept d’un message de requête ? Que contient-il ?
  7. Que représente un URI ou un URL ?
  8. Où se trouve l’URI (URL) dans un message de requête ? L’information se trouve-t-elle à un seul endroit ?
  9. Quelles sont les trois informations contenues dans la première ligne d’un message de réponse ?
  10. Comment appelle-t-on la première ligne d’un message de réponse ?
  11. À quoi sert l’en-tête Content-Type d’un message de réponse ?
  12. À quoi sert l’en-tête Content-Length d’un message de réponse ?
  13. Pourquoi y a-t-il des messages de réponse qui n’ont pas d’en-tête Content-Length ? Qu’est-ce qui remplace cet en-tête ?
  14. Comment le contenu d’un message réponse est-il séparé des en-têtes ?
  15. Que se passe-t-il lorsque le serveur ne trouve la ressource qui correspond au chemin à l’URI ? Est-ce que, dans ce cas, la réponse fournie par le serveur est une réponse HTTP valide ?
  16. Est-il vrai que l’URI (URL) d’une ressource permet de localiser précisément l’endroit où se trouve cette ressource ? Développez.
  17. Est-il vrai que le HTTP permet de transférer des ressources ? Développez.
  18. Est-il vrai que le HTTP traite différemment les ressources statiques et les ressources dynamique ? Développez.