Le protocole HTTP

To the non-french speaker, note that you can translate the articles using the Google Trad widget situated at the bottom of all pages.


Le protocole HTTP (Hyper Text Transfer Protocol) est un protocole de communication client-serveur. C’est un protocole de la couche application dont les utilisateurs les plus connus sont les navigateurs tels que Chrome, Firefox, Opéra, IE etc…

Ici nous allons voir comment fonctionne ce protocole. Pour cela nous allons nous intéresser à la composition de ces trames.

Le protocole HTTP est basé sur un schéma client-serveur qui fonctionne par l’envoie/réponse de requêtes. Par exemple si je veux accéder à la page index.php d’un site quelconque je vais devoir envoyer une requête GET :

Capture d’écran du 2019-09-13 10-08-20.png

Dans la requête du client nous avons plusieurs informations : le site à contacter, la méthode de requête, l’URI, la version du protocole, le type MIME, les informations sur le client et le contenu de la requête. Le serveur va répondre avec un code de statut, le type MIME, des métas informations et potentiellement un contenu.

HTTP repose sur le protocole TCP/IP et utilise par défaut le port 80 (443 pour du HTTPS).

Chaque trame HTTP requête HTTP possède plusieurs headers qui contiennent de nombreux paramètres. Plusieurs d’entre eux sont communs tandis que certains sont spécifiques aux trames « requête’ et aux trames « réponse ».

I/Les paramètres communs

Version HTTP :

La version d’HTTP est une chaine de caractère : « HTTP/ » suivi du numéro de la version 0.9 ou 1.0 ou 1.1. C’est la première ligne du header.

URI :

Une URI c’est une Uniform Ressource Identifier. Cela sert à identifier une ressource. Par exemple votre identifiant national permet de vous identifier vous en tant que personnes. Eh bien c’est le même principe sur Internet. Il existe cependant deux types d’URI :

-Une URL : Uniform Ressource Locator qui permet d’identifier une ressource sur le réseau et de proposer une représentation de cette ressource. En effet avec cette URL : www://monsite.fr vous avez accès à l’hébergeur du site (le serveur, via la résolution DNS) mais aussi à la page web (html) du site que vous pouvez consulter.

-Une URN : Uniform Ressource Name identifie une ressource par son nom et à l’inverse de URL ne permet pas de savoir où la ressource est localisée et ne permet pas non plus de la consulter.

URL et URN sont donc deux sous catégories d’URI.

La date :

Elle est disponible sous trois formats

Dim, 06 Nov 1994 08:49:37 GMT
Dimanche, 06-Nov-94 08:49:37 GMT
Dim Nov 6 08:49:37 1994

La première forme étant la forme standard.

Delta second :

Valeur numérique qui informe sur la durée entre la réception de la requête et la lecture. (peu utilisé)

Character sets :

Est utilisé afin de spécifier quelle méthode est utilisée afin d’encoder une suite de bits en caractère. Par exemple le character set par défaut d’HTML5 est le UTF-8 (on le retrouve écrit sous cette forme : charset=UTF-8).

Content Codings :

Indique si la requête a été compressée et si oui par quelle méthode. Plusieurs méthodes sont disponibles :

gzip : compression faites par le programme gnu zip
compress : compression faites par le programme compress d’UNIX
deflate : algorithme de compression utilisé dans PKZIP

Transfer Codings :

Indique si le contenu de la requête à été compressé ou non. Chunked indique que le serveur et le client peuvent envoyer des données sans avoir à connaitre la taille totale des données à envoyer. Si votre site apparaît bout par bout à intervalle de temps régulier c’est que le transfer codings utilise chunked.

Media Types :

Le type de données envoyées. C’est le type MIME. Si c’est une page HTML alors le Media Type sera « text/plain », si c’est un gif alors on aura « image/gif » et si c’est un script PHP on aura « application/octet-stream ».

Language Tag :

Indique la langue utilisée dans le contenu de la trame.

Voilà les paramètres les plus souvent utilisés. Il y en a d’autre comme par exemple le Strict Transport Security qui est l’implémentation du HSTS.

Intéressons-nous maintenant aux message HTTP.

II/Les messages HTTP

Il y a deux types de messages HTTP, les requêtes (client vers serveur) et les réponses (serveur vers client). Dans les deux cas l’architecture des messages est identique et ils ont plus ou moins les mêmes champs header.

Les requêtes :

Pour accéder à une page web on va faire une requête. Ce qui est intéressant ici c’est que la requête peut être faite selon plusieurs méthodes. Les méthodes les plus utilisées sont POST et GET mais il existe aussi OPTIONS,  HEAD, PUT, DELETE, TRACE et CONNECT. Selon les serveurs ces méthodes peuvent être utilisables. Et suivant la méthode utilisée les serveurs peuvent réagir différemment.

