AngularAtlaséd. 22.2

Chap. 17Sécurité et internationalisation72 / 75

Sécurité : XSS, sanitisation et CSP

Ce qu’Angular fait automatiquement contre le XSS, quand bypassSecurityTrust devient dangereux, plus la CSP avec nonce, Trusted Types et XSRF.

Angular part d’une règle simple : toute valeur liée dans un template est considérée comme non sûre, jusqu’à preuve du contraire. L’interpolation échappe le texte. [innerHTML] passe par le sanitizer. Les URL avec des schémas dangereux sont neutralisées. C’est pourquoi une XSS dans une application Angular apparaît presque toujours quand quelqu’un contourne ces protections, pas quand il les utilise.

Cette page montre ce qu’Angular fait automatiquement, où se trouvent les « portes dérobées » à chercher lors de la revue de code, et comment ajouter la deuxième ligne de défense : la Content Security Policy et les Trusted Types. À la fin, la protection XSRF de HttpClient.

Pourquoi c’est important
Une seule XSS permet à l’attaquant d’exécuter du JavaScript sur votre page, avec la session de l’utilisateur : il lit des données, envoie des requêtes en son nom, vole des tokens dans localStorage. Les protections par défaut couvrent les cas courants. Le reste dépend de ce que vous faites avec bypassSecurityTrust* et avec le DOM.

Contextes de sécurité

Angular choisit le traitement selon l’endroit où la valeur atterrit. Dans du texte, il l’échappe. Dans du HTML ([innerHTML]), il la nettoie : il garde les balises de mise en forme et supprime <script>, les attributs on*, <iframe> et les URL dangereuses. Dans une URL ([href], [src]), il neutralise les schémas comme javascript:. L’URL de ressource (la source d’un <iframe> ou d’un script) est le contexte le plus strict, car là une URL signifie du code qui sera exécuté.

<!-- Interpolation : le texte est ÉCHAPPÉ — « <b> » s’affiche tel quel, il ne devient pas une balise -->
<p>{{ comment.text }}</p>

<!-- [innerHTML] : le HTML est NETTOYÉ — les balises de mise en forme restent, les scripts et les gestionnaires d’événements sont supprimés -->
<div [innerHTML]="comment.html"></div>

<!-- URL : javascript: et les autres schémas dangereux deviennent « unsafe:… » -->
<a [href]="profile.website">site</a>

<!-- Styles : les valeurs de [style] sont aussi vérifiées -->
<div [style.background-image]="'url(' + user.avatar + ')'"></div>
LiveLe sanitizer d’Angular en direct
Rendu avec [innerHTML] (nettoyé automatiquement)

Bonjour, monde ! Voir la doc.

Ce qui reste après sanitizer.sanitize(SecurityContext.HTML, …)
<p><b>Bonjour</b>, <em>monde</em>&#160;! Voir la <a href="https://angular.dev">doc</a>.</p>

rien de supprimé le contenu était déjà sûr.

Avec bypassSecurityTrustHtml(…), Angular insérerait exactement le texte de la zone, gestionnaires d’événements compris. C’est pourquoi la démo ne le fait pas.

Choisissez un exemple dangereux : à gauche, vous voyez ce que rend [innerHTML] ; à droite, exactement ce que le sanitizer a laissé passer, et en dessous ce qui a été supprimé. En mode développement, Angular écrit un avertissement dans la console chaque fois qu’il supprime quelque chose ; c’est normal.

URL

Un lien dont l’href vient de l’utilisateur (« mon site web ») est un vecteur d’attaque classique : javascript:alert(document.cookie) exécute du code au clic. Angular préfixe les valeurs non sûres par unsafe:, de sorte que le navigateur ne peut plus les exécuter. Les schémas courants (https:, mailto:, chemins relatifs) passent sans changement.

LiveCe que reçoit [href]

Template: <a [href]="url()"> → l’attribut dans le DOM :

le lien rendu
Essayez javascript: et data:. L’attribut dans le DOM reçoit le préfixe unsafe:. Le clic n’exécute plus rien.

