Aller au contenu principal

📜 | Anatomie du protocole HTTP

info

Cette partie n'est pas Ă  apprendre par cƓur, mais elle constitue un Ă©lĂ©ment principal de la comprĂ©hension du monde du WEB. La comprĂ©hension des diffĂ©rents termes Ă©voquĂ©s est nĂ©cessaire.

Dans le cadre du dĂ©veloppement web, le protocole HTTP (HyperText Transfer Protocol) joue un rĂŽle central en permettant la communication entre les navigateurs web (clients) et les serveurs. Lorsqu'un utilisateur accĂšde Ă  une page web ou interagit avec une application en ligne, une sĂ©rie de requĂȘtes et rĂ©ponses HTTP sont Ă©changĂ©es entre le client et le serveur. Comprendre l’anatomie d'une requĂȘte HTTP est essentiel pour diagnostiquer des problĂšmes, optimiser des applications web, et dĂ©velopper des services API efficaces.

Les composantes d'une requĂȘte HTTP​

Une requĂȘte HTTP se divise en plusieurs parties distinctes, chacune ayant un rĂŽle spĂ©cifique.

Voici un diagramme pour faciliter la compréhension tout au long de l'explication :

Schéma du protocole HTTP

Ligne de requĂȘte (Request Line)​

La ligne de requĂȘte est la premiĂšre ligne de la requĂȘte HTTP. Elle contient trois informations clĂ©s :

  • MĂ©thode HTTP : elle spĂ©cifie l'action Ă  rĂ©aliser sur la ressource demandĂ©e. Les mĂ©thodes les plus courantes sont :

    • GET : pour rĂ©cupĂ©rer une ressource (lecture).
    • POST : pour envoyer des donnĂ©es au serveur (souvent pour crĂ©er ou mettre Ă  jour une ressource).
    • PUT : pour remplacer ou mettre Ă  jour une ressource existante.
    • DELETE : pour supprimer une ressource.
    • PATCH : pour mettre Ă  jour partiellement une ressource.
  • URI (Uniform Resource Identifier) : c’est l’adresse de la ressource demandĂ©e, souvent appelĂ©e chemin ou endpoint. Par exemple, /articles/42 fait rĂ©fĂ©rence Ă  l'article numĂ©ro 42.

  • Version du protocole HTTP : gĂ©nĂ©ralement HTTP/1.1 ou HTTP/2, cette information prĂ©cise quelle version du protocole est utilisĂ©e.

Exemple :

GET /articles/42 HTTP/1.1

En-tĂȘtes de requĂȘte (Headers)​

Les en-tĂȘtes de requĂȘte fournissent des informations supplĂ©mentaires sur la requĂȘte, telles que le type de contenu envoyĂ©, les autorisations nĂ©cessaires, ou encore des informations sur le client. Chaque en-tĂȘte est une paire clĂ©-valeur.

Les en-tĂȘtes courants incluent :

  • Host : l’adresse du serveur (ex : www.example.com).
  • User-Agent : informations sur le client, comme le type de navigateur utilisĂ©.
  • Accept : spĂ©cifie le type de contenu que le client peut accepter (ex : text/html, application/json).
  • Content-Type : indique le type de donnĂ©es envoyĂ©es dans le corps de la requĂȘte (utile pour POST ou PUT, ex : application/json).
  • Authorization : contient les informations d'authentification.

Exemple :

Host: www.example.com
User-Agent: Mozilla/5.0
Accept: application/json

Corps de la requĂȘte (Body)​

Le corps de la requĂȘte est une partie optionnelle qui contient les donnĂ©es envoyĂ©es au serveur, par exemple lors d'une requĂȘte POST ou PUT. Ces donnĂ©es peuvent ĂȘtre de divers formats (JSON, XML, formulaire encodĂ©, etc). Pour une requĂȘte GET, le corps de la requĂȘte est gĂ©nĂ©ralement absent car les donnĂ©es sont passĂ©es dans l'URI (via des paramĂštres de requĂȘte).

Exemple (dans une requĂȘte POST) :

{
"title": "Nouvel Article",
"content": "Contenu de l'article..."
}

