AngularAtlasAusg. 22.2

Kap. 17Sicherheit & Globalisierung72 / 75

Sicherheit: XSS, Sanitizing & CSP

Was Angular automatisch gegen XSS tut, wann bypassSecurityTrust gefährlich wird, dazu CSP mit Nonce, Trusted Types und XSRF.

~0 Min. Lesezeit Offizielle Doku

Angular geht von einer einfachen Regel aus: Jeder Wert, der im Template gebunden wird, gilt als unsicher, bis das Gegenteil bewiesen ist. Die Interpolation maskiert den Text. [innerHTML] läuft durch den Sanitizer. URLs mit gefährlichen Schemata werden entschärft. Deshalb entsteht ein XSS in einer Angular-Anwendung fast immer dann, wenn jemand diese Schutzmechanismen umgeht, nicht wenn er sie nutzt.

Diese Seite zeigt, was Angular automatisch erledigt, wo die „Seitentüren“ liegen, nach denen du im Code-Review suchen solltest, und wie du die zweite Verteidigungslinie ergänzt: Content Security Policy und Trusted Types. Am Ende steht der XSRF-Schutz in HttpClient.

Warum das wichtig ist
Ein einziges XSS bedeutet, dass der Angreifer JavaScript auf deiner Seite ausführt, mit der Sitzung des Nutzers: Er liest Daten, sendet Requests in dessen Namen und stiehlt Tokens aus localStorage. Die Standardschutzmechanismen decken die üblichen Fälle ab. Der Rest hängt davon ab, was du mit bypassSecurityTrust* und dem DOM machst.

Security-Kontexte

Angular wählt die Behandlung danach, wo der Wert landet. In Text maskiert es ihn. In HTML ([innerHTML]) bereinigt es ihn: Die Formatierungs-Tags bleiben, <script>, die on*-Attribute, <iframe> und gefährliche URLs werden entfernt. Bei einer URL ([href], [src]) entschärft es Schemata wie javascript:. Die Resource-URL (die Quelle eines <iframe> oder eines Skripts) ist der strengste Kontext, denn dort bedeutet eine URL Code, der ausgeführt wird.

<!-- Interpolation: Der Text wird MASKIERT — „<b>“ erscheint wörtlich, es wird kein Tag -->
<p>{{ comment.text }}</p>

<!-- [innerHTML]: Das HTML wird BEREINIGT — Formatierungs-Tags bleiben, Skripte und Event-Handler werden entfernt -->
<div [innerHTML]="comment.html"></div>

<!-- URLs: javascript: und andere gefährliche Schemata werden zu „unsafe:…“ -->
<a [href]="profile.website">site</a>

<!-- Styles: Auch Werte in [style] werden geprüft -->
<div [style.background-image]="'url(' + user.avatar + ')'"></div>
LiveDer Sanitizer von Angular, live
Gerendert mit [innerHTML] (automatisch bereinigt)

Hallo, Welt! Siehe Doku.

Ergebnis von sanitizer.sanitize(SecurityContext.HTML, …)
<p><b>Hallo</b>, <em>Welt</em>! Siehe <a href="https://angular.dev">Doku</a>.</p>

nichts entfernt der Inhalt war bereits sicher.

Mit bypassSecurityTrustHtml(…) würde Angular genau den Text aus dem Feld einfügen, einschließlich Event-Handlern. Deshalb macht die Demo das nicht.

Wähle ein gefährliches Beispiel: Links siehst du, was [innerHTML] rendert, rechts genau das, was der Sanitizer durchgelassen hat, und darunter, was entfernt wurde. Im Entwicklungsmodus schreibt Angular jedes Mal eine Warnung in die Konsole, wenn es etwas entfernt; das ist normal.

URLs

Ein Link mit einem href, der vom Nutzer stammt („meine Website“), ist ein klassischer Angriffsvektor: javascript:alert(document.cookie) führt beim Klick Code aus. Angular stellt unsicheren Werten unsafe: voran, sodass der Browser sie nicht mehr ausführen kann. Gängige Schemata (https:, mailto:, relative Pfade) passieren unverändert.

LiveWas [href] erhält

Template: <a [href]="url()"> → das Attribut im DOM:

