À l'origine, je prévoyais de rédiger un article de blog sur le trafic de requêtes (request smuggling), une vulnérabilité liée à HTTP, mais regrouper l'explication du protocole et l'explication de la vulnérabilité dans un seul article est trop long.
Alors vulgarisons HTTP !
HTTP signifie HyperText Transfer Protocol (protocole de transfert hypertexte). HTTP est un protocole de communication utilisé pour échanger des données sur le Web.
HTTP fonctionne en tant que client/serveur. Voici une analogie rapide pour vous aider à comprendre.
Imaginons que dans un restaurant, le client envoie une demande au serveur du restaurant (le serveur) pour un plat particulier (une ressource web, par exemple une page) en utilisant le menu (la page web sur laquelle vous vous trouvez). Le serveur répond alors avec le plat demandé (la ressource).
![]() |
---|
Affaire de client/serveur |
Tout comme le client peut faire plusieurs demandes pour différents plats, le navigateur peut également faire des demandes pour différentes ressources, telles que des images, des pages web ou des vidéos. Le serveur répondra à chaque demande avec la réponse appropriée, tout comme un serveur de restaurant apporterait le plat demandé à la table.
De plus, tout comme un restaurant peut avoir différentes tables pour différents clients, un serveur web peut traiter de multiples demandes de différents clients en même temps, servant des ressources différentes à chaque client.
![]() |
---|
Multiples demandes |
Vous avez peut-être déjà entendu le terme STATELESS auparavant, mais vous ne comprenez pas nécessairement ce que cela signifie pour HTTP.
Prenons l'exemple d'une application de réservation de vols. Lorsqu'un utilisateur effectue une recherche de vols disponibles, le serveur renvoie une liste de résultats correspondant aux critères de recherche de l'utilisateur. Si l'utilisateur effectue une nouvelle recherche pour un vol différent, le serveur ne se souvient pas des résultats de la recherche précédente.
![]() |
---|
Exemple de nature Stateless |
En résumé, la nature "stateless" d'HTTP signifie que chaque demande est indépendante et ne conserve pas d'informations sur les demandes précédentes, ce qui permet une plus grande évolutivité et une optimisation des ressources du serveur.
Néanmoins, de nombreuses applications web fournissent un état, grâce aux cookies et à la gestion de session, tels que les paniers d'achats et les boutiques en ligne.
Un autre point que je voulais aborder était la différence entre les URL et les URI. Avant cet article, j'avais tendance à me confondre, alors je me suis dit que si c'est utile pour moi, cela pourrait aussi vous être utile !
Les URL et les URI sont des identificateurs utilisés pour localiser des ressources sur le Web.
![]() |
---|
Exemple d'URL |
La différence avec une URL est qu'une URI peut également identifier une ressource à l'aide d'un nom ou d'une adresse unique, même si la ressource n'est pas accessible en ligne.
Par exemple, le nom d'un livre peut être utilisé comme URI pour identifier ce livre, même s'il n'est pas en ligne.
![]() |
---|
Exemple d'URI |
OSI signifie Open System Interconnection (Interconnexion de Systèmes Ouverts) et est le modèle de référence pour la communication d'ordinateur à ordinateur.
Je ne vais pas revenir sur les 7 couches du modèle OSI, mais vous devriez savoir que HTTP se trouve sur la couche la plus élevée du modèle OSI, la couche d'application.
![]() |
---|
Modèle OSI |
99,9% du temps, HTTP utilise TCP/IP comme protocole de transport (contrairement à UDP).
Nous n'entrerons pas dans les détails du protocole TCP dans cet article, mais simplement, TCP définit comment les données sont formatées, puis envoyées de A à B.
Cependant, comme HTTP se trouve sur une couche supérieure à la couche de transport, il ne se soucie pas de tout ça. Pour HTTP, la seule chose qui compte est :
Je veux une ressource, le serveur m'envoie une réponse
Maintenant que nous avons couvert les bases, voyons ce qui constitue une demande HTTP, en commençant par le premier terme, les VERBES HTTP.
Les verbes HTTP, également appelés méthodes HTTP, sont utilisés pour indiquer l'action à effectuer sur une ressource lors d'une requête HTTP.
![]() |
---|
Exemple de GET |
![]() |
---|
Exemple de POST |
Ce sont les principaux verbes HTTP, d'autres existent, mais nous allons les survoler rapidement :
![]() |
---|
Exemple d'options |
![]() |
---|
Exemple de CONNECT |
Une fois que vous avez défini le verbe, vous devez indiquer au serveur quelle ressource vous souhaitez, comme vous pouvez le voir.
![]() |
---|
Chemin en rouge |
Une fois que vous avez choisi la ressource que vous souhaitez, vous devez indiquer au serveur quelle version d'HTTP vous souhaitez utiliser.
Aujourd'hui, la version HTTP 1.1 est la plus courante sur le Web, avec la version HTTP 2 en hausse.
L'histoire des versions HTTP pourrait être le sujet d'un article de blog complet, mais souvenez-vous simplement que dans :
![]() |
---|
Pipelining HTTP |
Les en-têtes HTTP sont des informations supplémentaires envoyées avec une requête ou une réponse HTTP. Ces en-têtes contiennent des informations telles que le type de contenu, l'encodage, la langue, le navigateur utilisé et d'autres informations pertinentes pour le traitement de la requête ou de la réponse.
Par exemple :
![]() |
---|
Exemple d'en-tête User-Agent |
Les en-têtes HTTP sont importants car ils permettent au serveur et au client de communiquer en détail sur les informations envoyées ou attendues. Cela permet une meilleure gestion des requêtes et des réponses, une meilleure compréhension des besoins du client et une meilleure sécurité en spécifiant certaines restrictions ou autorisations.
Maintenant que nous avons vu tout ce qui constitue une requête, passons à la réponse !
Une fois que votre demande a été envoyée, plusieurs réponses sont possibles. Ces réponses contiennent un code appelé le code de réponse HTTP.
Il s'agit d'un code à trois chiffres envoyé par un serveur HTTP pour indiquer le résultat d'une demande faite par un client.
Il existe cinq catégories de codes de réponse HTTP : 1xx, 2xx, 3xx, 4xx et 5xx.
network-protocols-run-the-internet | bytebytego
http-keep-alive-pipelining-multiplexing-and-connection-pooling | haproxy
Hypertext_Transfer_Protocol | wikipedia
HTTP | mozilla