Certains serveurs, s’ils sont mal configurés peuvent très mal réagir à une requête HEAD, OPTIONS ou encore DELETE. Il est donc nécessaire bien tester toutes les méthodes HTTP puisque, suivant les cas, cela pourra mener à de jolies surprises !

Ensuite on retrouvera bien évidemment le champ Host qui détermine qui nous cherchons à joindre ainsi que le champ user agent qui indique au serveur quel navigateur a été utilisé afin d’accéder au serveur.

Les réponses :

La première ligne de la réponse est le code de statut. On y retrouve la version HTTP utilisée, ainsi qu’un code compris entre 100 et 505. Le protocole HTTP dispose de nombreux codes de statut qui permettent d’indiquer le résultat d’une requête. Il existe cinq catégories de code : informations (sur la requête), succès (la requête à été validée par le serveur), redirection (il faut procéder à de nouvelles actions), erreur client (la requête n’a pas été comprise ou ne peut pas être validé) et erreur serveur (le serveur n’a pas pu validé la requête).

Voici un tableau récapitulatif des codes de statut :

Information :

Code Message Signification
100 Continue Attente de la suite de la requête.
101 Switching Protocols Acceptation du changement de protocole.
102 Processing WebDAV : Traitement en cours (évite que le client dépasse le temps d’attente limite).

Succès :

Code Message Signification
200 OK Requête traitée avec succès.
201 Created Requête traitée avec succès et création d’un document.
202 Accepted Requête traitée, mais sans garantie de résultat.
203 Non-Authoritative Information Information retournée, mais générée par une source non certifiée.
204 No Content Requête traitée avec succès mais pas d’information à renvoyer.
205 Reset Content Requête traitée avec succès, la page courante peut être effacée.
206 Partial Content Une partie seulement de la ressource a été transmise.
207 Multi-Status WebDAV : Réponse multiple.
210 Content Different WebDAV : La copie de la ressource côté client diffère de celle du serveur (contenu ou propriétés).
226 IM Used RFC 32293 : Le serveur a accompli la requête pour la ressource, et la réponse est une représentation du résultat d’une ou plusieurs manipulations d’instances appliquées à l’instance actuelle.

Redirection :

Code Message Signification
300 Multiple Choices L’URI demandée se rapporte à plusieurs ressources.
301 Moved Permanently Document déplacé de façon permanente.
302 Moved Temporarily Document déplacé de façon temporaire.
303 See Other La réponse à cette requête est ailleurs.
304 Not Modified Document non modifié depuis la dernière requête.
305 Use Proxy La requête doit être ré-adressée au proxy.
306 (aucun) Code utilisé par une ancienne version de la RFC 26164, à présent réservé.
307 Temporary Redirect La requête doit être redirigée temporairement vers l’URI spécifiée.
308 Permanent Redirect La requête doit être redirigée définitivement vers l’URI spécifiée.
310 Too many Redirects La requête doit être redirigée de trop nombreuses fois, ou est victime d’une boucle de redirection.

Erreur client :

