HTTP Le protocole que chaque développeur Web doit connaître - Partie 2

Dans mon article précédent, nous avons abordé certaines des bases de HTTP, telles que le schéma d'URL, les codes d'état et les en-têtes de requête / réponse. Sur cette base, nous examinerons les aspects plus précis de HTTP, tels que la gestion des connexions, l’authentification et la mise en cache HTTP. Ces sujets sont assez étendus, mais nous allons couvrir les éléments les plus importants.


Connexions HTTP

Une connexion doit être établie entre le client et le serveur avant de pouvoir communiquer entre eux, et HTTP utilise le protocole de transport TCP fiable pour établir cette connexion. Par défaut, le trafic Web utilise le port TCP 80. Un flux TCP est divisé en paquets IP et garantit que ces paquets arrivent toujours dans le bon ordre sans échec. HTTP est un protocole de couche d'application sur TCP, qui est sur IP.

HTTPS est une version sécurisée de HTTP insérant une couche supplémentaire entre HTTP et TCP, appelée TLS ou SSL (Transport Layer Security ou Secure Sockets Layer, respectivement). HTTPS communique par défaut sur le port 443 et nous examinerons plus tard HTTPS dans cet article..

Une connexion HTTP est identifiée par et . Sur un client, une application HTTP est identifiée par un tuple. L’établissement d’une connexion entre deux points de terminaison est un processus en plusieurs étapes et implique les étapes suivantes:

  • résoudre l'adresse IP du nom d'hôte via DNS
  • établir une connexion avec le serveur
  • envoyer une demande
  • attendre une réponse
  • fermer la connexion

Le serveur est responsable de toujours répondre avec les en-têtes et les réponses corrects.

Dans HTTP / 1.0, toutes les connexions étaient fermées après une seule transaction. Ainsi, si un client souhaitait demander trois images distinctes au même serveur, il établissait trois connexions distinctes à l'hôte distant. Comme vous pouvez le constater sur le diagramme ci-dessus, cela peut entraîner de nombreux retards sur le réseau, ce qui se traduit par une expérience utilisateur sous-optimale..

Pour réduire les délais d’établissement de connexion, HTTP / 1.1 a été introduit. connexions persistantes, connexions de longue durée qui restent ouvertes jusqu'à ce que le client les ferme. Les connexions persistantes sont définies par défaut dans HTTP / 1.1. Pour établir une connexion unique, le client doit définir Connexion: fermer en-tête de demande. Cela indique au serveur de fermer la connexion après l'envoi de la réponse..

En plus des connexions persistantes, les navigateurs / clients utilisent également une technique appelée connexions parallèles, minimiser les délais réseau. Le concept séculaire de connexions parallèles implique la création d'un pool de connexions (généralement limité à six connexions). Si le client doit télécharger six ressources à partir d'un site Web, il établit six connexions en parallèle pour télécharger ces ressources, ce qui accélère le traitement. Il s'agit d'une énorme amélioration par rapport aux connexions série où le client ne télécharge un actif qu'après le téléchargement d'un actif précédent..

Les connexions parallèles, associées à des connexions persistantes, constituent aujourd'hui la réponse à la réduction des délais réseau et à la création d'une expérience fluide sur le client. Pour un traitement approfondi des connexions HTTP, reportez-vous à la section Connexions de la spécification HTTP..

Gestion de la connexion côté serveur

Le serveur écoute principalement les connexions entrantes et les traite lorsqu'il reçoit une demande. Les opérations impliquent:

  • établir une socket pour commencer à écouter sur le port 80 (ou un autre port)
  • recevoir la demande et analyser le message
  • traitement de la réponse
  • définition des en-têtes de réponse
  • envoyer la réponse au client
  • fermer la connexion si un Connexion: fermer demande en-tête a été trouvé

Bien entendu, il ne s’agit pas d’une liste exhaustive des opérations. La plupart des applications / sites Web doivent savoir qui fait une demande afin de créer des réponses plus personnalisées. C'est le royaume de identification et authentification.


Identification et authentification

HTTP est un protocole de couche d'application sur TCP, qui est sur IP.

Il est presque impératif de savoir qui se connecte à un serveur pour suivre l'utilisation d'une application ou d'un site et les schémas d'interaction généraux des utilisateurs. Le principe d’identification est d’adapter la réponse afin de fournir une expérience personnalisée; naturellement, le serveur doit savoir qui est un utilisateur pour fournir cette fonctionnalité.

Un serveur peut collecter ces informations de différentes manières et la plupart des sites Web utilisent une approche hybride:

  • Demander des en-têtes: De, Référant, Agent utilisateur - Nous avons vu ces en-têtes dans la partie 1.
  • IP du client - l'adresse IP du client
  • Fat Urls - stocker l'état de l'utilisateur actuel en modifiant l'URL et en le redirigeant vers une URL différente à chaque clic; chaque clic accumule essentiellement l'état.
  • Biscuits - l'approche la plus populaire et non intrusive.

