Spring Security - Cache-Steuerungsheader

1. Einleitung

In diesem Artikel erfahren Sie, wie Sie das HTTP-Caching mit Spring Security steuern können.

Wir werden das Standardverhalten demonstrieren und auch die Gründe dafür erläutern. Wir werden dann nach Möglichkeiten suchen, dieses Verhalten teilweise oder vollständig zu ändern.

2. Standard-Caching-Verhalten

Durch die effektive Verwendung von Cache-Steuerungs-Headern können wir unseren Browser anweisen, Ressourcen zwischenzuspeichern und Netzwerk-Hops zu vermeiden. Dies verringert die Latenz und auch die Belastung unseres Servers.

Standardmäßig legt Spring Security bestimmte Cache-Steuerelement-Header-Werte für uns fest, ohne dass wir etwas konfigurieren müssen.

Lassen Sie uns zunächst Spring Security für unsere Anwendung einrichten:

@Configuration @EnableWebSecurity @EnableGlobalMethodSecurity public class SpringSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception {} }

Wir überschreiben configure () , um nichts zu tun. Dies bedeutet, dass wir nicht authentifiziert werden müssen, um einen Endpunkt zu erreichen, sodass wir uns auf das reine Testen des Caching konzentrieren können.

Als nächstes implementieren wir einen einfachen REST-Endpunkt:

@GetMapping("/default/users/{name}") public ResponseEntity getUserWithDefaultCaching(@PathVariable String name) { return ResponseEntity.ok(new UserDto(name)); }

Der resultierende Cache-Control- Header sieht folgendermaßen aus:

[cache-control: no-cache, no-store, max-age=0, must-revalidate]

Lassen Sie uns abschließend einen Test implementieren, der den Endpunkt erreicht, und bestätigen, welche Header in der Antwort gesendet werden:

given() .when() .get(getBaseUrl() + "/default/users/Michael") .then() .header("Cache-Control", "no-cache, no-store, max-age=0, must-revalidate") .header("Pragma", "no-cache");

Dies bedeutet im Wesentlichen, dass ein Browser diese Antwort niemals zwischenspeichert.

Dies scheint zwar ineffizient zu sein, es gibt jedoch einen guten Grund für dieses Standardverhalten: Wenn sich ein Benutzer abmeldet und ein anderer anmeldet, möchten wir nicht, dass er die Ressourcen der vorherigen Benutzer sehen kann . Es ist viel sicherer, standardmäßig nichts zwischenzuspeichern und es uns zu überlassen, das Zwischenspeichern explizit zu aktivieren.

3. Überschreiben des Standard-Caching-Verhaltens

Manchmal haben wir es mit Ressourcen zu tun, die zwischengespeichert werden sollen. Wenn wir es aktivieren wollen, wäre es am sichersten, dies pro Ressource zu tun. Dies bedeutet, dass andere Ressourcen standardmäßig immer noch nicht zwischengespeichert werden.

Versuchen Sie dazu, die Cache-Steuerelement-Header in einer einzelnen Handler-Methode mithilfe des CacheControl- Cache zu überschreiben . Die CacheControl- Klasse ist ein fließender Builder, der es uns leicht macht, verschiedene Arten von Caching zu erstellen:

@GetMapping("/users/{name}") public ResponseEntity getUser(@PathVariable String name) { return ResponseEntity.ok() .cacheControl(CacheControl.maxAge(60, TimeUnit.SECONDS)) .body(new UserDto(name)); }

Lassen Sie uns diesen Endpunkt in unserem Test erreichen und behaupten, dass wir die Header geändert haben:

given() .when() .get(getBaseUrl() + "/users/Michael") .then() .header("Cache-Control", "max-age=60");

Wie wir sehen können, haben wir die Standardeinstellungen überschrieben, und jetzt wird unsere Antwort 60 Sekunden lang von einem Browser zwischengespeichert.

4. Deaktivieren Sie das Standard-Caching-Verhalten

Wir können auch die Standard-Cache-Steuerungsheader von Spring Security vollständig deaktivieren. Dies ist eine ziemlich riskante Sache und nicht wirklich zu empfehlen. Aber wenn wir wirklich wollen, können wir es versuchen, indem wir die Konfigurationsmethode des WebSecurityConfigurerAdapter überschreiben:

@Override protected void configure(HttpSecurity http) throws Exception { http.headers().disable(); }

Lassen Sie uns nun erneut eine Anfrage an unseren Endpunkt stellen und sehen, welche Antwort wir erhalten:

given() .when() .get(getBaseUrl() + "/default/users/Michael") .then() .headers(new HashMap());

Wie wir sehen können, wurden überhaupt keine Cache-Header gesetzt. Auch dies ist nicht sicher, zeigt aber, wie wir die Standardheader deaktivieren können, wenn wir möchten.

5. Schlussfolgerung

In diesem Artikel wird erläutert, wie Spring Security das HTTP-Caching standardmäßig deaktiviert, und es wird erläutert, dass sichere Ressourcen nicht zwischengespeichert werden sollen. Wir haben auch gesehen, wie wir dieses Verhalten nach Belieben deaktivieren oder ändern können.

Die Implementierung all dieser Beispiele und Codefragmente finden Sie im GitHub-Projekt - dies ist ein Maven-Projekt, daher sollte es einfach zu importieren und auszuführen sein, wie es ist.