Un peu d’histoire
HTTP (HyperText Transfer Protocol) est un protocole de communication client-serveur développé pour le World Wide Web par Tim Berners Lee et son équipe entre 1989 et 1991.
HTTPS, une version sécurisée de HTTP est implémentée par Netscape communications 4 ans plus tard en 1994.
Ce protocole permet des échanges de fichier via le réseaux internet grâce aux protocoles réseaux TCP (Transmission Control Protocol) et IP (Internet Protocol).
Dans sa version initiale, HTTP ne permettait que le transport de fichier HTML. Par la suite, l’ajout de l’en-tête “Content-Type” permet de transporter d’autres types de fichier. Vous pouvez retrouver cette liste ici : https://developer.mozilla.org/fr/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types
Initialement, HTTPS s’appuyait sur le protocole de sécurité SSL (Secure Sockets Layer) qui assure la confidentialité, l’authentification et l’intégrité des communications sur Internet.
Le principe est simple, on encrypte les données afin d’éviter toutes interceptions malveillantes lors du transfert et on décrypte grâce à un certificat SSL. SSL deviendra par la suite TSL (Transport Layer Security).
À ces débuts, HTTPS était principalement utilisé pour les sites E-Commerce, mais très vite, l’émergence d’acteur mal intentionné récoltant de nombreuses données personnelles sur Internet à accéléré le passage de la majorité des sites sur Internet à utiliser le protocol HTTPS.
Le modèle qui sera majoritairement utilisé pour l’utilisation de HTTP est le modèle REST (Representational state transfer). Aujourd’hui la plupart des sites web exposant des données repose sur des API REST. REST c’est une façon d’utiliser HTTP, qui a permis de poser un standard sur la conception des applications web ainsi que l’exploitation des données.
Si vous voulez en savoir plus sur REST, voici le papier de thèse de Roy Fielding qui pose les fondements du standard : https://ics.uci.edu/~fielding/pubs/dissertation/fielding_dissertation.pdf
Comment ça marche ?
HTTP est un protocole client serveur. Chaque requête est initiée par le client (aussi appelé agent d’utilisation) qui est la quasi totalité des cas le navigateur web.
Pour afficher une page web, le navigateur va effectuer une succession de requêtes HTTP. Dans un premier temps, le navigateur récupère le document HTML de la page, s’en suit la récupération des scripts et du style (CSS).
Au cours de la durée de vie de cette page, les scripts peuvent effectuer des requêtes HTTP pour récupérer du contenu supplémentaire.
Les liens hypertextes sont une partie des pages web. Ils permettent de naviguer entre les différentes pages présentes sur Internet. Lorsqu’un utilisateur clique sur un lien hypertexte, le navigateur envoie une requête HTTP pour récupérer cette dernière et recommence les étapes décrites ci-dessus.
Communication client / serveur via HTTP
Voici les étapes de connexion d’un client vers un serveur :
1) Le client ouvre un canal de communication TCP vers le serveur.
2) Il envoie un message HTTP. (Avant HTTP/2 les messages étaient lisibles par des humains, à partir de HTTP/2 les messages sont encodé en binaires les rendant illisible par un humain mais permettant de faciliter leur traitement).
3) Le client reçoit une réponse HTTP du serveur et la lit.
4) Le client peut soit fermer la connexion, soit réutilisé la connexion pour les requêtes suivantes.
Messages HTTP
Il existe deux types de messages HTTP : les requêtes et les réponses
Requête
Voici un exemple de message de requête HTTP sur l’API Pokémon
Voici les éléments que l’on retrouve dans une requête HTTP :
Un verbe HTTP permettant d’indiquer l’action souhaité sur la ressource. Ici on a GET qui permet de récupérer une ressource du serveur.
Une URL vers la ressource, ici /api/v2/pokemon/pikachu.
La version du protocole HTTP, ici 1.1.
(optionnel) Les en-têtes (ou header en anglais) permettant de donner plus d’information au serveur, ici on a host.
(optionnel) Un corps (ou body en anglais) permettant de fournir des données au serveur, ici il n’y en a pas.
Réponse
Voici les éléments que l’on retrouve dans une réponse HTTP :
La version du protocole HTTP, ici 1.1.
Un code de statut (échec / succès), ici code 200.
Un message de statut qui est une description rapide, informelle, du code de statut
(optionnel) Les en-têtes, ici on a date, cache-control et content-type.
(optionnel) Un corps contenant la ressource récupérée, ici il n’y en a pas.
Verbes
HTTP définit un ensemble de verbes permettant d’indiquer l’action à réaliser.
Voici la liste des verbes HTTP :
GET
POST
PUT
DELETE
PATCH
HEAD
CONNECT
OPTION
TRACE
Voici un lien qui explique chacun des verbes HTTP : https://developer.mozilla.org/fr/docs/Web/HTTP/Methods
Code de réponse
HTTP définit un ensemble de code de réponse permettant d’obtenir une information sur le succès ou l’échec de la requête.
Il existe 5 types de réponse répartie sur 5 plages de nombres différentes :
100 à 199 : réponses informatives
200 à 299 : réponses de succès
300 à 399 : réponses de redirection
400 à 499 : erreurs du client
500 à 599 : erreurs du serveur
Voici les codes que l’on rencontre le plus couramment :
Informations
100 Continue
101 Switching Protocols
Succès
200 OK
201 Created
204 No Content
Redirection
301 Moved Permanently
302 Found
Erreurs du client
400 Bad Request
401 Unauthorized
403 Forbidden
404 Not Found
Erreurs du serveur
500 Internal Server Error
502 Bad Gateway
Voici un lien qui explique chacun des codes de retour HTTP : https://developer.mozilla.org/fr/docs/Web/HTTP/Status
Fun fact
Pour la petite histoire, il existe une easter egg parmi tous ces codes de réponses. Le code 418 indique “I’m not a teapot” ou en français “je ne suis pas une théière”. Malgré le fait qu’à l’origine cet ajout était une blague, il est parfois utilisé dans des applications en guise d’humour.
Les différentes API construites sur HTTP
Voici une liste non-exhaustive des différentes API construites sur HTTP :
REST
SOAP
GraphQL
WebSocket
Server-Sent Events (SSE)
WebRTC
OAuth / OpenID Connect
Conclusion
HTTP est un protocole de communication s’appuyant sur le protocole réseau TCP/IP. C’est un protocole essentiel au fonctionnement du web.
Il a évolué depuis ses débuts en 1989 et a su assumer sa place dans l’écosystème internet. Aujourd’hui, on dénombre 3 versions majeures de HTTP et il continue d’y avoir de la recherche pour améliorer le protocole.
HTTP est la base de beaucoup d’API web ce qui en fait une notion essentiel à comprendre afin d’appréhender avec sérénité la construction d’application web.