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 :
-
Le client ouvre un canal de communication TCP vers le serveur.
-
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).
-
Le client reçoit une réponse HTTP du serveur et la lit.
-
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.