đ | Anatomie du protocole HTTP
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 :
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
ouHTTP/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
ouPUT
, 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 :
- L'utilisateur interagit avec l'interface (par exemple en cliquant sur un lien ou un bouton de soumission de formulaire).
- 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.
- 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.).
- 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.
- 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.
- ParamĂštres de requĂȘte :
- 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
etPragma
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.