Les cookies permettent au serveur de joindre des informations arbitraires pour les réponses sortantes via le Set-Cookie en-tête de réponse. Un cookie est défini avec un ou plusieurs nom = valeur paires séparées par un point-virgule (;), un péché Set-Cookie: session-id = 12345ABC; nom d'utilisateur = nettuts.

Un serveur peut également restreindre les cookies à un domaine et chemin, et il peut les rendre persistants avec un expire valeur. Les cookies sont automatiquement envoyés par le navigateur pour chaque demande adressée à un serveur, et le navigateur garantit que seul le domaine- et chemin-Des cookies spécifiques sont envoyés dans la requête. L'en-tête de la demande Cookie: nom = valeur [; nom2 = valeur2] est utilisé pour envoyer ces cookies au serveur.

Le meilleur moyen d'identifier un utilisateur est de lui demander de s'inscrire et de se connecter, mais l'implémentation de cette fonctionnalité nécessite quelques efforts de la part du développeur, ainsi que de l'utilisateur..

Des techniques telles que OAuth simplifient ce type de fonctionnalité, mais nécessitent toujours l'accord de l'utilisateur pour fonctionner correctement. L’authentification joue ici un rôle important et c’est probablement le seul moyen d’identifier et de vérifier l’utilisateur..

Authentification

HTTP supporte une forme rudimentaire d’authentification appelée Authentification de base, ainsi que le plus sécurisé Authentification Digest.

Dans l’authentification de base, le serveur refuse initialement la demande du client avec une WWW-Authentifier en-tête de réponse et un 401 non autorisé code d'état. À la vue de cet en-tête, le navigateur affiche une boîte de dialogue de connexion, demandant un nom d'utilisateur et un mot de passe. Cette information est envoyée dans un format codé en base 64 dans le format Authentification en-tête de demande. Le serveur peut maintenant valider la demande et autoriser l'accès si les informations d'identification sont valides. Certains serveurs peuvent aussi envoyer un Authentification-Info en-tête contenant des informations d'authentification supplémentaires.

Un corollaire à l'authentification de base est Authentification proxy. Au lieu d'un serveur Web, le défi d'authentification est demandé par un proxy intermédiaire. Le proxy envoie un Authentification par procuration en-tête avec un 407 non autorisé code d'état. En retour, le client est supposé envoyer les identifiants via le Autorisation de procuration en-tête de demande.

L’authentification Digest est similaire à Basic et utilise la même technique de négociation avec le WWW-Authentifier et Autorisation en-têtes, mais Digest utilise une fonction de hachage plus sécurisée pour chiffrer le nom d'utilisateur et le mot de passe (généralement avec les fonctions de digest MD5 ou KD). Bien que l'authentification Digest soit censée être plus sécurisée que Basic, les sites Web utilisent généralement l'authentification Basic en raison de sa simplicité. Pour atténuer les problèmes de sécurité, l’authentification de base est utilisée conjointement avec SSL..

HTTP sécurisé

Le protocole HTTPS fournit une connexion sécurisée sur le Web. Le moyen le plus simple de savoir si vous utilisez HTTPS consiste à vérifier la barre d'adresse du navigateur. Le composant sécurisé de HTTP implique l'insertion d'une couche de cryptage / décryptage entre HTTP et TCP. C’est le protocole SSL (Secure Sockets Layer) ou le protocole TLS (Transport Layer Security) amélioré..

SSL utilise une forme de cryptage puissante utilisant RSA et la cryptographie à clé publique. Les transactions sécurisées étant si importantes sur le Web, un effort d'infrastructure à clé publique (PKI) basé sur des normes omniprésentes est en cours depuis quelque temps.

Les clients / serveurs existants ne doivent pas nécessairement changer la manière dont ils traitent les messages, car la majeure partie du travail pénible s'effectue dans la couche SSL. Ainsi, vous pouvez développer votre application Web à l’aide de l’authentification de base et bénéficier automatiquement des avantages de SSL en basculant vers le https: // protocole. Cependant, pour que l'application Web fonctionne avec HTTPS, vous devez disposer d'un certificat numérique fonctionnel déployé sur le serveur..

Certificats

