Glossaire

Ce que rrweb enregistre, et comment fonctionnent ses options de confidentialité

Taras Shynkarenko
Taras Shynkarenko
•Mis à jour : •10 min de lecture
Ce que rrweb enregistre, et comment fonctionnent ses options de confidentialitéCe que rrweb enregistre, et comment fonctionnent ses options de confidentialité

TL;DR, Réponse rapide

10 min de lecture

La bibliothèque open source rrweb enregistre une session navigateur sous la forme d'un snapshot sérialisé du DOM suivi d'un flux d'événements incrémentaux (mutations du DOM, mouvements de souris, clics, défilements, redimensionnements et saisies), puis reconstruit la page dans une iframe sandboxée pour la rejouer. Elle n'enregistre aucune vidéo. Elle est sous licence MIT, et son guide oriente désormais les nouveaux projets vers @rrweb/record et @rrweb/replay plutôt que vers l'ancien paquet rrweb. Par défaut, elle ne masque que les champs de mot de passe ; maskAllInputs, blockClass, maskTextClass et leurs équivalents par sélecteur élargissent ce masquage.

Qu'est-ce que rrweb ?

La bibliothèque open source rrweb, abréviation de "record and replay the web", enregistre la session d'un utilisateur dans le navigateur sous forme de JSON structuré et la rejoue comme une reconstruction regardable de la page. Le README du projet la décrit comme "a tool for recording and replaying users' interactions on the web." Elle se trouve sur github.com/rrweb-io/rrweb, le dépôt a été créé en octobre 2018, et le code est écrit en TypeScript pour que l'enregistreur et le lecteur partagent un même format d'événements typé.

rrweb est une bibliothèque, pas un produit. Elle vous donne un enregistreur qui émet des événements et un lecteur qui les consomme. Où vont ces événements, combien de temps vous les gardez et qui peut les regarder, c'est le travail de votre code. Cette séparation explique pourquoi tant d'outils de replay commerciaux partent d'elle, et pourquoi le session replay en général se ressemble autant d'un éditeur à l'autre.

rrweb enregistre-t-il de la vidéo ?

Non. rrweb enregistre l'état de la page, pas ses pixels. Au démarrage, l'enregistreur parcourt le DOM et le sérialise en un arbre de nœuds, chacun avec un id numérique unique. La documentation de sérialisation du projet qualifie ce résultat de "descriptive" : les scripts sont remplacés par des balises noscript de substitution, les valeurs des champs sont copiées dans un attribut value, les URL relatives deviennent absolues, et les feuilles de style externes sont intégrées pour que le replay s'affiche encore quand le CSS d'origine est inaccessible.

Après ce snapshot complet, tout est un diff. L'enregistreur attache un MutationObserver et un ensemble d'écouteurs, et la documentation de l'observer liste ce qu'il capture :

  • Changements du DOM : création et suppression de nœuds, changements d'attributs et de texte
  • Mouvements de souris
  • Interactions souris : mouse up et down, clic, double clic, menu contextuel, focus, blur, et touch start, move et end
  • Défilement de la page ou d'un élément
  • Changements de taille de la fenêtre
  • Saisies

Chaque événement porte un timestamp et un type numérique. Les types d'événements sont DomContentLoaded, Load, FullSnapshot, IncrementalSnapshot, Meta et Custom, et les événements incrémentaux ajoutent un champ data.source qui indique si le changement était une mutation, un mouvement de souris, un défilement, etc.

Le replayer reconstruit le snapshot dans une iframe et applique les événements incrémentaux dans l'ordre. Il n'exécute jamais le JavaScript de la page enregistrée. La documentation sandbox de rrweb explique que l'attribut sandbox de l'iframe bloque l'envoi de formulaires, les pop-ups comme window.open, et les scripts, y compris les gestionnaires inline et les URL javascript:. Comme la page est reconstruite à partir de nœuds, le texte d'un replay est du vrai texte que vous pouvez sélectionner. Si vous avez vraiment besoin d'un fichier vidéo, le monorepo fournit rrvideo, qu'il décrit comme "a tool for transforming the session recorded by rrweb into a video."

