Cette page a été traduite à partir de l'anglais par la communauté. Vous pouvez contribuer en rejoignant la communauté francophone sur MDN Web Docs.

View in English Always switch to English

En-tête Content-Digest

L'en-tête HTTP Content-Digest en-tête de requête et en-tête de réponse fournit un digest calculé à l'aide d'un algorithme de hachage appliqué au contenu du message. Un·e destinataire peut utiliser Content-Digest pour valider le contenu du message HTTP à des fins d'intégrité.

Le champ Want-Content-Digest permet à un·e expéditeur·ice de demander Content-Digest en précisant ses préférences d'algorithme de hachage. Un condensé de contenu diffère selon Content-Encoding et Content-Range, mais pas selon Transfer-Encoding.

Dans certains cas, un Repr-Digest peut être utilisé pour valider l'intégrité de messages partiels ou multi-parties par rapport à la représentation complète. Par exemple, dans les requêtes de plage, Repr-Digest a toujours la même valeur si seules les plages d'octets demandées diffèrent, tandis que le condensé de contenu est différent pour chaque partie. Pour cette raison, Content-Digest est identique à Repr-Digest lorsqu'une représentation est envoyée dans un seul message.

Type d'en-tête En-tête de requête, En-tête de réponse, En-tête de représentation
En-tête de requête interdit Non

Syntaxe

http
Content-Digest: <digest-algorithm>=<digest-value>

// Plusieurs algorithmes de condensé
Content-Digest: <digest-algorithm>=<digest-value>,<digest-algorithm>=<digest-value>, …

Content-Digest est un dictionnaire de champs structurés (RFC 9651: Valeurs de champs structurés pour HTTP), dont les clés sont <digest-algorithm> et les valeurs sont <digest-value>.

Directives

<digest-algorithm>

L'algorithme utilisé pour créer un condensé du contenu du message. Seuls deux algorithmes de condensé enregistrés sont considérés comme sûrs : sha-512 et sha-256. Les algorithmes de condensé enregistrés non sûrs (anciens) sont : md5, sha (SHA-1), unixsum, unixcksum, adler (ADLER32) et crc32c.

<digest-value>

Le condensé du contenu du message à l'aide de <digest-algorithm>, encodé en base64 et entouré de deux-points (:, ASCII 0x3A). Cet encodage est appelé séquence d'octets (angl.) dans la spécification.

Exemples

Dans tous les exemples, les points de terminaison sont configurés pour envoyer des en-têtes de condensé non sollicités. Les champs Want-Content-Digest et Want-Repr-Digest peuvent éventuellement être utilisés par un expéditeur pour demander un Content-Digest ou Repr-Digest avec leurs préférences d'algorithme de hachage.

Un Content-Digest SHA-256 dans une réponse

Un agent utilisateur demande une ressource :

http
GET /items/123 HTTP/1.1
Host: example.com
Want-Content-Digest: sha-256=10, sha=3

Le serveur répond avec un Content-Digest du contenu du message utilisant l'algorithme SHA-256 : Le condensé est calculé sur les octets exacts du corps du message, {"hello": "mdn"} (16 octets, sans inclure explicitement de saut de ligne final) :

http
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 16
Content-Digest: sha-256=:bMGjiT1wkArOzyB9ReAdpW51FV4mHlQygPXGp+TtzG4=:

{"hello": "mdn"}

Valeurs identiques de Content-Digest et Repr-Digest

Un agent utilisateur demande une ressource :

http
GET /items/123 HTTP/1.1
Host: example.com

Le serveur répond avec un Content-Digest et un Repr-Digest du contenu du message utilisant l'algorithme SHA-256 : Les champs Repr-Digest et Content-Digest ont des valeurs identiques, car ils sont calculés en utilisant le même algorithme sur les mêmes octets, {"hello": "mdn"} (16 octets), et dans ce cas, l'ensemble de la représentation est envoyé dans un seul message :

http
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 16
Content-Digest: sha-256=:bMGjiT1wkArOzyB9ReAdpW51FV4mHlQygPXGp+TtzG4=:
Repr-Digest: sha-256=:bMGjiT1wkArOzyB9ReAdpW51FV4mHlQygPXGp+TtzG4=:

{"hello": "mdn"}

Valeurs différentes de Content-Digest et Repr-Digest

Un agent utilisateur demande uniquement une partie d'une ressource en utilisant une requête de plage :

http
GET /items/123 HTTP/1.1
Host: example.com
Range: bytes=0-7