Tout comme vous avez besoin de cartes d'identité pour montrer votre identité, un serveur Web a besoin d'un certificat numérique pour s'identifier. Les certificats (ou "certificats") sont émis par une autorité de certification et garantissent votre identité sur le Web. Les CA sont les gardiens de l'ICP. La forme de certificat la plus courante est la norme X.509 v3, qui contient des informations telles que:

  • l'émetteur du certificat
  • l'algorithme utilisé pour le certificat
  • le nom du sujet ou l'organisation pour laquelle ce certificat est créé
  • l'information de clé publique pour le sujet
  • la signature de l'autorité de certification, à l'aide de l'algorithme de signature spécifié

Lorsqu'un client effectue une demande via HTTPS, il tente d'abord de localiser un certificat sur le serveur. Si le certificat est trouvé, il tente de le vérifier par rapport à la liste connue des autorités de certification. S'il ne s'agit pas d'une des autorités de certification répertoriées, il est possible qu'une boîte de dialogue s'affiche pour avertir l'utilisateur du certificat du site Web..

Une fois le certificat vérifié, la négociation SSL est terminée et la transmission sécurisée est effective..


Mise en cache HTTP

Il est généralement admis que faire le même travail deux fois est une perte de temps. C’est le principe directeur du concept de la mise en cache HTTP, un pilier fondamental de l’Infrastructure de réseau HTTP. Comme la plupart des opérations se font sur un réseau, un cache permet de gagner du temps, d’économiser du temps et de la bande passante, tout en offrant une expérience améliorée sur le Web..

Les caches sont utilisés à plusieurs endroits de l'infrastructure réseau, du navigateur au serveur d'origine. Selon l'emplacement où il se trouve, un cache peut être classé comme suit:

  • Privé: dans un navigateur, met en cache les noms d’utilisateur, les mots de passe, les URL, l’historique de navigation et le contenu Web. Ils sont généralement petits et spécifiques à un utilisateur.
  • Publique: déployé en tant que proxy de mise en cache entre le serveur et le client. Celles-ci sont beaucoup plus grandes car elles servent plusieurs utilisateurs. Une pratique courante consiste à conserver plusieurs serveurs proxy de mise en cache entre le client et le serveur d'origine. Cela permet de servir le contenu fréquemment consulté, tout en permettant de se rendre sur le serveur pour du contenu rarement nécessaire..

Traitement du cache

Quel que soit l'endroit où se trouve un cache, le processus de maintenance d'un cache est assez similaire:

  • Recevoir demande de message.
  • Analyser l'URL et les en-têtes.
  • Chercher une copie locale; sinon, récupérez et stockez localement
  • Fait une vérification de la fraîcheur déterminer l'âge du contenu dans le cache; faire une demande pour actualiser le contenu seulement si nécessaire.
  • Créer le réponse à partir du corps mis en cache et des en-têtes mis à jour.
  • Envoyer la réponse au client.
  • Éventuellement, bûche la transaction.

Bien entendu, il incombe au serveur de toujours répondre avec les en-têtes et les réponses corrects. Si un document n'a pas changé, le serveur doit répondre par un message. 304 non modifié. Si la copie en cache a expiré, elle devrait générer une nouvelle réponse avec des en-têtes de réponse mis à jour et renvoyer avec un 200 OK. Si la ressource est supprimée, elle devrait revenir avec 404 introuvable. Ces réponses permettent d’ajuster le cache et d’éviter que le contenu obsolète ne soit conservé trop longtemps..

En-têtes de contrôle de cache

Les connexions parallèles, associées à des connexions persistantes, constituent aujourd'hui la réponse à la réduction des délais réseau..

Maintenant que nous avons une idée du fonctionnement d'un cache, il est temps d'examiner les en-têtes de demande et de réponse qui activent l'infrastructure de mise en cache. Maintenir le contenu à jour et à jour est l’une des responsabilités principales du cache. Pour que la copie en cache soit cohérente avec le serveur, HTTP fournit des mécanismes simples, à savoir: Expiration du document et Revalidation du serveur.

Expiration du document

HTTP permet à un serveur d'origine d'attacher un date d'expiration à chaque document en utilisant le Cache-Control et Expire réponse en-têtes. Cela aide le client et les autres serveurs de cache à savoir combien de temps un document est valide et actualisé. Le cache peut servir la copie tant que le âge du document est dans la date d'expiration. Une fois le document arrivé à expiration, le cache doit vérifier auprès du serveur une copie plus récente et mettre à jour sa copie locale en conséquence..

Expire est un en-tête de réponse HTTP / 1.0 plus ancien qui spécifie la valeur en tant que date absolue. Cela n'est utile que si les horloges du serveur sont synchronisées avec le client, ce qui est une hypothèse terrible à faire. Cet en-tête est moins utile que le plus récent Cache-Control: max-age = en-tête introduit dans HTTP / 1.1. Ici, max-age est un âge relatif, spécifié en secondes, à partir de la création de la réponse. Ainsi, si un document devait expirer après un jour, l'en-tête d'expiration devrait être Cache-Control: max-age = 86400.