Le cycle d'une requĂȘte HTTP​

Lorsque le client (le navigateur ou une application) envoie une requĂȘte HTTP, voici les Ă©tapes principales qui se dĂ©roulent :

  1. L'utilisateur interagit avec l'interface (par exemple en cliquant sur un lien ou un bouton de soumission de formulaire).
  2. Le navigateur envoie une requĂȘte HTTP au serveur spĂ©cifiĂ©, contenant la ligne de requĂȘte, les en-tĂȘtes et, dans certains cas, un corps de requĂȘte.
  3. Le serveur reçoit la requĂȘte, l'interprĂšte, et effectue les actions nĂ©cessaires (rĂ©cupĂ©rer des donnĂ©es depuis une base, effectuer des calculs, etc.).
  4. Le serveur envoie une rĂ©ponse HTTP au client, contenant les donnĂ©es demandĂ©es ou un message d’erreur si la requĂȘte ne peut ĂȘtre traitĂ©e.
  5. Le navigateur affiche le résultat à l'utilisateur sous forme de page web, d'alerte, ou toute autre représentation.

Exemple complet d'une requĂȘte HTTP​

Prenons un exemple oĂč un utilisateur cherche Ă  rĂ©cupĂ©rer un article depuis un serveur via une requĂȘte GET.

RequĂȘte HTTP​

GET /articles/42 HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: application/json

Ici, le client demande l'article numĂ©ro 42 au serveur www.example.com. Le client indique qu'il souhaite recevoir les donnĂ©es au format JSON grĂące Ă  l'en-tĂȘte Accept.

RĂ©ponse HTTP du serveur​

En retour, le serveur pourrait répondre avec :

HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 126

{
"id": 42,
"title": "Nouvel Article",
"content": "Voici le contenu de l'article."
}

Dans cet exemple :

  • Le code de statut 200 OK signifie que la requĂȘte a rĂ©ussi.
  • Le type de contenu est spĂ©cifiĂ© comme application/json, ce qui correspond Ă  la demande du client.
  • Le corps de la rĂ©ponse contient les dĂ©tails de l'article en format JSON.

Les mĂ©thodes HTTP les plus courantes​

Les méthodes HTTP, également appelées verbes HTTP, spécifient le type d'action à effectuer sur une ressource donnée. Voici un aperçu des méthodes les plus utilisées :

  • GET : UtilisĂ© pour rĂ©cupĂ©rer des informations d'une ressource. Une requĂȘte GET ne devrait pas modifier l'Ă©tat de la ressource.

  • POST : UtilisĂ© pour envoyer des donnĂ©es au serveur, par exemple pour crĂ©er une nouvelle ressource. Il est souvent utilisĂ© pour soumettre des formulaires ou des donnĂ©es JSON.

  • PUT : UtilisĂ© pour remplacer entiĂšrement une ressource existante avec les donnĂ©es fournies. Il s'agit d'une opĂ©ration idempotente, ce qui signifie que l'application rĂ©pĂ©tĂ©e de la requĂȘte ne modifie pas davantage la ressource.

  • PATCH : Semblable Ă  PUT, mais il est utilisĂ© pour mettre Ă  jour partiellement une ressource.

  • DELETE : UtilisĂ© pour supprimer une ressource sur le serveur.

En-tĂȘtes importants dans une requĂȘte HTTP​

Certains en-tĂȘtes jouent un rĂŽle important dans le traitement des requĂȘtes HTTP :

  • Cache-Control : GĂšre le comportement de mise en cache des ressources. Par exemple, il peut indiquer au navigateur s’il doit stocker une copie de la ressource et pendant combien de temps.

  • Authorization : UtilisĂ© pour transmettre des informations d'authentification, comme un jeton d'accĂšs dans les services sĂ©curisĂ©s.

  • Cookie : UtilisĂ© pour stocker et envoyer des informations liĂ©es Ă  une session utilisateur ou Ă  des prĂ©fĂ©rences sur le site web.

Exemple complet​

Voici un exemple plus complexe pour savoir Ă  quoi peut ressembler une requĂȘte HTTP dans un cas rĂ©el :