La même dépendance à MutationObserver fixe le plancher navigateur de rrweb. Le guide indique que "rrweb does not support IE11 and below because it uses the MutationObserver API".

Quels paquets rrweb installer ?

Le guide de rrweb recommande @rrweb/record plus @rrweb/replay pour la plupart des projets, et @rrweb/all si vous voulez un seul import pour l'enregistrement, le replay et le packer. Le tableau liste les principaux paquets du monorepo tels que leur README les décrit. Tous étaient en version 2.1.6 sur npm, publiée le 18 septembre 2026, au moment de la rédaction de cette page.

PaquetRôle
@rrweb/recordLe code d'enregistrement, prévu pour tourner dans votre application front-end ou votre page
@rrweb/replayReconstruit et rejoue les événements enregistrés dans une iframe
@rrweb/allEnregistrement, replay et packer dans un seul paquet, sans plugins
rrweb-playerUne interface de lecture avec pause, avance rapide et navigation, construite sur @rrweb/replay
rrweb-snapshotSérialise le DOM et le reconstruit, la base de l'événement FullSnapshot
@rrweb/packerCompression par événement avant l'envoi réseau
@rrweb/types, @rrweb/utilsTypes et utilitaires partagés
rrdom, rrdom-nodejsUn DOM virtuel utilisé pour faire défiler rapidement les mutations pendant le replay, plus une version Node.js
rrvideoConvertit un enregistrement en vidéo
rrwebLe paquet d'origine, avec enregistrement et replay ensemble

C'est sur le paquet rrweb d'origine que la documentation et le registre ne sont pas d'accord. Le guide dit : "The rrweb package is deprecated. It still works, but new projects should use @rrweb/record and @rrweb/replay." Sur npm, rrweb 2.1.6 ne porte aucun avis de dépréciation, et il se télécharge toujours plus que son remplaçant : l'API de téléchargements de npm a compté 1,874,214 téléchargements de rrweb sur la semaine du 15 au 21 septembre 2026, contre 498,366 pour @rrweb/record. Quiconque l'installe ne reçoit aucun avertissement. Si vous partez de zéro, suivez le guide et installez les paquets séparés, parce que le paquet rrweb est celui que les mainteneurs prévoient d'alléger puis de retirer.

Sous quelle licence rrweb est-il publié ?

rrweb est publié sous licence MIT. Le fichier LICENSE du dépôt commence par "Copyright (c) 2018 Contributors", et npm indique MIT pour chacun des paquets ci-dessus. La licence MIT vous permet d'utiliser, de modifier et de distribuer rrweb dans un logiciel commercial fermé, à condition de conserver l'avis de copyright et le texte de la licence.

Cette licence permissive explique les forks. Le paquet de replay de Sentry dépend de @sentry/rrweb et @sentry/rrweb-snapshot, d'après son package.json dans le dépôt sentry-javascript. Le SDK navigateur de PostHog dépend de @posthog/rrweb et @posthog/rrweb-record. Les deux éditeurs maintiennent leur propre copie, donc un correctif dans rrweb en amont n'atteint leurs utilisateurs qu'une fois fusionné par l'éditeur, et les noms d'options et les valeurs par défaut de leurs SDK diffèrent de ceux de rrweb.

Quelles options de rrweb contrôlent la confidentialité ?

rrweb expose ses contrôles de confidentialité sous forme d'options de record(). Les noms et valeurs par défaut ci-dessous sont copiés du tableau Record Options de guide.md.

