Académique Documents
Professionnel Documents
Culture Documents
Le protocole de transfert hypertexte ou HTTP (HyperText Transfer Protocol) est, avec le langage HTML et les adresses web
l’une des trois fondations qui permettent au World Wide Web tel qu’on le connait aujourd’hui d’exister.
HTTP (HyperText Transfer Protocol ou Protocole de Transfert Hypertexte en français) est un protocole de communication
permettant de récupérer et d’envoyer des ressources hypermédia. Au départ, HTTP a été créé pour permettre de transfert
de documents HTML uniquement puis ses usages se sont rapidement étendus pour permettre de transférer d’autres
types de ressources comme des images, des vidéos ou d’autres types de fichiers.
Un protocole est tout simplement un ensemble de règles. Dans un contexte réseau, un protocole est un ensemble de
règles qui régissent les échanges de données.
1/30
HTTP, un protocole sans état et évolutif
HTTP est l’une des trois inventions majeures qui ont permis la création du web. HTTP est donc présent depuis la création
du web et a su évoluer jusqu’à aujourd’hui pour répondre à l’évolution et à la diversification des usages du web et pour
faire en sorte qu’ils soient possibles.
Au début du web, les pages n’étaient composés que de HTML et ne faisaient pas appel à des ressources externes. Le
client n’avait donc qu’à effectuer une requête au serveur afin que celui-ci lui renvoie le document HTML.
Aujourd’hui, les pages web sont composées de différentes ressources : une structure HTML, des ressources CSS,
JavaScript, des images, vidéos, etc.
Les usages se sont également diversifiés : au départ du web, la seule opération possible en tant qu’utilisateur était la
récupération et la visualisation d’une ressource. Aujourd’hui, on peut également envoyer ou modifier des informations
(via des formulaires HTML notamment).
Tout cela est possible car HTTP a su évoluer et ajouter de nouveaux composants / fonctionnalités pour fournir davantage
de possibilité d’échanges. Toutefois, comme les usages et les capacités du web étaient au départ très limités, les règles
composant HTTP n’ont pas été formulées avec une quelconque idée de performance ou d’optimisation et cela représente
le défi principal de HTTP.
Par exemple, deux des principes de base du HTTP sont qu’une requête ne peut récupérer qu’une seule ressource à la
fois / n’effectuer qu’une action à la fois et que HTTP est un protocole sans état.
Lorsqu’on dit que HTTP est un protocole sans état, cela signifie que HTTP n’a pas besoin que le serveur conserve des
informations sur un client entre deux requêtes. Autrement dit, chaque nouvelle requête peut agir de manière totalement
indépendante et n’a pas de lien à priori avec les requêtes précédentes ou suivantes.
Les pages web actuelles sont composées de nombreuses ressources et vont donc demander au client d’effectuer
plusieurs requêtes. Généralement, le client va demander qu’on lui renvoie le document HTML demandé, puis va
commencer à le lire et va ensuite effectuer de nouvelles requêtes au serveur à chaque fois qu’il va tomber sur une autre
ressource incluse dans le document.
Chaque nouveau jeu de requête-réponse implique un aller-retour des données, ce qui prend du temps et entraine donc
de la latence (un temps d’attente) pour l’utilisateur. Des techniques comme les connexions parallèles, persistantes ou en
pipelines ont été progressivement formulées et implémentées pour résoudre ces problèmes de performance. Nous
étudierons évidemment ces techniques en détail dans la suite du cours.
Pour le moment, contentez-vous de retenir que l’un des enjeux majeurs du HTTP depuis quelques années est un enjeu lié
à l’optimisation des performances pour « rendre le web plus rapide ».
HTTP et HTTPS
HTTP est un protocole de transfert de la couche application des modèles OSI et TCP/IP. Ce protocole permet in-fine l’envoi
et la récupération ressources hypermedias.
Il y a quelques années, la plupart des utilisateurs du web ne faisaient pas confiance aux sites et n’osaient pas acheter
sur le web car ils devaient transmettre des informations sensibles comme des numéros de carte bleu.
Netscape a alors inventé un protocole de sécurisation des échanges de données appelées SSL pour Secure Sockets Layer.
L’IETF (groupe chargé de la standardisation de certains protocoles et notamment chargé de l’évolution de HTTP) a
ensuite continué son développement en le renommant TLS (Transport Layer Security).
TLS est aujourd’hui la norme dans le chiffrement / cryptage des échanges de données sur le net. HTTPS est simplement
une variante de HTTP qui implémente ce protocole de sécurisation.
Pour information, un serveur HTTP utilise le port 80 par défaut. Un serveur supportant HTTPS utilisera le port 443 par
défaut. Un « port » permet de distinguer différents interlocuteurs (différents programmes ou applications).
2/30
2) Requête, réponse et session HTTP
HTTP est un protocole qui décrit la façon dont des données doivent être transférées à travers des réseaux.
Le transfert de données se passe en deux temps : tout d’abord, un client (généralement un navigateur) effectue une
requête HTTP (une demande) qui va être transmise à un serveur. Le serveur répond ensuite en renvoyant une réponse
HTTP.
Notez bien que le HTTP n’a pour but que de définir la forme de ces messages et n’a pas pour objet d’indiquer les moyens
de transfert des messages en soi. Cette tâche est laissée à d’autres protocoles qui fonctionnent avec HTTP mais à
d’autres niveaux (d’autres couches) des modèles TCP/IP ou OSI.
La première ligne d’une requête HTTP permet de préciser la requête HTTP. Celle-ci est composée de :
• La méthode de requête utilisée qui sert à indiquer le type de requête effectuée : simple récupération de ressources,
envoi de données sur le serveur, etc. ;
• La cible de la requête (si applicable) qui va généralement prendre la forme d’une URL ou d’un chemin absolu ;
• La version HTTP utilisée pour la requête (qui sert également à indiquer la version attendue pour la réponse).
Sous cette ligne de départ, un ou plusieurs en-têtes HTTP peuvent être ajoutés. Ces en-têtes permettent de préciser la
requête ou d’ajouter des informations de contexte. Les en-têtes vont par exemple nous servir à indiquer la langue
préférée pour une ressource demandée, à indiquer comment la connexion avec le serveur doit être établie, le type et le
poids du corps de requête, etc.
Il existe de très nombreux en-têtes HTTP différents et nous allons étudier les plus communs dans la suite de ce cours.
Dans un message HTTP, chaque en-tête doit être décrit sur une ligne.
Après les lignes d’en-tête, une requête HTTP doit obligatoirement comporter une ligne vierge puis peut enfin comporter
un corps de requête. Le corps de requête permet de transmettre des données au serveur et toutes les requêtes n’en ont
pas.
Par exemple, la plupart des requêtes GET (permettant de récupérer des ressources) n’ont pas besoin d’ajouter un corps. En
revanche, des requêtes comme POST qui servent à envoyer des informations au serveur vont transmettre ces informations
dans le corps de la requête.
Note : depuis HTTP/2, les données sont encodées en binaire et ne sont donc plus lisibles pour un humain.
3/30
• POST permet de transmettre des données dans le but de manipuler une ressource ;
• PUT permet de remplacer ou d’ajouter une ressource sur le serveur ;
• DELETE permet de supprimer une ressource du serveur ;
• HEAD permet de demander des informations sur la ressource sans demander la ressource elle-même ;
• PATCH permet de modifier partiellement une ressource ;
• OPTIONS permet d’obtenir les options de communication d’une ressource ou du serveur ;
• CONNECT permet d’utiliser un proxy comme un tunnel de communication ;
• TRACE permet de tester et d’effectuer un diagnostic de la connexion et demandant au serveur de retourner la requête
reçue.
Voici également un tableau avec les caractéristiques inhérentes à chaque méthode. Ce tableau pourra vous être utile plus
tard.
Source : developer.mozilla.org
La ligne de statut est composée de la version du protocole, d’un code de statut HTTP indiquant l’état de complétion de la
requête, son succès ou son échec et d’un court texte descriptif lié au code de statut.
Les en-têtes HTTP permettent à nouveau d’ajouter des informations de contexte et de préciser la réponse comme la date
d’envoi de la réponse, des informations relatives au serveur, des informations relatives à la connexion ou encore la mise
en place de cookies.
Finalement, la dernière partie d’une réponse HTTP et le corps et là non plus toutes les réponses n’en ont pas. Le corps
d’une réponse HTTP va permettre par exemple de transmettre la ressource demandée par la requête HTTP.
200 OK
Le code de statut 200 (OK) indique que la requête a été traitée avec succès. La réponse du serveur est donc envoyée
sans problème.
4/30
temporaires lors de maintenances notamment.
403 Forbidden
Le code de statut 403 (Forbidden) indique que le serveur a bien compris la requête mais refuse de la compléter. Ce statut
peut être renvoyé suite à un certain nombre de tentative de connexion avec des mauvais identifiants par exemple.
Comment créer une requête ou une réponse HTTP en pratique ou « à quoi ça sert
tout ça » ?
Ce point est important et devrait vous aider à y voir plus clair pour la suite de ce cours : en pratique, vous n’aurez en
tant que développeur ou webmaster que rarement l’occasion de créer un message HTTP.
En effet, les requêtes HTTP sont formulées par le client (c’est-à-dire dans la majorité des cas le navigateur de vos
visiteurs) et vous n’avez donc quasiment aucun contrôle dessus.
D’un autre côté, les réponses HTTP sont quant-à-elles créées par le serveur et vont en grande partie dépendre de la
configuration de celui-ci. En fonction de votre hébergeur et de votre formule d’hébergement, vous allez avoir plus ou
moins de contrôle sur la configuration de votre espace serveur.
L’intérêt principal d’apprendre le fonctionnement d’HTTP et de comprendre comment fonctionne le transfert de données
dans son ensemble n’est pas de pouvoir directement intervenir dessus.
On apprend tout cela car ça aide grandement à comprendre comment fonctionne un site web, comment et pourquoi
optimiser la vitesse de celui-ci et car cela aide à mieux comprendre les erreurs qui peuvent survenir pour pouvoir les
régler plus rapidement et efficacement.
Ceci étant dit, nous allons apprendre dans ce cours à configurer correctement quelques en-têtes de réponse HTTP pour
servir les objectifs décrits ci-dessus, et notamment les en-têtes liés aux redirections et au cache.
5/30
parallèle de HTTP et ont également poussé ce protocole à continuer d’évoluer.
HTTP s’est en effet progressivement développé en décrivant de nouvelles méthodes HTTP qui ont diversifié l’éventail des
opérations permises par les clients, en créant le concept d’en-têtes HTTP et en créant de nouveaux en-têtes au cours du
temps, etc.
D’un autre côté, le web est devenu de plus en plus complexe avec l’ajout de médias comme les images, les vidéos, les
fichiers PDF ainsi que l’ajout de nouveaux langages côté client comme le CSS et le JavaScript. Ainsi, le nombre de
ressources nécessaires pour l’affichage d’une page web a drastiquement augmenté en même temps que le poids des
pages et cela a commencé à poser de sérieux défis au HTTP qui n’était pas un protocole créé avec une idée de
performance.
Dans cette leçon, nous allons voir comment HTTP a réussi à évoluer et à s’adapter au cours de 30 dernières années et
allons détailler les différentes évolutions majeures de ce protocole.
(requête)
GET /monimage.gif HTTP/1.0
User-Agent: NCSA_Mosaic/2.0 (Windows 3.1)
(réponse)
200 OK
Date: Tue, 15 Nov 1994 08:12:32 GMT
Server: CERN/3.0 libwww/2.17
Content-Type: text/gif
Content-Length: 1375
(contenu de l'image)
6/30
poids de chaque ressource.
Cela n’était pas prévu lors de la création de HTTP : les fondations du protocole sont qu’on ne peut effectuer qu’une seule
opération par requête. En plus de cela, HTTP souffre des limitations suivantes :
• On ne peut envoyer qu’une requête à la fois car il faut attendre de recevoir la réponse serveur avant d’en envoyer une
nouvelle ;
• Il faut établir une nouvelle connexion entre le client et le serveur après chaque réponse.
La version HTTP/1.1 s’attaque à ces limitations en proposant des mécanismes de connexions persistantes ou « keep-alive
» ainsi que le support des connexions en pipeline et des connexions parallèles.
Les connexions persistantes sont des connexions qui se poursuivent pendant un certain temps après la réponse du
serveur. Autrement dit, la connexion est maintenue dans l’attente d’une nouvelle requête. Cela permet d’économiser le
temps de la connexion et de la déconnexion.
Le « pipelining » est un mécanisme qui permet au client d’envoyer une nouvelle requête avant même d’avoir reçu la
réponse du serveur (c’est-à-dire d’envoyer plusieurs requêtes « en même temps » en établissant plusieurs connexions
simultanées). Les réponses du serveur doivent cependant arriver dans le même ordre que celui de l’envoi des requêtes.
Le principe de connexions parallèles, comme son nom l’indique, est d’établir plusieurs connexions simultanées de façon
à pouvoir envoyer plus de requêtes en même temps. Les navigateurs de l’époque étaient capables de supporter de 2 à 8
connexions simultanées.
Outre cela, HTTP/1.1 introduit également le concept de négociation de contenu au niveau du langage, de l’encodage et
du type (notamment via les en-tête Accept, Accept-Language et Accept-Encoding. Cela permet au client et au serveur
de se mettre d’accord sur le contenu à échanger. HTTP/1.1 ajoute également de nouveaux mécanismes de caches plus
perfectionnés.
Une ensemble de requêtes / réponses HTTP/1.1 ressemble à ceci :
(Request 1)
GET /en-US/docs/Glossary/Simple_header HTTP/1.1
Host: developer.mozilla.org
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://developer.mozilla.org/en-US/docs/Glossary/Simple_header
(Response 1)
HTTP/1.1 200 OK
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
Date: Wed, 20 Jul 2016 10:55:30 GMT
Etag: "547fa7e369ef56031dd3bff2ace9fc0832eb251a"
Keep-Alive: timeout=5, max=1000
Last-Modified: Tue, 19 Jul 2016 00:59:33 GMT
Server: Apache
Transfer-Encoding: chunked
Vary: Cookie, Accept-Encoding
[content]
(Request 2)
GET /static/img/header-background.png HTTP/1.1
Host: developer.cdn.mozilla.net
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://developer.mozilla.org/en-US/docs/Glossary/Simple_header
(Response 2)
HTTP/1.1 200 OK
Age: 9578461
Cache-Control: public, max-age=315360000
Connection: keep-alive
Content-Length: 3077
Content-Type: image/png
Date: Thu, 31 Mar 2016 13:34:46 GMT
Last-Modified: Wed, 21 Oct 2015 18:27:50 GMT
Server: Apache
7/30
HTTP/2 a été publié en 2015 et trouve son origine dans un autre protocole appelé SPDY et développé par Google.
Au début des années 2010, Google a en effet commencé à effectuer des travaux pour améliorer les performances de
HTTP qui n’est pas un protocole créé avec une idée de performance à la base et qui est donc très complexe à optimiser.
Cela a donné lieu à la naissance de SPDY, un protocole réseau visant à augmenter les capacités du protocole HTTP sans
toutefois remplacer ce dernier (SPDY fonctionne avec HTTP).
L’objectif principal de SPDY est de réduire la durée de téléchargement des pages Web. Pour cela, les requêtes sont
classées par ordre de priorité (de sorte à ce que les requêtes les plus importantes comme le chargement d’un fichier de
style ne soient pas bloquées par d’autres moins importantes comme le chargement d’une image en bas de page). En plus
de cela, un mécanisme de multiplexing est mis en place.
Concrètement, le multiplexing permet d’envoyer plusieurs requêtes d’affilée lors d’une même connexion sans attendre à
chaque fois la réponse du serveur tout comme le permettait théoriquement le pipelining. En pratique, toutefois, le
pipelining était très complexe à mettre en place (notamment avec les connexions parallèles), mal supporté et pouvait
entrainer des faille de sécurité ce qui n’est plus le cas avec le multiplexing.
En plus de cela, avec le multiplexing, les réponses du serveur peuvent désormais revenir dans n’importe quel ordre. En,
d’autres termes, le serveur n’est plus obligé de renvoyer les réponses dans le même ordre que l’envoi des requêtes, ce
qui permet d’éviter des blocages et rend le processus plus performant.
SPDY a été implémenté et testé par Google pendant plusieurs années avant que Google se rapproche du groupe de
travail chargé de l’évolution de HTTP et leur passe les documents techniques liés à SPDY afin que ces avancées soient
introduites dans HTTP même.
Cela va donc être l’une des fondations de HTTP/2. En plus du multiplexing et de la priorisation des requêtes, on notera
également que HTTP/2 compresse désormais les en-têtes HTTP, de telle sorte qu’un même en-tête n’est pas renvoyé
plusieurs inutilement. HTTP/2 améliore également les mécanismes de cache notamment en permettant au serveur de
remplir le cache du client avant même que le client n’envoie une requête.
Enfin, il faut également souligner que HTTP/2 est désormais encodé directement en binaire et non plus en texte. Cela le
rend donc impossible à lire ou à écrire à la main mais permet de nouvelles optimalisations du protocole.
Pour être tout à fait précis, les données sont découpées en « frames » (trames) codées en binaire qui sont ensuite
mappées à des messages qui appartiennent à un flux particulier et qui sont tous multiplexés dans une seule connexion
TCP. C’est la base qui permet toutes les autres fonctionnalités et optimisations de performances fournies par le protocole
HTTP/2.
4) Le Cache HTTP
8/30
par lequel transite une requête HTTP peut également tout à fait utiliser un cache.
Au final, il existe une grande variété d’architectures et de configurations de caches déployées sur le World Wide Web et
au sein de grandes organisations, notamment des hiérarchies nationales des caches de proxy pour économiser la bande
passante transocéanique, etc.
Contrôle du cache
Le champ d’en-tête Cache-Control est utilisé pour spécifier les directives pour les mécanismes de cache dans les
requêtes et les réponses.
Les règles standard Cache-Control suivantes peuvent être utilisées par un client HTTP dans une requête :
• Cache-Control: max-age : Indique la durée pendant laquelle la ressource doit être considérée comme valide (non
expirée). Contrairement à expires, la durée indiquée dans cette directive commence à la date de la requête ;
• Cache-Control: max-stale : Indique que le client accepte une réponse expirée. Une valeur optionnelle permet
d’indiquer la durée maximale depuis laquelle la réponse peut être expirée mais acceptée quand même ;
• Cache-Control: min-fresh : Indique que le client demande une réponse qui soit valide pour au moins la durée
demandée (dont la date d’expiration est supérieure à la date actuelle plus la durée spécifiée) ;
• Cache-Control: no-cache : Indique de renvoyer systématiquement la requête au serveur et ne servir une éventuelle
version en cache que dans le cas où le serveur le demande ;
• Cache-Control: no-store : La requête ou les données ne devraient jamais être mises en cache ;
• Cache-Control: no-transform : Aucune conversion ou transformation ne devraient être réalisée sur la ressource. Ainsi,
les en-tête Content-Encoding, Content-Range et Content-Type ne devraient jamais être modifiés par un proxy (serveur
mandataire). Un proxy non-transparent pourrait, en l’absence de cet en-tête, convertir ou compresser (avec pertes) des
images pour réduire la place occupée en cache ou diminuer le volume de données à transférer sur un lien lent ;
• Cache-Control: only-if-cached : Indique de se limiter au contenu en cache. Dans ce cas, le client ne veut pas que sa
9/30
réponse soit envoyée au serveur.
Les règles standard Cache-Control suivantes peuvent être utilisées par un serveur HTTP dans une réponse :
• Cache-Control: must-revalidate : Le cache doit refaire une requête dans le cas où les données sont expirées afin de
les mettre à jour s’il y a lieu (il reste parfaitement possible que le serveur réponde avec les mêmes données) ;
• Cache-Control :no-cache ;
• Cache-Control: no-store ;
• Cache-Control: no-transform ;
• Cache-Control: public : Indique que la réponse peut être mise en cache par n’importe quel cache ;
• Cache-Control: private : Indique que la réponse ne doit être mise en cache que pour un utilisateur donné et ne doit
donc pas être mise en cache par un cache partagé ;
• Cache-Control: proxy-revalidate : Comme pour must-revalidate, mais force la valeur pour les caches partagés.
Cette valeur est ignorée par les caches locaux.
• Cache-Control: max-age ;
• Cache-Control: s-maxage= : Indique une valeur pour écraser les valeurs définies par max-age ou Expires pour les
caches partagés (comme les proxies). Il est donc ignoré par les caches privés (dont les navigateurs).
10/30
Dans la majorité des cas, lorsque l’agent utilisateur reçoit une réponse 301, il effectue une nouvelle requête avec le
nouvel URI fourni par l’en-tête Location.
Notez qu’originellement la méthode de la nouvelle requête devrait être la même que celle de la précédente. Cependant,
historiquement, les agents utilisateurs ont souvent implémenté cela incorrectement notamment dans la cas où la
première requête était une requête POST (qui était souvent transformée en une requête GET).
Il est donc aujourd’hui admis qu’un agent utilisateur peut changer la méthode de demande de POST à GET d’une requête à
l’autre. Un nouveau code de statut, le code 308 a d’ailleurs été créé pour spécifier explicitement qu’on ne veut pas que
l’agent utilisateur change de méthode de requête lorsqu’il suit une redirection permanente.
302 Found
Le code d’état 302 indique que la ressource cible réside temporairement sous un URI différent.
Ce code de statut est le code à utiliser lors de maintenances par exemple ou lorsqu’on modifie une page et qu’on ne
souhaite pas que les visiteurs puissent accéder à celle-ci pendant qu’elle est modifiée.
Comme la redirection n’est que temporaire, le client doit continuer à utiliser l’URI de requête de base pour les demandes
futures. En effet, une redirection temporaire a pour finalité de disparaitre.
Comme pour une redirection 301, le serveur devrait générer un champ d’en-tête Location dans la réponse contenant une
référence URI préférée pour le nouvel URI permanent.
La prise en charge des 302 par les agents utilisateur a été similaire à celle des 301 historiquement, avec ces agents
utilisateur modifiant la méthode de requête entre deux requêtes alors que cela était théoriquement incorrect.
Comme précisé précédemment, il est aujourd’hui admis qu’un agent utilisateur peut changer la méthode de demande de
POST à GET d’une requête à l’autre. Un autre code de statut, le code 307 a été mis en place pour spécifier explicitement
qu’on ne veut pas que l’agent utilisateur change de méthode de requête lorsqu’il suit une redirection temporaire.
Redirections et SEO
En pratique, les redirections les plus couramment utilisées sont les redirections 301 et 304 et ces deux types de
redirections HTTP sont principalement utilisées dans une optique SEO.
Les redirections 301 (et 308) permettent de transmettre l’autorité d’une URI à une autre pour les mots clefs sur lesquels
elle est positionnée.
En effet, mettre en place une redirection 301 permet aux robots de Google de comprendre qu’une ressource en
particulier a changé d’emplacement et donc de conserver les classements obtenus. Attention cependant : cela ne va
bien fonctionner que si la nouvelle URI possède bien un contenu similaire à l’ancienne.
En plus de cela, le redirections 301 permettent de ne pas perdre les liens externes obtenus (qui sont un facteur
d’optimisation du référencement essentiel) sur l’ancienne URI puisque leur autorité va donc également être « redirigée »
11/30
vers la nouvelle URI.
Les redirections 304 permettent également d’optimiser son référencement en optimisant la vitesse d’affichage des pages
d’un site pour les visiteurs puisque ce type de redirections permet de faire l’économie du transfert d’un certain poids de
données.
12/30
• Path ;
• Secure ;
• HttpOnly ;
• SameSite (pas encore standardisé mais bénéficiant déjà d’un support étendu).
Expires
L’attribut Expires indique la durée de vie maximale du cookie, représentée par la date et l’heure d’expiration du cookie.
Notez que l’agent utilisateur peut tout à fait supprimer un cookie avant la data indiquée par Expires, notamment pour
des raisons de pression sur la mémoire ou pour des raisons de confidentialité / sécurité.
Max-Age
L’attribut Max-Age indique également la durée de vie maximale du cookie, cette fois-ci représentée par le nombre de
secondes jusqu’à l’expiration du cookie. L’agent utilisateur n’est une nouvelle fois pas tenu de conserver le cookie
pendant la durée spécifiée.
Certains vieux agents utilisateurs ne supportent pas Max-Age. Dans ce cas, l’attribut est ignoré.
Notez que si un cookie possède à la fois un attribut Max-Age et un attribut Expires, l’attribut Max-Age a la priorité et
contrôle la date d’expiration du cookie.
Enfin, notez que si un cookie ne possède ni attribut Max-Age ni Expires alors le cookie aura une durée de vie égale à celle
de la session courante.
Domain
L’attribut Domain spécifie les hôtes auxquels le cookie sera envoyé. Par exemple, si la valeur de l’attribut Domain est «
example.com », l’agent utilisateur inclura le cookie dans l’en-tête Cookie pour des requêtes HTTP sur example.com,
www.example.com et www.corp.example. com.
Si l’attribut Domain est omis, l’agent utilisateur renverra le cookie uniquement au serveur d’origine. Attention : certains
agents utilisateurs existants traitent un attribut Domain absent comme si l’attribut était présent et contenait le nom
d’hôte actuel.
Path
La portée de chaque cookie est limitée à un ensemble de chemins, contrôlé par l’attribut Path.
Si le serveur omet l’attribut Path, l’agent utilisateur utilisera le répertoire du composant de chemin de l’URL de demande
comme valeur par défaut.
L’agent utilisateur inclura le cookie dans une requête HTTP uniquement si la partie chemin de l’URL de la requête
correspond à (ou est un sous-répertoire de) l’attribut Path du cookie.
Notez que le caractère slash (/) est interprété comme un séparateur de répertoire .
Attention : bien que l’attribut Path semble utile pour isoler les cookies entre différents chemins au sein d’un hôte donné,
il n’est pas fiable d’un point de vue sécurité.
Secure
L’attribut Secure limite la portée du cookie aux canaux « sécurisés » (où la notion de « sécurité » est définie par l’agent
utilisateur).
Lorsqu’un cookie possède un attribut Secure, l’agent utilisateur n’inclut le cookie dans une requête HTTP que si celle-ci
est transmise sur un canal sécurisé, généralement HTTP sur Transport Layer Security (TLS) c’est-à-dire HTTPS.
Attention : l’attribut Secure protège uniquement la confidentialité du cookie. Un attaquant peut écraser les cookies Secure
d’un canal non sécurisé, ce qui perturbe leur intégrité.
HttpOnly
L’attribut HttpOnly limite la portée du cookie aux requêtes HTTP. En particulier, l’attribut indique à l’agent utilisateur
d’omettre le cookie lors de l’accès aux cookies via des API non-HTTP (telles qu’une API de navigateur Web qui expose les
cookies aux scripts).
Notez que l’attribut HttpOnly est indépendant de l’attribut Secure : un cookie peut avoir à la fois un attribut HttpOnly et
un attribut Secure.
Samesite
L’attribut Samesite n’est pas encore standardisé mais bénéfice déjà d’un support étendu parmi les navigateurs les plus
populaires.
Cet attribut permet d’indiquer qu’un cookie ne doit pas être envoyés avec des requêtes cross-site. Il offre une certaine
protection contre les attaques de type cross-site request forgery (CSRF).
14/30
Si l’agent utilisateur n’est pas satisfait par la représentation de réponse initiale, il peut effectuer une requête GET sur une
ou plusieurs des ressources alternatives, sélectionnées en fonction des métadonnées incluses dans la liste, pour obtenir
une forme de représentation différente pour cette réponse. La sélection des alternatives peut être effectuée
automatiquement par l’agent utilisateur ou manuellement par l’utilisateur sélectionnant à partir d’un menu généré.
Notez qu’on parle ici généralement de représentations multiples de la réponse et non pas de la ressource demandée en
soi.
Un serveur peut choisir de ne pas envoyer une représentation initiale mais seulement une liste d’alternatives pour
indiquer ainsi que la négociation réactive par l’agent utilisateur est préférée.
Par exemple, les alternatives répertoriées dans les réponses avec le code de statut 300 (Multiple Choices) incluent des
informations sur les représentations disponibles afin que l’utilisateur ou l’agent utilisateur puisse réagir en effectuant une
sélection.
La négociation réactive est souhaitée lorsque le serveur d’origine est incapable de déterminer les capacités d’un agent
utilisateur à partir de l’examen de la requête.
La négociation proactive souffre également d’inconvénients inhérents à sa définition comme le fait de transmettre une
liste d’alternatives à l’agent utilisateur et de nécessiter une deuxième requête pour obtenir une représentation
alternative qui augmentent la latence perçue.
15/30
Les valeurs des etags sont uniques et l’en-tête ETag est donc utilisé comme validateur fort par défaut.
La couche application
La couche application est la couche la plus proche de l’utilisateur. La majorité des protocoles utilisés par les utilisateurs
se situent dans cette couche (HTTP, SMTP, FTP, etc.).
Cette couche interagit avec les applications logicielles qui implémentent des composants de communication. La couche
application est le point d’accès aux services réseaux.
16/30
La couche application a généralement pour fonction d’identifier les interlocuteurs, de déterminer si les ressources sont
disponibles et de synchroniser les communications.
La couche d’application en elle-même n’a aucun moyen de déterminer la disponibilité des ressources sur le réseau.
Notez que la couche application est la couche où il y a la plus grande diversité de protocoles. En effet, il n’y a pas
beaucoup de méthodes fondamentalement différentes permettant d’assurer les fonctions des couches 2 à 6 et leur
éventail de protocoles est donc assez
Pour la couche application, en revanche, on peut notamment utiliser les protocoles suivants (en se limitant au monde IP) :
• Les protocoles FTP (IETF), NFS (Sun Microsystems) et AFS, SMB/CIFS (Microsoft) pour le transfert de fichiers ;
• Les protocoles Simple Mail Transfer Protocol (SMTP), Post Office Protocol (POP), Internet Message Access Protocol (IMAP)
pour les services de messagerie ;
• Les protocoles Telnet, rlogin, Secure Shell (SSH) pour les sessions distantes ;
• Le protocole HTTP pour le transfert de ressources hypermédia comme les documents HTML ;
• Des protocoles d’exploitation et de gestion comme Domain Name System (DNS) pour la résolution d’adresse, Simple
Network Management Protocol pour la supervision.
La couche présentation
La couche présentation est chargée du formatage des données de la couche applicative afin qu’elles puissent être
envoyées à travers le réseau puis être lues à nouveau par les applications.
La couche session
La couche session contrôle les connexions entre les ordinateurs. Cette couche permet l’ouverture et la fermeture de
session et gère la synchronisation des échanges ainsi que les transactions.
La couche transport
La couche transport fournit les moyens concrets pour transférer des données de taille variable d’une source vers une
destination en conservant la qualité du service.
L’enjeu de la couche de transport est de réceptionner les données qui viennent des couches supérieures, de les
découper et de la faire transiter jusqu’à la couche réseau.
Cette couche est la première à communiquer directement avec la machine de destination : elle gère les communications
de bout en bout (“end to end”) entre processus (programmes en cours d’exécution).
La couche réseau
La couche réseau fournit les moyens concrets pour transférer des données de taille variable (appelés “paquets”) entre
différents réseaux de nœuds.
On va notamment effectuer le routage et l’adressage des paquets dans cette couche, c’est-à-dire qu’on va définir la route
que vont emprunter les paquets pour aller d’un point de départ à un point d’arrivée (d’un interlocuteur à l’autre).
La couche physique
La couche physique est chargée de la transmission des signaux entre les interlocuteurs. Son service est limité à
l’émission et la réception d’un bit ou d’un train de bits continu.
La couche physique est, comme son nom l’indique, la couche dans laquelle sont définis les protocoles du monde
physique (les différents câbles de transmission).
17/30
N° de la couche Nom de la couche Unité de données TCP/IP
7 Application Données non transformées application
6 Présentation Données non transformées application
5 Session Données non transformées application
4 Transport Segments segment
3 Réseau Paquets paquets
2 Liaison des données Frames frames
1 Physique Bits bits
I
La couche application
Le modèle TCP/IP regroupe les trois couches de session, présentation et application du modèle OSI dans une seule
couche application. En effet, d’un point de vue pratique, cela ne fait souvent pas beaucoup de sens de séparer ces
couches.
Cette couche contient tous les protocoles de haut niveau : FTP pour le transfert de fichiers, SMTP pour les mails, HTTP
pour le WWW, DNS pour les noms de domaine.
La couche transport
La couche transport assure la communication logique entre processus. Cette couche détermine comment les données
doivent être envoyées : de manière fiable ou pas.
Concrètement, on va pouvoir choisir entre deux protocoles dans la couche transport : TCP (Transmission Control Protocol)
et UDP (User Datagram Protocol).
TCP est un protocole de transfert fiable orienté connexion. Ce protocole contrôle et s’assure qu’il n’y ait ni perte ni
corruption de données. Il est donc en charge des erreurs. TCP est le protocole le plus utilisé sur le Web aujourd’hui.
UDP est un protocole de transfert non fiable et qui ne nécessite pas de connexion préalable. Ce protocole est
particulièrement utilisé pour les échanges où la perte de quelques données n’est pas grave (appel vidéo, jeu en ligne,
etc.) car il est plus rapide que TCP.
La couche Internet
Le but principal de la couche Internet est d’assurer la communication logique entre hôte, c’est-à-dire de transmettre
coûte que coûte les paquets d’un hôte à un autre et de faire en sorte qu’ils arrivent à destination. Le protocole principal
de cette couche est IP (Internet Protocol ou Protocole Internet). Les paquets peuvent prendre différentes routes pour
arriver à destination et arriver dans un ordre différent de l’ordre dans lequel ils ont été envoyés.
Dans son fonctionnement, la couche Internet n’est pas responsable d’une transmission fiable. Elle ne fournit qu’un
service peu fiable et une livraison optimale (via le routage et l’adressage). Étant donné que la livraison de paquets entre
divers réseaux est une opération intrinsèquement peu fiable et sujette aux pannes, la charge de la fiabilité a été placée
avec les points d’extrémité d’un chemin de communication, c’est-à-dire les hôtes, plutôt que sur le réseau.
Ce sera aux protocoles de plus haut niveau d’assurer la fiabilité du service.
Le transfert de données
Pendant la phase de transferts de données, certains mécanismes clefs permettent d’assurer la robustesse et la fiabilité
de TCP. En particulier, les numéros de séquence sont utilisés afin d’ordonner les segments TCP reçus et de détecter les
données perdues, les sommes de contrôle permettent la détection d’erreurs, et les acquittements ainsi que les
temporisations permettent la détection des segments perdus ou retardés.
La somme de contrôle ou checksum en anglais, parfois appelée « empreinte », est un nombre qu’on ajoute à un message
à transmettre pour permettre au récepteur de vérifier que le message reçu est bien celui qui a été envoyé.
Grâce aux numéros de séquence et d’acquittement, les systèmes terminaux peuvent remettre les données reçues dans
l’ordre à l’application destinataire.
Les numéros de séquence sont utilisés pour décompter les données dans le flux d’octets. On trouve toujours deux de ces
nombres dans chaque segment TCP, qui sont le numéro de séquence et le numéro d’acquittement. Le numéro de
séquence représente le propre numéro de séquence de l’émetteur TCP, tandis que le numéro d’acquittement représente
le numéro de séquence du destinataire. Afin d’assurer la fiabilité de TCP, le destinataire doit acquitter les segments reçus
en indiquant qu’il a reçu toutes les données du flux d’octets jusqu’à un certain numéro de séquence.
Une somme de contrôle sur 16 bits, constituée par le complément à un de la somme complémentée à un de tous les
éléments d’un segment TCP (en-tête et données), est calculée par l’émetteur, et incluse dans le segment émis. Le
destinataire recalcule la somme de contrôle du segment reçu, et si elle correspond à la somme de contrôle reçue, on
considère que le segment a été reçu intact et sans erreur.
La perte d’un segment est gérée par TCP en utilisant un mécanisme de temporisation et de retransmission. Après l’envoi
d’un segment, TCP va attendre un certain temps la réception du ACK correspondant. Un temps trop court entraîne un
grand nombre de retransmissions inutiles et un temps trop long ralentit la réaction en cas de perte d’un segment.
Dans les faits, le délai avant retransmission doit être supérieur au RTT (round trip time) moyen d’un segment, c’est-à-dire
au temps que prend un segment pour effectuer l’aller-retour entre le client et le serveur. Comme cette valeur peut varier
dans le temps, on « prélève » des échantillons à intervalle régulier et on en calcule une moyenne pondérée
Chaque partenaire dans une connexion TCP dispose d’un tampon de réception dont la taille n’est pas illimitée. Afin
d’éviter qu’un hôte ne surcharge l’autre, TCP prévoit plusieurs mécanismes de contrôle de flux. Ainsi, chaque segment
TCP contient la taille disponible dans le tampon de réception de l’hôte qui l’a envoyé. En réponse, l’hôte distant va limiter
la taille de la fenêtre d’envoi afin de ne pas le surcharger.
19/30
Fermeture de la connexion
La phase de terminaison d’une connexion utilise un handshaking en quatre temps, chaque extrémité de la connexion
effectuant sa terminaison de manière indépendante. Ainsi, la fin d’une connexion nécessite une paire de segments FIN et
ACK pour chaque extrémité.
Ports TCP
Le numéro de port est utilisé par TCP (et par UDP) pour identifier les applications, c’est-à-dire pour distinguer les
différents interlocuteurs. À chaque extrémité (client/serveur) de la connexion TCP est associé un numéro de port sur 16
bits (de 1 à 65535) assigné à l’application émettrice ou réceptrice. Ces ports sont classés en trois catégories :
• Les ports bien connus, assignés par l’IANA (Internet Assigned Numbers Authority) dans la plage 0-1023 et qui sont
souvent utilisés par des applications bien connues qui fonctionnent en tant que serveur et sont en attente de connexions
comme FTP (port 21), SSH (port 22), Telnet (23), SMTP (25), HTTP (80), POP3 (110) ;
• Les ports enregistrés généralement utilisés par des applications utilisateur comme ports sources éphémères pour se
connecter à un serveur, mais qui peuvent également identifier des services non enregistrés par l’IANA ;
• Les ports dynamiques/privés qui peuvent aussi être utilisés par des applications utilisateur, mais plus rarement. Ils n’ont
pas de sens en dehors d’une connexion TCP particulière.
L’adressage IP
Lors d’une communication entre deux postes, le flux de données provenant de la couche transport — niveau 4 du modèle
OSI — (par exemple des segments TCP) est encapsulé dans des paquets par le protocole IP lors de leur passage au
niveau de la couche réseau. Ces paquets sont ensuite transmis à la couche liaison de données — niveau 2 du modèle OSI
— afin d’y être encapsulés dans des trames (par exemple Ethernet).
Les données traversant Internet sont divisées en morceaux plus petits, appelés paquets. Des informations IP sont
attachées à chaque paquet, et ces informations aident les routeurs à envoyer des paquets au bon endroit. Chaque
appareil ou domaine qui se connecte à Internet se voit attribuer une adresse IP et, comme les paquets sont dirigés vers
l’adresse IP qui leur est attachée, les données arrivent là où elles sont nécessaires.
Les paquets IP sont créés en ajoutant un en-tête IP à chaque paquet de données avant son envoi. Un en-tête IP n’est
qu’une série de bits (uns et zéros) qui enregistre plusieurs informations sur le paquet, y compris l’adresse IP d’envoi et
de réception. Les en-têtes IP indiquent également:
• Longueur de l’en-tête ;
• Longueur du paquet ;
• Time To Live (TTL), ou le nombre de sauts de réseau qu’un paquet peut faire avant qu’il ne soit jeté ;
• Quel protocole de transport est utilisé (TCP, UDP, etc.).
Au total, il existe 14 champs d’informations dans les en-têtes IPv4, bien que l’un d’entre eux soit facultatif.
Une adresse IP est un identifiant unique attribué à un appareil ou un domaine qui se connecte à Internet. Chaque adresse
IP est une série de caractères, tels que «192.168.1.1». Grâce aux résolveurs DNS, qui traduisent les noms de domaine
lisibles par l’homme en adresses IP, les utilisateurs peuvent accéder à des sites Web sans mémoriser cette série
complexe de caractères.
Chaque paquet IP contiendra à la fois l’adresse IP de l’appareil ou du domaine envoyant le paquet et l’adresse IP du
destinataire prévu, de la même façon que l’adresse de destination et l’adresse de retour sont incluses dans une pièce de
courrier ou dans un email.
Le routage IP
Avec l’adressage, le routage est l’une des principales fonctions du protocole IP. Le routage consiste à transmettre des
paquets IP de la source aux machines de destination sur un réseau, en fonction de leurs adresses IP. Cette transmission
se produit généralement via un routeur.
Les protocoles IP assurent l’acheminement au mieux (best-effort delivery) des paquets. Ils ne se préoccupent pas du
contenu des paquets, mais fournissent une méthode pour les mener à destination.
Les protocoles IP sont considérés comme « non fiables ». Cela ne signifie pas qu’ils n’envoient pas correctement les
données sur le réseau, mais qu’ils n’offrent aucune garantie pour les paquets envoyés quant à :
• la corruption de données ;
• l’ordre d’arrivée des paquets (un paquet A peut être envoyé avant un paquet B, mais le paquet B peut arriver avant le
paquet A) ;
• la perte ou destruction de paquets ;
• la duplication des paquets.
En termes de fiabilité, le seul service offert par un protocole IP est de s’assurer que les en-têtes de paquets transmis ne
comportent pas d’erreurs grâce à l’utilisation de somme de contrôle (checksum). Si l’en-tête d’un paquet comprend une
erreur, sa somme de contrôle ne sera pas valide et le paquet sera détruit sans être transmis.
20/30
Les versions IP : IPv4 et IPv6
IPv4 utilise des adresses codées sur 32 bits (soit en théorie 4 294 967 296 adresses possibles) tandis qu’IPv6 les code sur
128 bits (soit en théorie 3,4 × 1038 adresses possibles).
Le premier champ d’un paquet d’un protocole IP est composé de 4 bits qui indiquent la version du protocole utilisé. La
valeur 0100 (4 en binaire) est utilisée pour IPv4, 0110 (6 en binaire) pour IPv6.
Les versions 1 à 3 du protocole sont restées expérimentales. Elles ont été utilisées entre 1977 et 1979.
La version 4 du protocole est une version qui a été très largement utilisée. Le nombre 4 est le numéro de version du
protocole porté par les datagrammes IP qui l’utilisent. IPv4 est défini dans la RFC RFC 7919 de 1981.
La version 5 du protocole est une version expérimentale utilisée dans le cadre de l’étude du Internet Stream Protocol,
protocole lui-même expérimental.
Le successeur officiel du protocole IPv4 est IPv6. Ce protocole est le résultat de plusieurs années d’expérimentation et
d’échanges au cours desquels plusieurs protocoles ont été proposés (TP/IX, PIP, TUBA…).
21/30
Le problème avec HTTP/2 est que la correction du blocage de tête de ligne dans HTTP a repoussé une partie du problème
au niveau de la couche transport. En effet, lorsqu’un paquet est perdu, TCP met en tampon tous les paquets suivants
jusqu’à ce qu’il soit retransmis avec succès, même lorsque l’application pourrait utiliser certaines de ces données mises
en mémoire tampon (comme c’est le cas lorsque le multiplexage est activé avec HTTP). Ainsi, certaines connexions HTTP
avec pertes inhérentes comme le streaming vidéo par exemple ont vu constaté des performances réduites avec HTTP/2.
Le protocole TCP garantit l’intégrité des données. Pour ce faire, TCP décompose les données en paquets réseau et ajoute
de petites quantités de données à chaque paquet. Ces données supplémentaires comprennent un numéro de séquence
utilisé pour détecter les paquets perdus ou transmis dans le désordre, et une somme de contrôle qui permet de détecter
les erreurs dans les données de paquet. Si un problème survient, TCP utilise un procédé de répétition automatique de
requête (ARQ = automatic repeat request) pour dire à l’expéditeur de renvoyer le paquet perdu ou endommagé.
Les erreurs sont bloquantes pour TCP dans la plupart des implémentations, ce qui signifie que les autres transferts vont
être mis en attente jusqu’à ce que l’erreur soit résolue ou que la connexion soit considérée comme ayant échoué. Si une
seule connexion est utilisée pour envoyer plusieurs flux de données, comme c’est le cas dans le protocole HTTP/2, tous
ces flux sont bloqués bien qu’un seul d’entre eux puisse avoir un problème.
TCP est conçu pour ressembler à un flux de données et contient délibérément peu de compréhension des données qu’il
transmet. Si ces données ont des exigences supplémentaires, comme le chiffrement à l’aide de TLS, cela doit être
configuré par des systèmes fonctionnant au-dessus de TCP. Ce type d’opération nécessite d’établir une nouvelle liaison
(un handshake) à chaque fois et on va donc souvent avoir plusieurs allers-retours de requêtes et de réponses jusqu’à ce
que la connexion soit établie. En raison de la latence inhérente des communications à longue distance, cela peut ajouter
une surcharge importante à la transmission globale.
QUIC se base sur le modèle de flux HTTP/2 et l’intègre dans la couche de transport, de sorte qu’une seule connexion
puisse progresser sur un flux même si des paquets contenant des données provenant d’autres flux sont perdus,
atténuant ainsi le problème de blocage en tête de ligne dans le transport ainsi que dans la couche d’application.
Pour faire cela, QUIC est construit sur le protocole UDP (User Datagram Protocol) plutôt que sur TCP et intègre le cryptage
par défaut.
Aujourd’hui, la plupart des connexions HTTP sont sécurisées (HTTPS) via TLS. QUIC intègre l’échange des clés de
configuration et des protocoles pris en charge dans le processus de prise de contact initial. Ainsi, lorsqu’un client ouvre
une connexion, le paquet de réponse inclut les données nécessaires pour que les futurs paquets puissent utiliser le
chiffrement. Cela élimine le besoin de configurer la connexion TCP, puis de négocier le protocole de sécurité via des
paquets supplémentaires.
QUIC est également construit sur UDP qui n’inclut pas de mécanisme de récupération des pertes. Pour contourner ce
problème, chaque flux QUIC est contrôlé indépendamment et les données perdues sont retransmises au niveau de QUIC
et non pas de UDP.
Cela signifie que si une erreur se produit dans un flux la pile de protocoles peut continuer à desservir d’autres flux
indépendamment. Cela améliore grandement les performances sur les liaisons sujettes aux erreurs puisque dans la
plupart des cas une quantité non négligeable de données peuvent être reçues avant que TCP ne remarque qu’un paquet
est manquant ou cassé et ces données vont alors être bloquées voire effacées pendant que l’erreur est corrigée tandis
qu’avec QUIC ces données sont libres d’être traitées pendant que le flux multiplexé unique est réparé.
En octobre 2018, les groupes de travail HTTP et QUIC de l’IETF ont décidé conjointement d’appeler le mappage HTTP sur
QUIC « HTTP/3 » avant d’en faire une norme mondiale. HTTP/3 est dont bâti sur QUIC et fonctionne avec UDP plutôt
qu’avec TCP comme protocole de transport des données.
TCP est aujourd’hui encore considéré comme étant la norme et l’infrastructure Internet en général est configurée pour
fonctionner avec ce processus et dans certains cas certains composants peuvent bloquer UDP. Dans ces cas, un système
de repli rapide vers TCP qui n’entraine pas de latence est utilisé.
22/30
paquet est arrivé à sa destination (un peu comme une lettre sans accusé de réception).
L’en-tête d’un datagramme UDP est plus simple que celui de TCP. Il contient 4 champs :
• Le port source (16 bits) qui indique depuis quel port le paquet a été envoyé.
• Le port de destination (16 bits) qui indique à quel port le paquet doit être envoyé.
• La longueur (16 bits) qui indique la longueur totale (exprimée en octets) du segment UDP (en-tête et données). La
longueur minimale est donc de 8 octets (taille de l’en-tête).
• La somme de contrôle (16 bits) qui permet de s’assurer de l’intégrité du paquet reçu quand elle est différente de zéro.
Elle est calculée sur l’ensemble de l’en-tête UDP et des données, mais aussi sur un pseudo en-tête (extrait de l’en-tête IP).
HTTP ET SECURITE
23/30
ressource cible. Le client peut répéter la demande avec un champ d’en-tête Proxy-Authorization nouveau ou remplacé.
AuthType Basic
AuthName "Accès à l’espace protégé"
AuthUserFile /path/to/.htpasswd
Require valid-userLe fichier .htaccess fait référence à un fichier .htpasswd dans lequel chaque ligne se compose d’un
nom d’utilisateur et d’un mot de passe séparés par deux points (« : »). Vous ne pouvez pas voir les mots de passe réels
car ils sont cryptés (md5 dans ce cas).
Pour nginx, vous devrez spécifier un emplacement que vous allez protéger et la directive auth_basic qui fournit le nom de
la zone protégée par mot de passe. La directive auth_basic_user_file pointe ensuite vers un fichier .htpasswd contenant
les informations d’identification utilisateur chiffrées, tout comme dans l’exemple Apache ci-dessus.
24/30
physique. Cette la raison pour laquelle on l’utilise avec des améliorations comme HTTPS pour protéger les informations
sensibles ou précieuses.
26/30
• Access-Control-Expose-Headers : indique quels en-têtes peuvent être exposés dans le cadre de la réponse en
répertoriant leurs noms ;
• Access-Control-Max-Age: indique le nombre de secondes (5 par défaut) pendant lesquelles les informations fournies
par les en-têtes Access-Control-Allow-Methods et Access-Control-Allow-Headers peuvent être mises en cache ;
• Access-Control-Request-Headers : indique les en-têtes qu’une future requête CORS à la même ressource pourrait
utiliser ;
• Access-Control-Request-Method : indique la méthode qu’une future requête CORS à la même ressource pourrait
utiliser ;
• Origin : indique d’où provient une récupération (un fetch).
fonctionnalités
Au cours du temps, les possibilités du web ont été multipliés et les sites web ont progressivement intégrés de nouveaux
contenus et fait de plus en plus appel à des contenus externes (en intégrant des polices Google, des frameworks, des
scripts externes comme Google Analytics, etc.) tout en développant leur éventail de fonctionnalités.
Face à cela, des politiques de sécurité ont dû être mises en place pour éviter que les navigateurs et les serveurs ne
soient sujets à des attaques et corruptions en suivant aveuglément n’importe quelle requête.
Il existe deux grands types de politique de sécurité aujourd’hui : la politique de sécurité liée aux contenus ou CSP pour
Content Security Policy et la politique liée aux fonctionnalités au Feature Policy.
27/30
ANNEXE 1 : Liste des en-têtes HTTP (HTTP headers)
19) Liste des en-têtes HTTP ou HTTP headers
Les en-têtes HTTP sont très nombreux et permettent d’ajouter des informations de contexte ou de préciser une requête
ou une réponse HTTP.
La liste des en-têtes HTTP (HTTP headers) est la suivante :
• Accept
• Accept-Charset
• Accept-Encoding
• Accept-Language
• Accept-Patch
• Accept-Ranges
• Access-Control-Allow-Credentials
• Access-Control-Allow-Headers
• Access-Control-Allow-Methods
• Access-Control-Allow-Origin
• Access-Control-Expose-Headers
• Access-Control-Max-Age
• Access-Control-Request-Headers
• Access-Control-Request-Method
• Age
• Allow
• Alt-Svc
• Authorization
• Cache-Control
• Clear-Site-Data
• Connection
• Content-Disposition
• Content-Encoding
• Content-Language
• Content-Length
• Content-Location
• Content-Range
• Content-Security-Policy
• Content-Security-Policy-Report-Only
• Content-Type
• Cookie
• Cross-Origin-Resource-Policy
• DNT
• Date
• ETag
• Early-Data
• Expect
• Expect-CT
• Expires
• Feature-Policy
• Forwarded
• From
• Host
• If-Match
• If-Modified-Since
• If-None-Match
• If-Range
• If-Unmodified-Since
• Index
• Keep-Alive
• Last-Modified
• Link
• Location
• Origin
• Proxy-Authenticate
• Proxy-Authorization
• Public-Key-Pins
• Public-Key-Pins-Report-Only
• Range
• Referer
• Referrer-Policy
• Retry-After
• Save-Data
28/30
• Sec-WebSocket-Accept
• Server
• Server-Timing
• Set-Cookie
• SourceMap
• Strict-Transport-Security
• TE
• Timing-Allow-Origin
• Tk
• Trailer
• Transfer-Encoding
• Upgrade-Insecure-Requests
• User-Agent
• Vary
• Via
• WWW-Authenticate
• Warning
• X-Content-Type-Options
• X-DNS-Prefetch-Control
• X-Frame-Options
• X-XSS-Protection
29/30
• 425 Too Early
• 426 Upgrade Required
• 428 Precondition Required
• 429 Too Many Requests
• 431 Request Header Fields Too Large
• 451 Unavailable For Legal Reasons
• 500 Internal Server Error
• 501 Not Implemented
• 502 Bad Gateway
• 503 Service Unavailable
• 504 Gateway Timeout
• 505 HTTP Version Not Supported
• 506 Variant Also Negotiates
• 507 Insufficient Storage
• 508 Loop Detected
• 510 Not Extended
• 511 Network Authentication Required
30/30