der gerenderte Link
Probiere javascript: und data:. Das Attribut im DOM bekommt das Präfix unsafe:. Der Klick führt nichts mehr aus.

bypassSecurityTrust und die Seitentüren

DomSanitizer hat fünf bypassSecurityTrust…-Methoden (Html, Script, Style, Url, ResourceUrl). Sie markieren einen Wert als sicher, und Angular prüft ihn nicht mehr. Legitim sind sie nur für Inhalte, die du selbst erzeugst und kontrollierst, zum Beispiel die URL eines Embeds, die aus einer validierten ID gebaut wird. Bei Daten von Nutzern oder aus einer externen API ist jeder Aufruf eine Schwachstelle. Die Angular-Dokumentation kennzeichnet sie als „security sensitive“: Such bei jedem Review danach.

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

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

  // ✓ Nur für Inhalte, die du KONTROLLIERST: eine URL, die du selbst aus einer validierten ID baust
  readonly video: SafeResourceUrl = this.sanitizer.bypassSecurityTrustResourceUrl(
    `https://www.youtube-nocookie.com/embed/${encodeURIComponent(this.videoId())}`,
  );

  // ✗ Niemals bei Eingaben, die vom Nutzer oder aus einer externen API stammen
  unsafe(html: string): SafeHtml {
    return this.sanitizer.bypassSecurityTrustHtml(html); // garantiertes XSS, wenn html ein <img onerror> enthält
  }
}

Gefährlicher sind die Wege, die gar nicht über Angular laufen: nativeElement.innerHTML, Renderer2.setProperty(…, 'innerHTML', …), document.write, eval und Templates, die zur Laufzeit aus Strings gebaut werden.

// All das UMGEHT das Sanitizing von Angular — vermeide es bei Daten von außen:
this.el.nativeElement.innerHTML = userHtml;                     // direktes DOM
this.renderer.setProperty(this.el.nativeElement, 'innerHTML', userHtml);
document.write(userHtml);
new Function(userCode)();  eval(userCode);
// und Templates, die aus Strings mit Nutzereingaben gebaut werden (JIT-Kompilierung zur Laufzeit)

// ✓ Die Alternative: [innerHTML] (bereinigt) oder, für Markdown, eine Rendering-Bibliothek + Sanitizing

Content Security Policy

CSP ist ein Header, der dem Browser sagt, welche Skripte und Styles ausgeführt werden dürfen. Selbst wenn ein Angreifer HTML einschleusen kann, läuft sein Skript ohne die richtige Nonce oder den richtigen Hash nicht. Angular fügt Inline-Styles hinzu (die Styles der Komponenten) und braucht deshalb eine Nonce. Es bekommt sie entweder über das Attribut ngCspNonce am Root-Element (der Server erzeugt sie bei jeder Antwort neu) oder über das Token CSP_NONCE.

Die Alternative ohne Server, der die Seite per Templating befüllt, ist security.autoCsp. Beim Build berechnet die CLI die Hashes der Inline-Skripte und setzt die Policy in ein <meta>-Tag, sodass index.html cachebar bleibt. Die Dokumentation nennt die Grenzen: Es deckt nur Skripte ab, einige Direktiven (zum Beispiel frame-ancestors) müssen weiterhin im Header gesendet werden, und es funktioniert nicht mit SSR.

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

// Variante 1 (Server-Side-Templating): Der Server setzt dieselbe Nonce in den Header und in index.html
//   <app-root ngCspNonce="r4nd0m-per-request"></app-root>

// Variante 2: Die Nonce ist zur Laufzeit verfügbar und du willst index.html cachen können
bootstrapApplication(App, {
  providers: [{ provide: CSP_NONCE, useValue: globalThis.myRandomNonceValue }],
});

Trusted Types

Trusted Types gehen noch einen Schritt weiter: Der Browser verweigert jeden Schreibzugriff auf gefährliche „Sinks“ (innerHTML, das src eines Skripts …), der nicht über eine freigegebene Policy läuft. Angular bringt eigene Policies mit: angular für das, was das Framework tut, angular#unsafe-bypass, wenn du bypassSecurityTrust* verwendest, und angular#bundler für die Lazy-Chunks der CLI. Ein direkt im Code geschriebenes innerHTML wird so zu einem Fehler statt zu einer Schwachstelle.