bypassSecurityTrust et les portes dérobées

DomSanitizer a cinq méthodes bypassSecurityTrust… (Html, Script, Style, Url, ResourceUrl). Elles marquent une valeur comme sûre, et Angular ne la vérifie plus. Elles ne sont légitimes que pour du contenu que vous construisez et contrôlez vous-même, par exemple l’URL d’un embed construite à partir d’un id validé. Sur des données d’utilisateurs ou d’une API externe, chaque appel est une vulnérabilité. La documentation d’Angular les qualifie de « sensibles pour la sécurité » : cherchez-les à chaque revue.

import { DomSanitizer, SafeHtml, SafeResourceUrl } from '@angular/platform-browser';

export class Embed {
  private readonly sanitizer = inject(DomSanitizer);

  // ✓ Uniquement pour du contenu que vous CONTRÔLEZ : une URL que vous construisez vous-même à partir d’un id validé
  readonly video: SafeResourceUrl = this.sanitizer.bypassSecurityTrustResourceUrl(
    `https://www.youtube-nocookie.com/embed/${encodeURIComponent(this.videoId())}`,
  );

  // ✗ Jamais sur une entrée qui vient de l’utilisateur ou d’une API externe
  unsafe(html: string): SafeHtml {
    return this.sanitizer.bypassSecurityTrustHtml(html); // XSS garantie si html contient un <img onerror>
  }
}

Plus dangereux encore, les chemins qui ne passent pas du tout par Angular : nativeElement.innerHTML, Renderer2.setProperty(…, 'innerHTML', …), document.write, eval et les templates construits à partir de chaînes à l’exécution.

// Tout cela CONTOURNE la sanitization d’Angular — évitez-le avec des données venues de l’extérieur :
this.el.nativeElement.innerHTML = userHtml;                     // DOM direct
this.renderer.setProperty(this.el.nativeElement, 'innerHTML', userHtml);
document.write(userHtml);
new Function(userCode)();  eval(userCode);
// et les templates construits à partir de chaînes contenant des saisies utilisateur (compilation JIT à l’exécution)

// ✓ L’alternative : [innerHTML] (nettoyé) ou, pour du markdown, une bibliothèque de rendu + sanitization

Content Security Policy

La CSP est un en-tête qui indique au navigateur quels scripts et styles ont le droit de s’exécuter. Même si un attaquant parvient à injecter du HTML, son script ne s’exécute pas sans le bon nonce ou hash. Angular ajoute des styles inline (les styles des composants), il lui faut donc un nonce. Il l’obtient soit par l’attribut ngCspNonce sur l’élément racine (le serveur le génère à chaque réponse), soit par le token CSP_NONCE.

L’alternative sans serveur qui génère la page à partir d’un template est security.autoCsp. Au moment du build, la CLI calcule les hashes des scripts inline et place la politique dans une balise <meta>, de sorte que index.html reste cacheable. La documentation en liste les limites : elle ne couvre que les scripts, certaines directives (par exemple frame-ancestors) doivent toujours être envoyées dans l’en-tête, et elle ne fonctionne pas avec le SSR.

import { CSP_NONCE } from '@angular/core';

// Option 1 (templating côté serveur) : le serveur place le même nonce dans l’en-tête et dans index.html
//   <app-root ngCspNonce="r4nd0m-per-request"></app-root>

// Option 2 : le nonce est disponible à l’exécution et vous voulez pouvoir mettre index.html en cache
bootstrapApplication(App, {
  providers: [{ provide: CSP_NONCE, useValue: globalThis.myRandomNonceValue }],
});

Trusted Types

Les Trusted Types vont un cran plus loin : le navigateur refuse toute écriture dans les « sinks » dangereux (innerHTML, le src d’un script…) qui ne passe pas par une politique approuvée. Angular a ses propres politiques : angular pour ce que fait le framework, angular#unsafe-bypass si vous utilisez bypassSecurityTrust*, angular#bundler pour les chunks lazy de la CLI. Un innerHTML écrit directement dans le code devient une erreur plutôt qu’une vulnérabilité.