POST /api/v1/users/create?notify=true&admin=false HTTP/1.1
Host: api.example.com
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.e30.m5uXnxMlfz_mxCzMzRZZHY
Content-Type: application/json
Accept: application/json
User-Agent: Firefox/1.0.0
Cache-Control: no-cache
Pragma: no-cache
Content-Length: 245

{
"firstName": "John",
"lastName": "Doe",
"email": "john.doe@example.com",
"password": "SuperSecretPassword",
"roles": ["user", "editor"],
}
  • MĂ©thode HTTP : POST est utilisĂ© ici pour crĂ©er une nouvelle ressource (un utilisateur).
  • Chemin de l'API : /api/v1/users/create indique l'URL du endpoint.
    • ParamĂštres de requĂȘte : ?notify=true&admin=false prĂ©cise que l'utilisateur doit ĂȘtre notifiĂ© et qu'il ne sera pas créé en tant qu'administrateur.
  • En-tĂȘtes HTTP (Headers) :
    • Authorization: Bearer est utilisĂ© pour envoyer un token JWT (JSON Web Token) pour l'authentification.
    • Content-Type: application/json indique que le corps de la requĂȘte est au format JSON.
    • Accept: application/json signifie que la rĂ©ponse attendue doit Ă©galement ĂȘtre au format JSON.
    • User-Agent spĂ©cifie l'application qui envoie la requĂȘte.
    • Cache-Control et Pragma dĂ©sactivent la mise en cache.
  • Corps de la requĂȘte (Body) : Un JSON qui contient les informations de l'utilisateur Ă  crĂ©er.

Cette requĂȘte va ensuite ĂȘtre traitĂ©e par le back-end qui disposera alors de toutes ces informations.

Codes HTTP​

La rĂ©ponse d'une requĂȘte arrive avec un code de retour allant de 100 Ă  527. Le premier chiffre est utilisĂ© pour spĂ©cifier une des cinq catĂ©gories de rĂ©ponse :

  • 1XX : information
  • 2XX : succĂšs
  • 3XX : redirection
  • 4XX : erreur client
  • 5XX : erreur serveur

Les codes les plus courants sont :

  • 200 : succĂšs de la requĂȘte
  • 201 : succĂšs avec crĂ©ation de ressource
  • 301 et 302 : redirection, respectivement permanente et temporaire
  • 401 : utilisateur non authentifiĂ©
  • 403 : accĂšs refusĂ©
  • 404 : ressource non trouvĂ©e
  • 500, 502 et 503 : erreurs serveur

Voir la liste complĂšte des codes HTTP

SĂ©curitĂ© avec HTTPS​

HTTPS (Hypertext Transfer Protocol Secure) est la combinaison du HTTP avec une couche de chiffrement TLS. HTTPS permet au visiteur de vérifier l'identité du site web auquel il accÚde, grùce à un certificat d'authentification émis par une autorité tierce, réputée fiable.

La TLS (ou SSL) fonctionne suivant un mode client-serveur. Il permet de satisfaire les objectifs de sécurité suivants :

  • L'authentification du serveur
  • La confidentialitĂ© des donnĂ©es Ă©changĂ©es (ou session chiffrĂ©e)
  • L'intĂ©gritĂ© des donnĂ©es Ă©changĂ©es
  • De maniĂšre optionnelle, l'authentification du client (mais dans la rĂ©alitĂ© celle-ci est souvent assurĂ©e par la couche applicative)

Pour aller plus loin​

Le protocole HTTP est un membre de la famille TCP/IP. TCP/IP est une famille de protocoles de communication utilisés pour connecter des systÚmes informatiques dans un réseau. Il est nommé d'aprÚs deux des protocoles de la famille: Transmission Control Protocol (TCP) et Internet Protocol (IP ; oui, comme les IPv4 et IPv6).

Bien que TCP/IP et HTTP ne soient pas parfaitement identiques, le diagramme de sĂ©quence suivant permet de mieux comprendre ce qu'il se passe derniĂšre une seule requĂȘte HTTP.

Diagramme séquence de TCP/IP

X

Graph View