Le serveur répond avec un 206 Partial Content contenant uniquement les octets demandés, {"hello" (8 octets), comme contenu du message. Content-Digest ne couvre que ces octets, tandis que Repr-Digest couvre toujours l'ensemble de la représentation, {"hello": "mdn"} (16 octets), donc les deux valeurs diffèrent :

http
HTTP/1.1 206 Partial Content
Content-Type: application/json
Content-Range: bytes 0-7/16
Content-Digest: sha-256=:pKQv0IAKChzGfyfxu5TNqcnvxIzaG4XICf6NQnB1YhY=:
Repr-Digest: sha-256=:bMGjiT1wkArOzyB9ReAdpW51FV4mHlQygPXGp+TtzG4=:

Condensé d'une représentation gzip-encodée

Dans cette requête, le client utilise l'en-tête Accept-Encoding pour indiquer qu'il accepte la compression gzip :

http
GET /items/123 HTTP/1.1
Host: example.com
Accept-Encoding: gzip

La réponse du serveur inclut l'en-tête Content-Encoding, indiquant que les octets du message proviennent de la représentation gzip de la ressource. Le condensé est calculé sur les octets gzip-encodés au lieu du texte original non encodé. Ici, le corps JSON de 16 octets {"hello": "mdn"} est compressé en gzip pour obtenir une représentation de 36 octets, et Content-Digest et Repr-Digest sont calculés sur ces 36 octets (affichés ici en hexadécimal pour plus de lisibilité) :

http
HTTP/1.1 200 OK
Content-Type: application/json
Content-Encoding: gzip
Content-Length: 36
Content-Digest: sha-256=:6Gx6u1ZhhahDLs06Zc6ZEqXxUy8RNjy18CaMucjKOFk=:
Repr-Digest: sha-256=:6Gx6u1ZhhahDLs06Zc6ZEqXxUy8RNjy18CaMucjKOFk=:
1F 8B 08 00 00 00 00 00 02 FF AB 56 CA 48 CD C9 C9 57 B2 52 50 CA 4D C9 53 AA 05 00 35 D8 1D 91 10 00 00 00

Gestion de Content-Digest lorsqu'il n'y a pas de contenu

Si la même ressource est demandée avec une méthode HEAD au lieu de GET, la réponse ne contient aucun contenu :

http
HEAD /items/123 HTTP/1.1
Host: example.com

La valeur de Repr-Digest est la même que précédemment, car elle s'applique toujours à l'ensemble de la représentation, {"hello": "mdn"}. Cependant, le serveur n'envoie aucun contenu dans la réponse et peut omettre l'en-tête Content-Digest :

http
HTTP/1.1 200 OK
Content-Type: application/json
Repr-Digest: sha-256=:bMGjiT1wkArOzyB9ReAdpW51FV4mHlQygPXGp+TtzG4=:

Au lieu d'omettre Content-Digest lorsqu'il n'y a pas de contenu, un serveur peut le calculer explicitement sur une chaîne de caractères vide. Selon la Section 6.3 de la RFC 9530 (angl.), cela permet à un destinataire, en particulier lorsque le condensé est couvert par une signature de message HTTP, de vérifier qu'aucun contenu n'a été ajouté ou supprimé, plutôt que de se contenter de constater que l'en-tête a été omis :

http
HTTP/1.1 200 OK
Content-Type: application/json
Content-Digest: sha-256=:47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=:
Repr-Digest: sha-256=:bMGjiT1wkArOzyB9ReAdpW51FV4mHlQygPXGp+TtzG4=:

Agent utilisateur envoyant un condensé dans les requêtes

Dans l'exemple suivant, un agent utilisateur envoie un condensé du contenu du message en utilisant SHA-512. Le condensé est calculé sur les octets exacts du corps du message, {"recipient":"Alex","amount":900000000} (39 octets, sans inclure explicitement un retour à la ligne final). Comme l'ensemble de la représentation est envoyé dans cette seule requête, Content-Digest et Repr-Digest ont la même valeur :

http
POST /bank_transfer HTTP/1.1
Host: example.com
Content-Type: application/json
Content-Length: 39
Content-Digest: sha-512=:PlrIZYU3M76B30wGsL0h6O79BoxHTdAG+RnMPjOyECTSJCN/KnYdOrSCCWjxV3ckkyvdRmZ52//M3WbehCXcPw==:
Repr-Digest: sha-512=:PlrIZYU3M76B30wGsL0h6O79BoxHTdAG+RnMPjOyECTSJCN/KnYdOrSCCWjxV3ckkyvdRmZ52//M3WbehCXcPw==:

{"recipient":"Alex","amount":900000000}

Spécifications

Spécification
Digest Fields
# section-2

Compatibilité des navigateurs

Cet en-tête ne possède aucune intégration avec les navigateurs définie par la spécification (« compatibilité des navigateurs » non applicable). Les développeur·euse·s peuvent définir et obtenir des en-têtes HTTP à l'aide de fetch() afin de fournir un comportement spécifique à l'application.

Voir aussi