OptionDéfautRôle
blockClass'rr-block'Éléments à bloquer, sous forme de chaîne ou de RegExp
blockSelectornullUn sélecteur pour les éléments à bloquer
ignoreClass'rr-ignore'Éléments dont les événements de saisie sont ignorés, sous forme de chaîne ou de RegExp
ignoreSelectornullUn sélecteur pour les éléments à ignorer
maskTextClass'rr-mask'Éléments dont le texte est masqué, sous forme de chaîne ou de RegExp
maskTextSelectornullUn sélecteur pour les éléments à masquer
maskAllInputsfalseMasque tout le contenu des champs par des *
maskInputOptions{ password: true }Masque certains types de champs
maskInputFnaucunLogique personnalisée pour masquer le contenu des champs
maskTextFnaucunLogique personnalisée pour masquer le contenu texte
ignoreCSSAttributesnullUn tableau d'attributs CSS à ignorer
recordCanvasfalseEnregistrer ou non les éléments canvas
recordCrossOriginIframesfalseEnregistrer ou non les iframes cross-origin, ce qui exige d'injecter rrweb dans chaque frame enfant

Les trois classes se comportent différemment, et on les confond souvent. La section confidentialité du guide le détaille. Un élément avec .rr-block "will not be recorded. Instead, it will replay as a placeholder with the same dimension." Un élément avec .rr-ignore "will not record its input events." Et "all text of elements with the class name .rr-mask and their children will be masked." Bloquer supprime l'élément. Ignorer garde l'élément mais abandonne ce que l'utilisateur y tape. Masquer garde la mise en page et remplace les caractères.

Des mains tapent sur le clavier d'un ordinateur portable, comme les saisies de formulaire que rrweb enregistre si on ne les masque pas.

Trois classes de confidentialité, trois effets
blockClassSupprime l'élément, rejoue un espace réservé
ignoreClassConserve l'élément, ignore ses événements de saisie
maskTextClassConserve l'élément, remplace son texte
Chaque classe du tableau Record Options de rrweb modifie une partie différente de l'enregistrement.

Que masque rrweb par défaut ?

rrweb masque une seule chose par défaut : la valeur des champs de mot de passe. Le guide le dit en une ligne, "input[type="password"] will be masked by default", et le code source de l'enregistreur le confirme : quand maskAllInputs n'est pas true et que vous ne passez aucun maskInputOptions, l'enregistreur se rabat sur { password: true }.

Flowsery
Flowsery

Commencez votre essai gratuit de 14 jours

Tableau de bord en temps réel

Suivi des objectifs

Suivi sans cookies

Tout le reste, y compris les champs d'e-mail, de téléphone, d'adresse et de texte libre, quitte le navigateur tel que saisi, sauf si vous configurez davantage. maskInputOptions accepte ces clés, tirées de MaskInputOptions dans les types de rrweb-snapshot : color, date, datetime-local, email, month, number, range, search, tel, text, time, url, week, textarea, select et password. Définir maskAllInputs: true les active toutes d'un coup.

Aucune option ne permet de démasquer un enfant à l'intérieur d'un parent masqué. rrweb n'a aucun réglage unmask ou unblock, donc les éditeurs qui en proposent un l'ont construit dans leur fork. Si vous comparez les bibliothèques sur leurs valeurs par défaut, notre analyse des réglages par défaut de la censure des PII qui laissent des données exposées place rrweb à côté de Sentry et Clarity.

Une règle pratique pour une nouvelle installation : commencez avec maskAllInputs: true, ajoutez maskTextClass ou maskTextSelector à tout conteneur qui affiche des données de compte, et mettez blockClass sur les widgets tiers que vous n'avez aucune raison de voir.

Des rangées de baies de serveurs dans un centre de données, là où les enregistrements rrweb s'accumulent et occupent du stockage.

Comment réduire la taille d'un enregistrement rrweb ?

La recette de stockage de rrweb liste trois stratégies : bloquer les éléments du DOM qui émettent beaucoup d'événements, utiliser la configuration sampling pour abandonner des événements, et compresser ou dédupliquer ce que vous gardez.

L'option sampling allège les événements à l'intérieur d'un enregistrement plutôt que de choisir quelles sessions enregistrer. Ses clés viennent du type SamplingStrategy. mousemove prend false ou un seuil de throttling, mouseInteraction prend false ou une table par interaction, scroll et media prennent des seuils de throttling, input prend 'all' ou 'last', et canvas prend 'all' ou une fréquence de snapshots entre 1 et 60 par seconde. L'exemple de la recette définit scroll: 150 avec le commentaire "do not emit twice in 150ms" et input: 'last' pour ne garder que la valeur finale d'une séquence tapée. C'est de l'échantillonnage au niveau des événements, un levier différent du taux d'échantillonnage du session replay que proposent les éditeurs.