Code Message Signification
400 Bad Request La syntaxe de la requête est erronée.
401 Unauthorized Une authentification est nécessaire pour accéder à la ressource.
402 Payment Required Paiement requis pour accéder à la ressource.
403 Forbidden Le serveur a compris la requête, mais refuse de l’exécuter. Contrairement à l’erreur 401, s’authentifier ne fera aucune différence. Sur les serveurs où l’authentification est requise, cela signifie généralement que l’authentification a été acceptée mais que les droits d’accès ne permettent pas au client d’accéder à la ressource.
404 Not Found Ressource non trouvée.
405 Method Not Allowed Méthode de requête non autorisée.
406 Not Acceptable La ressource demandée n’est pas disponible dans un format qui respecterait les en-têtes « Accept » de la requête.
407 Proxy Authentication Required Accès à la ressource autorisé par identification avec le proxy.
408 Request Time-out Temps d’attente d’une requête du client écoulé.
409 Conflict La requête ne peut être traitée en l’état actuel.
410 Gone La ressource n’est plus disponible et aucune adresse de redirection n’est connue.
411 Length Required La longueur de la requête n’a pas été précisée.
412 Precondition Failed Préconditions envoyées par la requête non vérifiées.
413 Request Entity Too Large Traitement abandonné dû à une requête trop importante.
414 Request-URI Too Long URI trop longue.
415 Unsupported Media Type Format de requête non supporté pour une méthode et une ressource données.
416 Requested range unsatisfiable Champs d’en-tête de requête « range » incorrect.
417 Expectation failed Comportement attendu et défini dans l’en-tête de la requête insatisfaisante.
418 I’m a teapot « Je suis une théière ». Ce code est défini dans la RFC 23245 datée du premier avril 1998, Hyper Text Coffee Pot Control Protocol.
421 Bad mapping / Misdirected Request La requête a été envoyée à un serveur qui n’est pas capable de produire une réponse (par exemple, car une connexion a été réutilisée).
422 Unprocessable entity WebDAV : L’entité fournie avec la requête est incompréhensible ou incomplète.
423 Locked WebDAV : L’opération ne peut avoir lieu car la ressource est verrouillée.
424 Method failure WebDAV : Une méthode de la transaction a échoué.
425 Unordered Collection WebDAV RFC 36486. Ce code est défini dans le brouillon WebDAV Advanced Collections Protocol, mais est absent de Web Distributed Authoring and Versioning (WebDAV) Ordered Collections Protocol.
426 Upgrade Required RFC 28177 Le client devrait changer de protocole, par exemple au profit de TLS/1.0.
428 Precondition Required RFC 65858 La requête doit être conditionnelle.
429 Too Many Requests RFC 65859 Le client a émis trop de requêtes dans un délai donné.
431 Request Header Fields Too Large RFC 658510 Les entêtes HTTP émises dépassent la taille maximale admise par le serveur.
449 Retry With Code défini par Microsoft. La requête devrait être renvoyée après avoir effectué une action.
450 Blocked by Windows Parental Controls Code défini par Microsoft. Cette erreur est produite lorsque les outils de contrôle parental de Windows sont activés et bloquent l’accès à la page.
451 Unavailable For Legal Reasons Ce code d’erreur indique que la ressource demandée est inaccessible pour des raisons d’ordre légal11,12.
456 Unrecoverable Error WebDAV : Erreur irrécupérable.

Erreur serveur :

Code Message Signification
500 Internal Server Error Erreur interne du serveur.
501 Not Implemented Fonctionnalité réclamée non supportée par le serveur.
502 Bad Gateway ou Proxy Error Mauvaise réponse envoyée à un serveur intermédiaire par un autre serveur.
503 Service Unavailable Service temporairement indisponible ou en maintenance.
504 Gateway Time-out Temps d’attente d’une réponse d’un serveur à un serveur intermédiaire écoulé.
505 HTTP Version not supported Version HTTP non gérée par le serveur.
506 Variant Also Negotiates RFC 229514 : Erreur de négociation. Transparent content negociation.
507 Insufficient storage WebDAV : Espace insuffisant pour modifier les propriétés ou construire la collection.
508 Loop detected WebDAV : Boucle dans une mise en relation de ressources (RFC 584215).
509 Bandwidth Limit Exceeded Utilisé par de nombreux serveurs pour indiquer un dépassement de quota.
510 Not extended RFC 277416 : la requête ne respecte pas la politique d’accès aux ressources HTTP étendues.
511 Network authentication required RFC 658517 : Le client doit s’authentifier pour accéder au réseau. Utilisé par les portails captifs pour rediriger les clients vers la page d’authentification.

Plusieurs headers sont aussi ajoutés comme par exemple le header Location utilisé pour la redirection. On retrouve aussi la version du serveur ainsi que les cookies créés.

III/Les méthodes de connexion

A l’origine, les connections n’étaient que temporaires. Cela veut dire que si je voulais me connecter à un site deux fois en 5 minutes alors je devais envoyer deux demandes de connexion. A l’échelle mondiale cela bouchait considérablement le trafic sur le réseau. Donc de nouvelles méthodes de connexion ont été implémenté. Pour savoir si la connexion est continue ou pas il suffit de vérifier le header Connection. Si sa valeur est « keep alive » alors la connexion est continue, si sa valeur est « close » alors la connexion est fermée juste après l’envoi de la réponse.


Voila un court résumé de ce que l’on peut trouver dans les header. Si vous voulez plus d’informations je vous laisse lire le RFC2616. Je voulais faire cet article afin de vous montrer que l’on peut récupérer un nombre assez important d’informations en lisant bien les header des trames HTTP. Par exemple connaitre la version du serveur est un gros plus pour un attaquant s’il désire s’introduire dessus. De même il y a quelques vecteurs d’attaques utilisables et identifiable via l’analyse de ces headers.

Pour la partie pratique je vous invite à vous rendre sur l’article « Le protocole HTTP : la pratique ». Je vous montrerais quelques manipulations de header intéressantes.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Google

Vous commentez à l'aide de votre compte Google. Déconnexion /  Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s