Le protocole HTTP
Notions théoriques
Le protocole HTTP (HyperText Transfer Protocol) est le fondement de toute communication de données sur le Web.
Les requêtes HTTP
Lorsqu'un client (généralement un navigateur Web) envoie une requête HTTP à un serveur, le serveur envoie une réponse HTTP en retour.
Les requêtes HTTP sont composées de 4 parties :
- Méthode : Le type d'action que le client souhaite effectuer. Les plus courantes sont GET (récupérer des données) et POST (envoyer des données).
- URL : L'adresse où la requête est envoyée.
- En-têtes : Informations supplémentaires sur la requête ou la réponse.
- Corps : Les données réelles envoyées ou reçues.
Les méthodes HTTP définissent le type d'action que le client souhaite effectuer.
Les 2 méthodes les plus couramment utilisées sont GET et POST.
- GET : Cette méthode est utilisée pour récupérer des informations du serveur en utilisant une URL spécifique.
Par exemple, lorsque vous tapez une adresse de site Web dans votre navigateur, vous effectuez une requête GET. Les requêtes GET sont sans effet sur les ressources du serveur, elles ne modifient pas l'état du serveur. Elles sont idéales pour les actions de lecture seule où aucune donnée n'est modifiée sur le serveur.
- POST : Cette méthode est utilisée pour envoyer des données au serveur.
Par exemple, lorsque vous remplissez un formulaire sur un site Web et que vous appuyez sur "envoyer" ou "soumettre", vous effectuez généralement une requête POST. Les requêtes POST peuvent modifier l'état du serveur, par exemple en ajoutant une nouvelle information dans une base de données.
Une différence importante entre les 2 méthodes est :
- que les requêtes GET incluent toutes les informations dans l'URL,
- tandis que les requêtes POST envoient les informations dans le corps de la requête.
Cela signifie que les requêtes POST peuvent envoyer beaucoup plus d'informations que les requêtes GET, et ces informations peuvent être de types variés (pas seulement du texte).
Et comme les informations envoyées avec une requête POST ne sont pas visibles dans l'URL, cette méthode est plus sûre pour envoyer des informations sensibles, comme des mots de passe.
Les réponses HTTP
Les réponses HTTP incluent un code de statut qui indique si la requête a été réussie ou non :
- Par exemple, "200 OK" signifie que la requête a été traitée avec succès,
- tandis que "404 Not Found" signifie que la ressource demandée n'a pas été trouvée sur le serveur.
Un protocole sans état
Le protocole HTTP est un protocole sans état (stateless en anglais).
Cela signifie que chaque requête HTTP envoyée par un client HTTP (comme un navigateur Web ou un outil tel que Postman ou Curl) est traitée indépendamment des requêtes précédentes. Le serveur ne conserve aucune information entre les requêtes successives d'un même client.
Des requêtes indépendantes.
-
Sans état signifie que le serveur ne garde aucune mémoire des interactions précédentes avec le client. Par exemple, si un client envoie une requête HTTP pour une page Web, le serveur traite la requête, renvoie la réponse et "oublie" immédiatement la demande. La prochaine requête que le client envoie sera considérée comme entièrement nouvelle, sans lien avec les requêtes précédentes.
-
Indépendance des requêtes : Chaque requête contient toutes les informations nécessaires pour que le serveur puisse la traiter. Cela inclut l'URL demandée, les en-têtes HTTP, les cookies, et d'autres données, comme les paramètres de requête. Il n'y a pas de lien persistant entre les différentes requêtes HTTP dans un contexte sans état.
Imaginez que vous consultez une boutique en ligne :
- Vous envoyez une requête pour voir la page d'accueil.
- Ensuite, vous envoyez une requête pour voir un produit spécifique.
- Enfin, vous envoyez une requête pour ajouter cet article au panier.
Chaque requête est indépendante et le serveur ne garde aucune mémoire de la précédente. Pour maintenir la continuité de la session utilisateur (comme savoir ce qui est dans votre panier), des mécanismes supplémentaires comme les cookies, sessions, ou tokens (ex : JWT) sont utilisés.
Pourquoi HTTP est sans état ?
La nature sans état de HTTP rend le protocole plus simple et scalable. Cela permet aux serveurs de traiter chaque requête de manière autonome sans avoir à suivre l'historique des interactions de chaque client, ce qui réduit la charge de travail pour le serveur. Cependant, dans des applications complexes (comme les applications Web modernes), cette fonctionnalité sans état est compensée par l'utilisation de mécanismes supplémentaires (les sessions et les cookies).
Comment maintenir une continuité dans les actions des internautes avec un protocole sans état ?
Pour compenser cette nature sans état, divers mécanismes sont utilisés dans les applications Web pour suivre les utilisateurs et maintenir une continuité dans leurs actions :
-
Cookies : Le serveur envoie des cookies au client, qui sont stockés localement dans le navigateur. À chaque nouvelle requête, le client renvoie ces cookies, permettant au serveur de reconnaître l'utilisateur et de suivre son activité.
-
Sessions : Un serveur peut créer une session pour chaque utilisateur qui se connecte, et associer cette session à un identifiant unique stocké dans un cookie. Cela permet au serveur de maintenir des informations sur l'utilisateur tant que la session est active.
-
Tokens (jetons) : Dans certaines applications, des jetons d'authentification (comme JWT, JSON Web Tokens) sont utilisés pour permettre aux serveurs d'identifier les utilisateurs et de conserver un état entre les requêtes, sans réellement stocker de données côté serveur.
Exemple pratique
Prenons un exemple concret. Lorsque vous tapez http://www.example.com dans votre navigateur,
une requête HTTP est envoyée au serveur hébergeant www.example.com
.
-
La requête pourrait ressembler à ceci :
GET / HTTP/1.1
Host: www.example.com -
Le serveur répondra alors avec quelque chose comme :
HTTP/1.1 200 OK
Date: Wed, 24 Aug 2023 12:04:23 GMT
Content-Type: text/html; charset=UTF-8
<!DOCTYPE html>
<html>
<head>
<title>Exemple</title>
</head>
<body>
Bienvenue sur www.example.com!
</body>
</html>