# Das Minimum für eine Angular-Anwendung
Content-Security-Policy: trusted-types angular; require-trusted-types-for 'script';

# Wenn du bypassSecurityTrust* verwendest
Content-Security-Policy: trusted-types angular angular#unsafe-bypass; require-trusted-types-for 'script';

# Wenn du Lazy-Chunks hast, die von der CLI erzeugt werden
Content-Security-Policy: trusted-types angular angular#bundler; require-trusted-types-for 'script';
LiveCSP-Builder
HTTP-Header
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';
Konfiguration in Angular
<!-- index.html: der Server ersetzt den Wert bei jeder Antwort -->
<app-root ngCspNonce="RANDOM_PER_RESPONSE"></app-root>

// oder, wenn die Nonce zur Laufzeit bekannt ist:
{ provide: CSP_NONCE, useValue: globalThis.myNonce }
Wähle, wie du die Nonce auslieferst und was die Anwendung nutzt. Der Header und die Angular-Konfiguration aktualisieren sich sofort.

XSRF / CSRF

Erfolgt die Authentifizierung über ein Session-Cookie, kann eine fremde Seite ein Formular an deine API senden, und der Browser hängt das Cookie automatisch an. HttpClient hat einen eingebauten Schutz: Es liest das Cookie XSRF-TOKEN und sendet den Wert im Header X-XSRF-TOKEN. Nur Code auf deiner Domain kann das Cookie lesen, daher weiß der Server, woher der Request kommt. Der Header wird nur bei Requests hinzugefügt, die Daten verändern (nicht bei GET/HEAD), und nur bei relativen URLs oder derselben Origin. Die Serverseite ist Pflicht: Der Server setzt das Cookie und prüft den Header.

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

// Standard: HttpClient liest das Cookie XSRF-TOKEN und sendet den Header X-XSRF-TOKEN
// bei Requests, die Daten VERÄNDERN (POST, PUT, DELETE…), an relative URLs / dieselbe Origin.
provideHttpClient(
  withXsrfConfiguration({ cookieName: 'CSRF-TOKEN', headerName: 'X-CSRF-TOKEN' }), // wenn das Backend andere Namen verwendet
);

// Deaktivieren (z. B. bei einer API mit Bearer-Token, ohne Session-Cookie):
provideHttpClient(withNoXsrfProtection());

Wann ja, wann nein

Mach das
  • Lass Angular das Binding übernehmen: Interpolation und [innerHTML], nicht direkt das DOM.
  • Eine strikte CSP (Nonce oder autoCsp) und Trusted Types in Produktion.
  • Session-Cookies mit HttpOnly, Secure, SameSite und aktivem XSRF-Schutz (siehe Authentifizierung). Für den Login über einen externen Anbieter siehe OAuth 2.1 / OIDC mit PKCE.
  • Halte Angular und die Abhängigkeiten aktuell: Sicherheitskorrekturen kommen in Patch-Versionen.
Mach das nicht
  • bypassSecurityTrustHtml bei Inhalten von Nutzern oder aus externen CMS.
  • „Sicherheits“-Validierung nur im Frontend: Jede Regel muss auf dem Server erneut geprüft werden.
  • Access-Tokens in localStorage ohne CSP: Ein einziges XSS kann sie lesen.
  • Die Sanitizing-Warnungen abschalten, „damit sie nicht mehr in der Konsole erscheinen“: Sie zeigen dir genau, wo unsicheres HTML hineingelangt.

Häufige Stolperfallen

  • Die „safeHtml-Pipe“ im Projekt, die auf alles bypassSecurityTrustHtml aufruft: Sie ist ein wiederverwendbares XSS. Lösche sie oder beschränke sie auf sichere Quellen.
  • Markdown, gerendert mit bypassSecurityTrustHtml: Markdown kann HTML enthalten. Rendere es, und schicke das Ergebnis dann durch das Sanitizing.
  • href-Attribute, die per Konkatenation gebaut werden in nativeElement: Sie umgehen das URL-Sanitizing.
  • CSP, die „am Ende“ ungetestet ergänzt wird: Lazy-Chunks oder Inline-Styles werden blockiert, und die Anwendung geht in Produktion kaputt. Beginne mit Content-Security-Policy-Report-Only.
  • XSRF deaktiviert, während ein Session-Cookie aktiv ist: Jede Website kann POST-Requests im Namen des Nutzers senden.