# Le minimum pour une application Angular
Content-Security-Policy: trusted-types angular; require-trusted-types-for 'script';

# Si vous utilisez bypassSecurityTrust*
Content-Security-Policy: trusted-types angular angular#unsafe-bypass; require-trusted-types-for 'script';

# Si vous avez des chunks lazy créés par la CLI
Content-Security-Policy: trusted-types angular angular#bundler; require-trusted-types-for 'script';
LiveGénérateur de CSP
En-tête HTTP
Content-Security-Policy:
  script-src 'self' 'nonce-RANDOM_PER_RESPONSE';
  style-src 'self' 'nonce-RANDOM_PER_RESPONSE';
  object-src 'none';
  base-uri 'self';
  frame-ancestors 'none';
  trusted-types angular angular#bundler;
  require-trusted-types-for 'script';
Configuration dans Angular
<!-- index.html : le serveur remplace la valeur à chaque réponse -->
<app-root ngCspNonce="RANDOM_PER_RESPONSE"></app-root>

// ou, si le nonce est connu à l’exécution :
{ provide: CSP_NONCE, useValue: globalThis.myNonce }
Choisissez comment vous livrez le nonce et ce que l’application utilise. L’en-tête et la configuration Angular se mettent à jour instantanément.

XSRF / CSRF

Si l’authentification repose sur un cookie de session, une page tierce peut envoyer un formulaire à votre API, et le navigateur joint automatiquement le cookie. HttpClient intègre une protection : il lit le cookie XSRF-TOKEN et envoie la valeur dans l’en-tête X-XSRF-TOKEN. Seul le code de votre domaine peut lire le cookie, le serveur sait donc d’où vient la requête. L’en-tête n’est ajouté qu’aux requêtes qui modifient des données (pas à GET/HEAD), vers des URL relatives ou de la même origine. Le côté serveur est obligatoire : le serveur définit le cookie et vérifie l’en-tête.

import { provideHttpClient, withXsrfConfiguration, withNoXsrfProtection } from '@angular/common/http';

// Par défaut : HttpClient lit le cookie XSRF-TOKEN et envoie l’en-tête X-XSRF-TOKEN
// sur les requêtes qui MODIFIENT des données (POST, PUT, DELETE…) vers des URL relatives / la même origine.
provideHttpClient(
  withXsrfConfiguration({ cookieName: 'CSRF-TOKEN', headerName: 'X-CSRF-TOKEN' }), // si le backend utilise d’autres noms
);

// Le désactiver (p. ex. une API avec un Bearer token, sans cookie de session) :
provideHttpClient(withNoXsrfProtection());

Quand OUI, quand NON

À faire
  • Laissez Angular faire le binding : interpolation et [innerHTML], pas le DOM directement.
  • Une CSP stricte (nonce ou autoCsp) et les Trusted Types en production.
  • Des cookies de session HttpOnly, Secure, SameSite, et la protection XSRF activée (voir Authentification). Pour une connexion via un fournisseur externe, voir OAuth 2.1 / OIDC avec PKCE.
  • Mettez à jour Angular et les dépendances : les correctifs de sécurité arrivent dans les versions patch.
À ne pas faire
  • bypassSecurityTrustHtml sur du contenu venant d’utilisateurs ou de CMS externes.
  • Une validation « de sécurité » uniquement dans le frontend : chaque règle doit être revérifiée côté serveur.
  • Des access tokens dans localStorage sans CSP : une seule XSS peut les lire.
  • Désactiver les avertissements de sanitization « pour qu’ils ne s’affichent plus dans la console » : ils vous montrent exactement où du HTML non sûr entre.