Pour la compression, @rrweb/packer fournit une fonction pack que vous passez en packFn, et le unpack correspondant va au replayer en unpackFn. La recette note que compresser toute la session côté backend est généralement plus efficace que la compression par événement. slimDOMOptions retire des parties du DOM comme les scripts et les commentaires, et checkoutEveryNth ou checkoutEveryNms prennent un nouveau snapshot complet à intervalles réguliers, ce qui vous permet de ne garder que la dernière portion d'une session quand une erreur se déclenche. Le guide prévient que c'est approximatif : avec checkoutEveryNth: 200, vous finissez par envoyer "the last 200 to 400 events".

Le coût de l'enregistrement est aussi une question de vitesse de page. Les chiffres publiés sur ce qu'un enregistreur ajoute à la taille du bundle et au temps du thread principal sont réunis dans de combien le session replay ralentit un site.

Questions fréquentes

rrweb est-il gratuit pour un usage commercial ?

Oui. rrweb est sous licence MIT, vous pouvez donc l'utiliser et le modifier dans un logiciel commercial fermé. Vous devez conserver l'avis de copyright et le texte de la licence avec le code que vous distribuez.

rrweb capture-t-il ce que tapent les utilisateurs ?

Oui, sauf si vous le masquez. rrweb enregistre les événements input et ne masque par défaut que input[type="password"]. Définissez maskAllInputs: true ou listez des types de champs précis dans maskInputOptions pour masquer davantage.

Quelle est la différence entre blockClass et maskTextClass dans rrweb ?

blockClass (par défaut 'rr-block') retire un élément de l'enregistrement et rejoue un placeholder de même taille. maskTextClass (par défaut 'rr-mask') garde l'élément et remplace le texte qu'il contient ainsi que celui de ses enfants.

Faut-il installer rrweb ou @rrweb/record ?

Installez @rrweb/record pour l'enregistrement et @rrweb/replay pour la lecture. Le guide de rrweb qualifie le paquet combiné rrweb de déprécié, même si npm n'affiche aucun avertissement de dépréciation dessus.

rrweb peut-il enregistrer le canvas et les iframes ?

Oui, les deux sont désactivés par défaut. recordCanvas: false et recordCrossOriginIframes: false sont les valeurs par défaut, et les iframes cross-origin exigent en plus d'injecter rrweb dans chaque frame enfant.

Quels navigateurs rrweb prend-il en charge ?

rrweb prend en charge les navigateurs qui implémentent MutationObserver. Son guide indique qu'il ne prend pas en charge Internet Explorer 11 et les versions antérieures.

Comment l'option sampling de rrweb réduit-elle la taille d'un enregistrement ?

La configuration sampling réduit le nombre d'événements à l'intérieur d'une session plutôt que d'éliminer des enregistrements entiers. scroll et media prennent un seuil de limitation, mousemove aussi, et input accepte 'last' pour ne garder que la dernière valeur d'une séquence saisie. L'exemple de la recette de stockage fixe scroll: 150, de sorte qu'un défilement n'est émis qu'une fois toutes les 150 millisecondes.

Flowsery
Flowsery

Commencez votre essai gratuit de 14 jours

Tableau de bord en temps réel

Suivi des objectifs

Suivi sans cookies

Peut-on convertir un enregistrement rrweb en fichier vidéo ?

Le monorepo rrweb inclut rrvideo, décrit comme "a tool for transforming the session recorded by rrweb into a video." Cela transforme un enregistrement composé d'un instantané du DOM et de mutations en un véritable fichier vidéo. rrweb lui-même n'enregistre toujours aucune vidéo ; rrvideo est une étape de conversion séparée, exécutée après coup.

Combien de téléchargements le paquet rrweb obsolète compte-t-il face à @rrweb/record ?