Revalidation du serveur

Une fois qu'un document mis en cache a expiré, le cache doit être revalidé avec le serveur pour vérifier si le document a été modifié. C'est appelé revalidation du serveur et sert de mécanisme d'interrogation pour la manque de fraîcheur d'un document. Ce n’est pas parce qu’une copie en cache a expiré que le serveur dispose d’un contenu plus récent. La revalidation est simplement un moyen de s'assurer que le cache reste frais. En raison du délai d'expiration (spécifié dans une réponse précédente du serveur), le cache n'a pas à vérifier auprès du serveur pour chaque requête, ce qui permet d'économiser de la bande passante, du temps et de réduire le trafic réseau..

La combinaison de l'expiration des documents et de la revalidation du serveur est un mécanisme très efficace qui permet aux systèmes distribués de conserver des copies avec une date d'expiration..

Si le contenu change fréquemment, le délai d'expiration peut être réduit, ce qui permet aux systèmes de se synchroniser plus fréquemment..

L'étape de revalidation peut être réalisée avec deux types d'en-tête de requête: Si-Modifié-Depuis et Si-aucun-match. Le premier est destiné à la validation par date, tandis que le dernier utilise des balises Entity (ETags), un hachage du contenu. Ces en-têtes utilisent les valeurs date ou ETag obtenues à partir d'une réponse précédente du serveur. En cas de Si-Modifié-Depuis, la Dernière modification l'en-tête de réponse est utilisé; pour Si-aucun-match, c'est le ETag en-tête de réponse.

Contrôler le comportement

La période de validité d'un document doit être définie par le serveur qui génère le document. S'il s'agit d'un site Web de journal, la page d'accueil devrait expirer après une journée (ou parfois même toutes les heures!). HTTP fournit le Cache-Control et Expire en-têtes de réponse pour définir l'expiration des documents. Comme mentionné précédemment, Expire est basé sur des dates absolues et n'est pas une solution fiable pour contrôler le cache.

le Cache-Control header est beaucoup plus utile et a quelques valeurs différentes pour contraindre les clients à mettre en cache la réponse:

  • Cache-Control: pas de cache: le client est autorisé à stocker le document; cependant, il doit revalider avec le serveur à chaque demande. Il existe un en-tête de compatibilité HTTP / 1.0 appelé Pragma: no-cache, qui fonctionne de la même manière.
  • Cache-Control: pas de magasin: il s’agit d’une directive plus stricte à l’intention du client de ne pas stocker le document du tout.
  • Cache-Control: doit-revalider: ceci indique au client de contourner son calcul de fraîcheur et de toujours revalider avec le serveur. Il n'est pas autorisé de servir la réponse mise en cache au cas où le serveur serait indisponible..
  • Cache-Control: max-age: cela définit un délai d'expiration relatif (en secondes) à partir du moment où la réponse est générée.

De plus, si le serveur n'envoie pas de message Cache-Control En-têtes, le client est libre d’utiliser son propre algorithme d’expiration heuristique pour déterminer la fraîcheur..

Restreindre la fraîcheur du client

La capacité de transport ne se limite pas au serveur. Il peut également être spécifié à partir du client. Cela permet au client d'imposer des contraintes sur ce qu'il est prêt à accepter. Ceci est possible via le même Cache-Control en-tête, mais avec quelques valeurs différentes:

  • Cache-Control: min-fresh =: le document doit être frais pour au moins secondes.
  • Cache-Control: max-stale ou Cache-Control: max-stale =: le document ne peut pas être servi à partir du cache s'il a été périmé depuis plus de secondes.
  • Cache-Control: max-age =: le cache ne peut pas retourner un document qui a été mis en cache plus longtemps que secondes.
  • Cache-Control: pas de cache ou Pragma: no-cache: le client n'acceptera pas une ressource mise en cache sauf si celle-ci a été revalidée.

La mise en cache HTTP est en fait un sujet très intéressant et il existe des algorithmes très sophistiqués pour gérer le contenu mis en cache. Pour approfondir ce sujet, reportez-vous à la section Mise en cache de la spécification HTTP..


Résumé

Notre visite de HTTP a commencé avec la création de schémas d'URL, de codes d'état et d'en-têtes de requête / réponse. En nous basant sur ces concepts, nous avons examiné certaines des zones les plus fines de HTTP, telles que la gestion de connexion, l'identification et l'authentification et la mise en cache. J'espère que cette visite vous a donné un bon goût pour l'ampleur de HTTP et suffisamment d'indicateurs pour explorer plus avant ce protocole..

Références

  • RFC 2616, spécification HTTP
  • Guide définitif HTTP