Pièges fréquents

  • « La pipe safeHtml » du projet, qui appelle bypassSecurityTrustHtml sur n’importe quoi : c’est une XSS réutilisable. Supprimez-la ou limitez-la à des sources sûres.
  • Du markdown rendu avec bypassSecurityTrustHtml : le markdown peut contenir du HTML. Rendez-le, puis passez le résultat par la sanitization.
  • Des attributs href construits par concaténation dans nativeElement : ils contournent la sanitization des URL.
  • Une CSP ajoutée « à la fin » sans test : les chunks lazy ou les styles inline sont bloqués et l’application casse en production. Commencez par Content-Security-Policy-Report-Only.
  • XSRF désactivé alors qu’un cookie de session est actif : n’importe quel site peut faire des requêtes POST au nom de l’utilisateur.

Aide-mémoire

IMPLICITE (rien à faire)
  {{ x }}            échappé
  [innerHTML]        nettoyé (script, on*, javascript:, iframe… supprimés) — avertissement en dev quand il supprime quelque chose
  [href] / [src]     URL dangereuses → "unsafe:…"
CONTOURNEMENTS (uniquement pour du contenu que vous contrôlez — à chercher en revue de code)
  bypassSecurityTrustHtml / Url / ResourceUrl / Style / Script
  nativeElement.innerHTML, Renderer2.setProperty('innerHTML'), document.write, eval, templates construits à partir de chaînes
CSP
  ngCspNonce="…" on the root  or  { provide: CSP_NONCE, useValue }  — un nonce par réponse
  "security": { "autoCsp": true }  — hashes au build, index.html cacheable, PAS avec le SSR, scripts uniquement