Pendant la semaine du 15 au 21 septembre 2026, npm a compté 1 874 214 téléchargements du paquet rrweb contre 498 366 pour @rrweb/record. Le guide qualifie rrweb d'obsolète, mais npm n'affiche aucun avertissement de dépréciation dessus, donc son installation n'affiche aucun avertissement. L'ancien paquet reste téléchargé bien plus souvent que son remplaçant.

Sentry et PostHog utilisent-ils directement le paquet rrweb original ?

Sentry et PostHog maintiennent chacun leur propre fork plutôt que de dépendre directement de rrweb. Le paquet de replay de Sentry dépend de @sentry/rrweb et @sentry/rrweb-snapshot, et le SDK navigateur de PostHog dépend de @posthog/rrweb et @posthog/rrweb-record. Un correctif dans le rrweb d'origine n'atteint leurs utilisateurs qu'une fois que l'éditeur l'a fusionné, et les noms d'options et valeurs par défaut de chaque fork diffèrent de ceux de rrweb.

Cet article vous a-t-il été utile ?

Dites-nous ce que vous en pensez !

Nous voir plus souvent sur Google

Un clic définit Flowsery comme source préférée. Nos articles remontent alors dans vos À la une, en mode IA et dans les aperçus IA.

Avant de partir...

Flowsery

Flowsery

Des analyses orientées revenus pour votre site web

Suivez chaque visiteur, source et conversion en temps réel. Simple, puissant et sans cookies.

Tableau de bord en temps réel

Suivi des objectifs

Suivi sans cookies

Termes connexes du glossaire

Comment fonctionne le session replay et ce qu'il ne voit pasComment fonctionne le session replay et ce qu'il ne voit pas
Glossaire

Comment fonctionne le session replay et ce qu'il ne voit pas

Le session replay reconstruit une visite à partir des mutations du DOM et des saisies, pas d'une vidéo. Ce qu'il capture, ce que le masquage cache, ses limites.

•9 min de lecture
Où les réglages par défaut de la censure des PII en relecture de session exposent vos donnéesOù les réglages par défaut de la censure des PII en relecture de session exposent vos données
Glossaire

Où les réglages par défaut de la censure des PII en relecture de session exposent vos données

Les réglages par défaut de la censure des PII en relecture de session varient : rrweb ne masque que les mots de passe, Sentry masque tout le texte.

•11 min de lecture
Ce que sept éditeurs publient sur la conservation des données de session replayCe que sept éditeurs publient sur la conservation des données de session replay
Glossaire

Ce que sept éditeurs publient sur la conservation des données de session replay

Comparatif de la conservation des données de session replay chez FullStory, Hotjar, Clarity, LogRocket, PostHog, Sentry et Datadog, et ce qu'exige le RGPD.

•10 min de lecture
De combien le session replay ralentit-il la vitesse d'un site ?De combien le session replay ralentit-il la vitesse d'un site ?
Glossaire

De combien le session replay ralentit-il la vitesse d'un site ?

La vraie réponse au ralentissement causé par le session replay, avec les chiffres publiés de rrweb et Sentry sur le script, le CPU et l'upload.

•9 min de lecture
Comment fonctionne la désactivation de Google Analytics, et ce que bloque chaque méthodeComment fonctionne la désactivation de Google Analytics, et ce que bloque chaque méthode
Glossaire

Comment fonctionne la désactivation de Google Analytics, et ce que bloque chaque méthode

Pour la désactivation de Google Analytics : module de navigateur, indicateur ga-disable ou refus du consentement. Ce que chacun bloque et où il s'arrête.

•9 min de lecture
D'où viennent les données quand on compare session replay vs heatmapsD'où viennent les données quand on compare session replay vs heatmaps
Glossaire

D'où viennent les données quand on compare session replay vs heatmaps

Le duel session replay vs heatmaps : une visite contre des milliers, et comment Hotjar, Datadog, PostHog, Clarity et FullStory relient heatmaps et replays.

•8 min de lecture

Articles connexes