Spickzettel

IMPLIZIT (nichts zu tun)
  {{ x }}            maskiert
  [innerHTML]        bereinigt (script, on*, javascript:, iframe… werden entfernt) — Dev-Warnung, wenn etwas entfernt wird
  [href] / [src]     gefährliche URLs → "unsafe:…"
UMGEHUNGEN (nur für Inhalte, die du kontrollierst — beim Code-Review danach suchen)
  bypassSecurityTrustHtml / Url / ResourceUrl / Style / Script
  nativeElement.innerHTML, Renderer2.setProperty('innerHTML'), document.write, eval, aus Strings gebaute Templates
CSP
  ngCspNonce="…" am Root  oder  { provide: CSP_NONCE, useValue }  — Nonce pro Antwort
  "security": { "autoCsp": true }  — Hashes beim Build, index.html cachebar, NICHT mit SSR, nur script-src
TRUSTED TYPES
  trusted-types angular [angular#unsafe-bypass] [angular#bundler]; require-trusted-types-for 'script'
XSRF
  XSRF-TOKEN → X-XSRF-TOKEN, nur Requests, die verändern, nur Same-Origin · withXsrfConfiguration · withNoXsrfProtection
SERVER
  alles erneut validieren · HttpOnly-, Secure- und SameSite-Cookies · npm audit / Angular-Updates

Kap. 17 · 0 von 4 abgeschlossen

Lektion abgeschlossen?

Markiere sie, dann erscheint sie auf deiner Karte: im Inhaltsverzeichnis und auf der Startseite.

Wird automatisch markiert, sobald du die ganze Lektion gelesen hast.

  1. Sicherheit: XSS, Sanitizing & CSP
  2. Authentifizierung: Tokens & Refresh
  3. OAuth 2.1 & OpenID Connect mit PKCE
  4. Internationalisierung (i18n)
Deine ganze Karte ansehen

Alle 75 Seiten · tippen zum Filtern

  • 01Was ist neu in Angular 21 & 22Alle wichtigen Änderungen in v21 und v22 in Kürze, mit Link zur Seite, die sie jeweils erklärt.Start
  • 01Deine erste App, Schritt für SchrittEine Leseliste, von einer leeren Komponente bis zur fertigen App — Signals, @for, Inputs und Outputs, ein Service und ein Formular, Schritt für Schritt.Start
  • 01Schnelle Entscheidungen„Wohin damit?“, „Signal oder Observable?“, „Shared oder Feature?“ — kurze Antworten auf Alltagsfragen.Start
  • 01Angular-Interviewfragen60 echte Interviewfragen für Junior, Mid und Senior, mit der passenden Antwort, der Nachfrage und den Warnsignalen. Dazu ein Probeinterview.Start
  • 02Standalone & BootstrapWie eine App ohne NgModule startet: bootstrapApplication, app.config.ts, imports in der Komponente.Moderne Grundlagen
  • 02Data Binding & EventsInterpolation, Property- und Attribut-Bindings, Events mit $event und Tastenfiltern und wie [( )] aufgebaut ist — was in das DOM geht und was zurückkommt.Moderne Grundlagen
  • 02Control Flow: @if, @for, @switchDie Block-Syntax, die *ngIf/*ngFor/ngSwitch ersetzt, mit track, @empty und Exhaustive Checks.Moderne Grundlagen
  • 02@let und die neuen Template-AusdrückeLokale Variablen mit @let, Arrow Functions, Spread, Regex, instanceof, Kommentare in Tags.Moderne Grundlagen
  • 02@defer — Lazy Loading in TemplatesSchwere Komponenten nur laden, wenn sie gebraucht werden: Trigger, Prefetch, Placeholder, Loading, Error.Moderne Grundlagen
  • 02Class- & Style-BindingsWarum [class.x] und [style.x] ngClass und ngStyle abgelöst haben (mit automatischer Migration ab v21).Moderne Grundlagen
  • 02Komponenten-Styles & Kapselung:host, die drei Kapselungsmodi, Theming mit CSS-Variablen und warum ::ng-deep der letzte Ausweg ist.Moderne Grundlagen
  • 02Pipes: wann und wiePure vs. Impure Pipes, eigene Pipes und wie du zwischen Pipe, computed() und Methode wählst.Moderne Grundlagen
  • 03signal() und computed()Die reaktiven Grundbausteine: beschreibbarer Zustand, abgeleiteter Zustand, Gleichheit, untracked und Regeln zur Immutability.Signals & Reaktivität
  • 03effect() — wann ja, wann neinMit Signals synchronisierte Seiteneffekte: localStorage, Logging, imperative APIs. Und ihre Stolperfallen.Signals & Reaktivität
  • 03linkedSignal() — editierbarer abgeleiteter ZustandEin Signal, das sich zurücksetzt, wenn sich seine Quelle ändert, das du aber auch manuell setzen kannst.Signals & Reaktivität
  • 03resource, rxResource, httpResourceAsynchrone Daten als Signals: status, value, error, reload, automatischer Abbruch. Stabil seit v22.Signals & Reaktivität
  • 03debounced() — verzögerte SignalsDie „Debounce“-Variante eines Signals, ohne RxJS. Perfekt für die Suche.Signals & Reaktivität
  • 03Listen: suchen, filtern, sortieren, blätternEine Kette von computed-Signals, die nur neu berechnet, was sich geändert hat — mit den Filtern in der URL, damit ein Link dieselbe Ansicht öffnet.Signals & Reaktivität
  • 03Observables von null anWas ein Observable ist, subscribe und unsubscribe, die Operatoren, die du jede Woche brauchst, cold vs. hot — und wann ein Signal reicht.Signals & Reaktivität
  • 03Signals ↔ RxJStoSignal, toObservable, takeUntilDestroyed, outputFromObservable — und wann RxJS weiterhin die richtige Wahl bleibt.Signals & Reaktivität
  • 04input() und output()Inputs als Signals (required, transform, alias) und typisierte Outputs. Daten nach unten, Events nach oben.Komponenten: Kommunikation
  • 04model() — Two-Way-BindingBanana-in-a-Box [( )] mit einer einzigen API. Wann du es nutzt und wann input + output besser ist.Komponenten: Kommunikation
  • 04viewChild & contentChildQueries als Signals: viewChild, viewChildren, contentChild, contentChildren, die Option read.Komponenten: Kommunikation
  • 04Lifecycle & DestroyRefWelche Hooks in der Signals-Ära noch zählen, afterNextRender, DestroyRef und typisiertes ngOnChanges.Komponenten: Kommunikation
  • 04Content Projectionng-content mit select, mehrere Slots, Standardinhalt und die Falle der bedingten Projektion.Komponenten: Kommunikation
  • 04ng-template & ngTemplateOutletTemplates als Werte: Render Props in Angular, typisierter Kontext und Anpassen von Komponenten.Komponenten: Kommunikation
  • 05Smart vs. DumbContainer vs. Presentational: wer den Zustand hält, wer nur anzeigt und wie du die beiden sauber trennst.Komponenten-Design
  • 05Generische Komponenten <T>Eine korrekt typisierte DataTable<T> oder Select<T>, mit Templates für Zellen.Komponenten-Design
  • 05Dynamische KomponentenNgComponentOutlet, createComponent mit inputBinding/outputBinding und ein Dashboard, das aus einer Konfiguration gebaut wird.Komponenten-Design
  • 05Direktiven & Host-KompositionAttribut-Direktiven, die host: {}-Metadaten und die Directive Composition API (hostDirectives).Komponenten-Design
  • 05Eigene Formular-ControlsFormValueControl (Signal Forms) vs. ControlValueAccessor: eine Sternebewertung, in beiden Varianten.Komponenten-Design
  • 05Change DetectionOnPush ist ab v22 der Standard, zone.js entfällt ab v21. Was das Rendering auslöst und wie du dir nicht die Finger verbrennst.Komponenten-Design
  • 06inject() & @Service()Der neue @Service()-Decorator ab v22, inject() vs. Konstruktor und der Injection-Kontext.Dependency Injection
  • 06Provider & die Injector-HierarchieRoot vs. Route vs. Komponente, useClass/useValue/useFactory/useExisting und die Modifier optional/self/skipSelf.Dependency Injection
  • 06InjectionToken & provideX()Typisierte Konfiguration, provideFeature()-Funktionen, makeEnvironmentProviders und Initializer.Dependency Injection
  • 06injectAsync() — Lazy ServicesLade einen schweren Service erst, wenn du ihn brauchst, mit Prefetch im Leerlauf.Dependency Injection
  • 07Ordnerstrukturcore / shared / features, was in welchen Ordner gehört und wie ein Feature von innen aussieht.Architektur der Anwendung
  • 07Shared vs. FeatureWann du eine Komponente nach Shared verschiebst und (vor allem) wann NICHT. Eine konkrete Checkliste.Architektur der Anwendung
  • 07Interfaces & ModelleInline-Interface oder eigene Datei? DTO vs. Domänenmodell, type vs. interface, wohin damit.Architektur der Anwendung
  • 07State Management mit SignalsEinfache Signal-Stores, Fassaden, lokaler vs. globaler Zustand und wann du NgRx brauchst.Architektur der Anwendung
  • 07Styleguide & NamensgebungDie aktuellen offiziellen Konventionen: Dateinamen ohne Suffixe, protected, readonly, Reihenfolge der Member.Architektur der Anwendung
  • 07Barrels, Aliase & Grenzenindex.ts, Pfad-Aliase, die öffentliche API eines Features und Abhängigkeitsregeln, die sich automatisch prüfen lassen.Architektur der Anwendung
  • 07Fehler: @boundary & ErrorHandlerDer neue @boundary-Block ab v22.2, der globale ErrorHandler, HTTP-Fehler und Fehler aus resource.Architektur der Anwendung
  • 08Modernes Routing & Lazy LoadingloadComponent, Child Routes, Parameter als Inputs und Parameter-Vererbung (neuer Standard in v22).Routing
  • 08Guards & ResolvercanActivate, canMatch, canDeactivate und resolve als Funktionen, mit Redirects über UrlTree / RedirectCommand.Routing
  • 09Signal Forms — die GrundlagenFormulare auf Basis von Signals: form(), [formField], schemabasierte Validierung. Stabil seit v22.Formulare
  • 09Signal Forms — fortgeschrittenEigene und feldübergreifende Validierung, async/HTTP mit Debounce, dynamische Listen, disabled/hidden, wiederverwendbare Schemas.Formulare
  • 09Typisierte Reactive FormsTypisierte FormGroup, nonNullable, FormArray — und wie sie neben Signal Forms bestehen.Formulare
  • 10HttpClient, Interceptors & die API-SchichtHttpClient ohne Setup (v21), Fetch als Standard (v22), funktionale Interceptors und eine API-Schicht mit DTO-Mapping.HTTP & Daten
  • 11Performance — eine ChecklisteWas wirklich zählt: OnPush + Signals, track, @defer, Lazy Routes, Bilder, Bundles und Hydration.Qualität & Performance
  • 11Testen mit VitestVitest ist ab v21 der Standard-Runner. TestBed, Komponenten mit Signals, Services, HTTP und Harnesses.Qualität & Performance
  • 11DevTools: ein Blick in deine AppChrome DevTools und Angular DevTools Schritt für Schritt: was jedes Panel zeigt, mit Übungen, die auf dieser Website funktionieren.Qualität & Performance
  • 11Angular AriaHeadless, barrierefreie Komponenten, die du nach Belieben stylst: Tabs, Accordion, Menü, Listbox...Qualität & Performance
  • 12SSR, Prerendering & Render ModesWann auf dem Server gerendert wird, wann beim Build und wann nur im Browser: RenderMode pro Route, app.routes.server.ts und die echten Kosten.SSR & Hydration
  • 12Hydration: Event Replay & inkrementellWie der Browser das Server-HTML übernimmt, ohne es neu zu rendern: vollständige Hydration, Event Replay, @defer (hydrate on …) und Mismatch-Fehler.SSR & Hydration
  • 12Servertauglicher Codewindow gibt es auf dem Server nicht: PLATFORM_ID, afterNextRender, DOCUMENT, TransferState, der HTTP-Cache und PendingTasks.SSR & Hydration
  • 13Micro FrontendsWann es sich lohnt, eine App in mehrere Deployments aufzuteilen und wann es nur Komplexität ist: Native Federation, Module Federation, iframes, Web Components.Architektur im großen Maßstab
  • 13Web Components mit Angular ElementscreateCustomElement: eine Angular-Komponente, die überall als HTML-Tag nutzbar ist, plus Kommunikation zwischen Apps über Events und BroadcastChannel.Architektur im großen Maßstab
  • 13Monorepo, Bibliotheken & GrenzenEin Workspace mit mehreren Apps und Bibliotheken: ng generate library, Nx, Secondary Entry Points, Publishing und Abhängigkeitsregeln.Architektur im großen Maßstab
  • 13Hexagonale Architektur (Ports & Adapters)Eine Domäne ohne Angular, Ports als abstrakte Klassen und austauschbare Adapter: HTTP, localStorage oder In-Memory, ohne die UI anzufassen.Architektur im großen Maßstab
  • 14Signals unter der HaubeDer reaktive Graph: Producer und Consumer, Push-Pull, warum computed lazy und glitch-frei ist, das Diamond-Problem und wann Effects laufen.Fortgeschrittene Reaktivität
  • 14Fortgeschrittenes RxJS: Operatoren höherer OrdnungswitchMap, mergeMap, concatMap und exhaustMap an einem Live-Diagramm, dazu Retry mit Backoff, shareReplay und wie du Leaks vermeidest.Fortgeschrittene Reaktivität
  • 14NgRx SignalStoreState Management im großen Stil auf Signals: withState, withComputed, withMethods, rxMethod, Entities und Hooks — und wann ein einfacher Store reicht.Fortgeschrittene Reaktivität
  • 14Zustandsautomaten mit SignalsKeine unmöglichen Zustände mehr: ein typisierter Automat auf Signals, mit Übergängen, Guards und einem Live-Zustandsdiagramm.Fortgeschrittene Reaktivität
  • 15WebSockets: Echtzeit, die das Netz überstehtEin typisierter Socket als Signals: Reconnect mit Backoff und Jitter, Heartbeat, ein Postausgang im Offline-Modus und SSR-Sicherheit.Echtzeit & offline
  • 15Optimistische Updates & RollbackEine sofortige UI, die ehrlich bleibt: Snapshot und Rollback, Antworten in falscher Reihenfolge, Idempotenzschlüssel.Echtzeit & offline
  • 15Offline-first: Service Worker & CachingDer Angular Service Worker: Caching-Strategien, Update-Hinweise und ein Postausgang für Änderungen, die offline entstehen.Echtzeit & offline
  • 16Web WorkersSchwere Berechnungen, ohne die UI zu blockieren: ein echter Worker in der Seite, Message Passing und wann es sich nicht lohnt.Fortgeschrittene UI & Performance
  • 16Riesige Listen: Virtual Scroll100.000 Zeilen ohne Ruckeln: CDK Virtual Scroll, itemSize, trackBy und die Alternativen (Paginierung, Infinite Scroll).Fortgeschrittene UI & Performance
  • 16Moderne Animationen & View Transitionsanimate.enter und animate.leave statt des veralteten @angular/animations, CSS-Transitions und View Transitions bei der Navigation.Fortgeschrittene UI & Performance
  • 16Memory Leaks finden und behebenSubscriptions, Timer und Listener, die ihre Komponente überleben – wie du sie in den DevTools findest und schließt.Fortgeschrittene UI & Performance
  • 17Sicherheit: XSS, Sanitizing & CSPWas Angular automatisch gegen XSS tut, wann bypassSecurityTrust gefährlich wird, dazu CSP mit Nonce, Trusted Types und XSRF.Sicherheit & Globalisierung
  • 17Authentifizierung: Tokens & RefreshEin Interceptor, der das Token anhängt, bei 401 einmal erneuert und die wartenden Requests wiederholt — dazu, wo du das Token aufbewahrst.Sicherheit & Globalisierung
  • 17OAuth 2.1 & OpenID Connect mit PKCEDer Authorization-Code-Flow mit PKCE Schritt für Schritt: Verifier und Challenge, State und Nonce, das ID-Token und warum ein BFF sicherer ist.Sicherheit & Globalisierung
  • 17Internationalisierung (i18n)$localize, das i18n-Attribut, ICU plural/select, ein Build pro Sprache vs. Übersetzungen zur Laufzeit und Formatierung nach Locale.Sicherheit & Globalisierung