TRUSTED TYPES
  trusted-types angular [angular#unsafe-bypass] [angular#bundler]; require-trusted-types-for 'script'
XSRF
  XSRF-TOKEN → X-XSRF-TOKEN, uniquement les requêtes qui modifient, uniquement la même origine · withXsrfConfiguration · withNoXsrfProtection
SERVER
  tout revalider · HttpOnly + Secure + SameSite cookies · npm audit / mises à jour d’Angular

Chap. 17 · 0 sur 4 terminées

Leçon terminée ?

Marquez-la : elle apparaîtra sur votre carte, dans le sommaire et sur la page d’accueil.

Se marque toute seule une fois la leçon lue en entier.

  1. Sécurité : XSS, sanitisation et CSP
  2. Authentification : tokens et refresh
  3. OAuth 2.1 et OpenID Connect avec PKCE
  4. Internationalisation (i18n)
Voir toute votre carte

Les 75 pages · tapez pour filtrer

  • 01Nouveautés d’Angular 21 & 22Tous les changements importants de la v21 et de la v22, en bref, avec un lien vers la page qui explique chacun.Départ
  • 01Votre première application, pas à pasUne liste de lecture construite d’un composant vide jusqu’à une application terminée — signals, @for, inputs et outputs, un service et un formulaire, pas à pas.Départ
  • 01Décisions rapides« Où mettre ça ? », « Signal ou Observable ? », « Shared ou feature ? » — des réponses courtes aux questions de tous les jours.Départ
  • 01Questions d’entretien Angular60 vraies questions d’entretien pour profils junior, confirmé et senior, avec la réponse à donner, la relance et les signaux d’alerte. Plus un entretien blanc.Départ
  • 02Standalone et bootstrapComment une application démarre sans NgModule : bootstrapApplication, app.config.ts, imports dans le composant.Fondamentaux modernes
  • 02Data binding et événementsInterpolation, bindings de propriétés et d’attributs, événements avec $event et filtres de touches, et comment [( )] est construit — ce qui entre dans le DOM et ce qui en revient.Fondamentaux modernes
  • 02Control Flow : @if, @for, @switchLa syntaxe de blocs qui remplace *ngIf/*ngFor/ngSwitch, avec track, @empty et vérifications d’exhaustivité.Fondamentaux modernes
  • 02@let et les nouvelles expressions de templateVariables locales avec @let, fonctions fléchées, spread, regex, instanceof, commentaires dans les balises.Fondamentaux modernes
  • 02@defer — Lazy Loading dans les templatesChargez les composants lourds uniquement quand c’est nécessaire : triggers, prefetch, placeholder, loading, error.Fondamentaux modernes
  • 02Bindings de classe et de stylePourquoi [class.x] et [style.x] ont remplacé ngClass et ngStyle (avec migration automatique depuis la v21).Fondamentaux modernes
  • 02Styles des composants et encapsulation:host, les trois modes d’encapsulation, les thèmes avec des variables CSS, et pourquoi ::ng-deep est un dernier recours.Fondamentaux modernes
  • 02Pipes : quand et commentPipes pures vs impures, pipes personnalisées, et comment choisir entre une pipe, computed() et une méthode.Fondamentaux modernes
  • 03signal() et computed()Les primitives réactives : état modifiable, état dérivé, égalité, untracked et règles d’immutabilité.Signals et réactivité
  • 03effect() — quand OUI, quand NONEffets de bord synchronisés avec les Signals : localStorage, logs, API impératives. Et leurs pièges.Signals et réactivité
  • 03linkedSignal() — état dérivé modifiableUn signal qui se réinitialise quand sa source change, mais que vous pouvez aussi modifier à la main.Signals et réactivité
  • 03resource, rxResource, httpResourceDes données asynchrones sous forme de Signals : status, value, error, reload, annulation automatique. Stable depuis la v22.Signals et réactivité
  • 03debounced() — signals différésLa version « debounce » d’un signal, sans RxJS. Parfait pour la recherche.Signals et réactivité
  • 03Listes : rechercher, filtrer, trier, paginerUne chaîne de signals computed qui ne recalcule que ce qui a changé, avec les filtres dans l’URL pour qu’un lien rouvre la même vue.Signals et réactivité
  • 03Les Observables depuis zéroCe qu’est un Observable, subscribe et unsubscribe, les opérateurs que vous utilisez chaque semaine, froid ou chaud — et quand un signal suffit.Signals et réactivité
  • 03Signals ↔ RxJStoSignal, toObservable, takeUntilDestroyed, outputFromObservable — et quand RxJS reste le bon choix.Signals et réactivité
  • 04input() et output()Les inputs comme Signals (required, transform, alias) et les outputs typés. Les données descendent, les événements remontent.Composants : communication
  • 04model() — binding bidirectionnelLe « banana-in-a-box » [( )] avec une seule API. Quand l’utiliser, et quand input + output est préférable.Composants : communication
  • 04viewChild et contentChildLes queries comme Signals : viewChild, viewChildren, contentChild, contentChildren, l’option read.Composants : communication
  • 04Lifecycle et DestroyRefQuels hooks comptent encore à l’ère des Signals, afterNextRender, DestroyRef et ngOnChanges typé.Composants : communication
  • 04Projection de contenung-content avec select, plusieurs slots, contenu par défaut et le piège de la projection conditionnelle.Composants : communication
  • 04ng-template et ngTemplateOutletLes templates comme valeurs : les render props en Angular, contexte typé et personnalisation des composants.Composants : communication
  • 05Smart vs DumbContainer vs présentation : qui détient l’état, qui se contente d’afficher, et comment bien les séparer.Conception des composants
  • 05Composants génériques <T>Un DataTable<T> ou un Select<T> correctement typé, avec des templates pour les cellules.Conception des composants
  • 05Composants dynamiquesNgComponentOutlet, createComponent avec inputBinding/outputBinding, et un tableau de bord construit à partir d’une configuration.Conception des composants
  • 05Directives et composition d’hôteLes directives d’attribut, les métadonnées host: {} et la Directive Composition API (hostDirectives).Conception des composants
  • 05Contrôles de formulaire personnalisésFormValueControl (Signal Forms) vs ControlValueAccessor : une notation par étoiles, dans les deux variantes.Conception des composants
  • 05Change DetectionOnPush est la valeur par défaut depuis la v22, Zone.js a disparu depuis la v21. Ce qui déclenche le rendu et comment éviter les mauvaises surprises.Conception des composants
  • 06inject() et @Service()Le nouveau décorateur @Service() de la v22, inject() vs le constructeur, et le contexte d’injection.Dependency Injection
  • 06Providers et hiérarchie des injecteursRoot vs route vs composant, useClass/useValue/useFactory/useExisting, et les modificateurs optional/self/skipSelf.Dependency Injection
  • 06InjectionToken et provideX()Configuration typée, fonctions provideFeature(), makeEnvironmentProviders et initializers.Dependency Injection
  • 06injectAsync() — services en Lazy LoadingChargez un service lourd uniquement quand vous en avez besoin, avec prefetch à l’idle.Dependency Injection
  • 07Structure des dossierscore / shared / features, ce que contient chacun, et à quoi ressemble l’intérieur d’une feature.Architecture d’application
  • 07Shared vs featureQuand déplacer un composant dans shared et (surtout) quand NE PAS le faire. Une checklist concrète.Architecture d’application
  • 07Interfaces et modèlesInterface en ligne ou fichier séparé ? DTO vs modèle de domaine, type vs interface, où les ranger.Architecture d’application
  • 07State Management avec les SignalsStores simples à base de Signals, facades, état local vs global, et quand NgRx devient nécessaire.Architecture d’application
  • 07Guide de style et nommageLes conventions officielles actuelles : noms de fichiers sans suffixes, protected, readonly, ordre des membres.Architecture d’application
  • 07Barrels, alias et frontièresindex.ts, alias de chemins, API publique d’une feature et règles de dépendances vérifiables automatiquement.Architecture d’application
  • 07Erreurs : @boundary et ErrorHandlerLe nouveau bloc @boundary de la v22.2, l’ErrorHandler global, les erreurs HTTP et les erreurs de resource.Architecture d’application
  • 08Routing moderne et Lazy LoadingloadComponent, routes enfants, paramètres comme inputs et héritage des paramètres (le nouveau comportement par défaut de la v22).Routing
  • 08Guards et resolverscanActivate, canMatch, canDeactivate et resolve sous forme de fonctions, avec redirections via UrlTree / RedirectCommand.Routing
  • 09Signal Forms — les basesDes formulaires bâtis sur les Signals : form(), [formField], validation par schéma. Stable depuis la v22.Formulaires
  • 09Signal Forms — avancéValidation personnalisée et inter-champs, async/HTTP avec debounce, listes dynamiques, désactivé/masqué, schémas réutilisables.Formulaires
  • 09Reactive Forms typésFormGroup typé, nonNullable, FormArray — et leur cohabitation avec les Signal Forms.Formulaires
  • 10HttpClient, interceptors et couche d’APIHttpClient sans configuration (v21), Fetch par défaut (v22), interceptors fonctionnels et une couche d’API avec mapping des DTO.HTTP et données
  • 11Performance — une checklistCe qui compte vraiment : OnPush + Signals, track, @defer, routes en Lazy Loading, images, bundles et Hydration.Qualité et performance
  • 11Tests avec VitestVitest est le runner par défaut depuis la v21. TestBed, composants avec Signals, services, HTTP et harnesses.Qualité et performance
  • 11DevTools : regarder dans votre applicationChrome DevTools et Angular DevTools pas à pas : ce que montre chaque panneau, avec des exercices qui fonctionnent sur ce site.Qualité et performance
  • 11Angular AriaDes composants headless et accessibles que vous stylez comme vous voulez : tabs, accordion, menu, listbox...Qualité et performance
  • 12SSR, Prerendering et modes de renduQuand rendre sur le serveur, quand au build et quand uniquement dans le navigateur : RenderMode par route, app.routes.server.ts et les coûts réels.SSR et Hydration
  • 12Hydration : event replay et incrémentaleComment le navigateur reprend le HTML du serveur sans le re-rendre : Hydration complète, event replay, @defer (hydrate on …) et erreurs de mismatch.SSR et Hydration
  • 12Code compatible serveurwindow n’existe pas sur le serveur : PLATFORM_ID, afterNextRender, DOCUMENT, TransferState, le cache HTTP et PendingTasks.SSR et Hydration
  • 13Micro frontendsQuand découper une application en plusieurs déploiements vaut le coup, et quand c’est juste de la complexité : Native Federation, Module Federation, iframes, Web Components.Architecture à grande échelle
  • 13Web Components avec Angular ElementscreateCustomElement : un composant Angular utilisé comme balise HTML n’importe où, plus la communication entre applications via des événements et BroadcastChannel.Architecture à grande échelle
  • 13Monorepo, bibliothèques et frontièresUn workspace avec plusieurs applications et bibliothèques : ng generate library, Nx, points d’entrée secondaires, publication et règles de dépendances.Architecture à grande échelle
  • 13Architecture hexagonale (ports et adapters)Un domaine sans Angular, des ports sous forme de classes abstraites et des adapters interchangeables : HTTP, localStorage ou en mémoire, sans toucher à l’UI.Architecture à grande échelle
  • 14Les Signals sous le capotLe graphe réactif : producteurs et consommateurs, push-pull, pourquoi computed est lazy et sans glitch, le problème du diamant et quand les effects s’exécutent.Réactivité avancée
  • 14RxJS avancé : opérateurs d’ordre supérieurswitchMap, mergeMap, concatMap et exhaustMap sur un diagramme interactif, plus retry avec backoff, shareReplay et comment éviter les fuites.Réactivité avancée
  • 14NgRx SignalStoreState Management à grande échelle sur les Signals : withState, withComputed, withMethods, rxMethod, entités et hooks — et quand un store simple suffit.Réactivité avancée
  • 14Machines à états avec les signalsFini les états impossibles : une machine typée sur des signals, avec transitions, gardes et un diagramme d’états en direct.Réactivité avancée
  • 15WebSockets : un temps réel qui résiste au réseauUn socket typé sous forme de signals : reconnexion avec backoff et jitter, heartbeat, file d’attente hors ligne et sécurité SSR.Temps réel et hors ligne
  • 15Mises à jour optimistes et rollbackUne UI instantanée qui reste honnête : snapshot et rollback, réponses dans le désordre, clés d’idempotence.Temps réel et hors ligne
  • 15Offline-first : Service Worker et cacheLe Service Worker d’Angular : stratégies de cache, annonce des nouvelles versions et file d’attente pour les modifications faites hors ligne.Temps réel et hors ligne
  • 16Web WorkersDes calculs lourds sans bloquer l’UI : un vrai worker dans la page, l’échange de messages et quand ça n’en vaut pas la peine.UI avancée et performance
  • 16Listes géantes : virtual scroll100 000 lignes sans latence : le virtual scroll du CDK, itemSize, trackBy et les alternatives (pagination, scroll infini).UI avancée et performance
  • 16Animations modernes et View Transitionsanimate.enter et animate.leave à la place de @angular/animations (déprécié), transitions CSS et View Transitions à la navigation.UI avancée et performance
  • 16Fuites mémoire : les trouver et les corrigerAbonnements, timers et listeners qui survivent à leur composant — comment les repérer dans les DevTools et les fermer.UI avancée et performance
  • 17Sécurité : XSS, sanitisation et CSPCe qu’Angular fait automatiquement contre le XSS, quand bypassSecurityTrust devient dangereux, plus la CSP avec nonce, Trusted Types et XSRF.Sécurité et internationalisation
  • 17Authentification : tokens et refreshUn interceptor qui ajoute le token, le renouvelle une seule fois sur une 401 et rejoue les requêtes en attente — plus où conserver le token.Sécurité et internationalisation
  • 17OAuth 2.1 et OpenID Connect avec PKCELe flux authorization code avec PKCE, pas à pas : verifier et challenge, state et nonce, l’ID token, et pourquoi un BFF est plus sûr.Sécurité et internationalisation
  • 17Internationalisation (i18n)$localize, l’attribut i18n, ICU plural/select, un build par langue vs des traductions à l’exécution, et le formatage selon la locale.Sécurité et internationalisation