Spring Security - Cache Control Headers

1. Inleiding

In dit artikel zullen we onderzoeken hoe we HTTP-caching kunnen beheren met Spring Security.

We zullen het standaardgedrag demonstreren en ook de reden erachter uitleggen. We zullen vervolgens kijken naar manieren om dit gedrag gedeeltelijk of volledig te veranderen.

2. Standaard cachegedrag

Door cachecontrole-headers effectief te gebruiken, kunnen we onze browser instrueren om bronnen in het cachegeheugen op te slaan en netwerkhops te vermijden. Dit vermindert de latentie, en ook de belasting van onze server.

Standaard stelt Spring Security voor ons specifieke cache control header-waarden in, zonder dat we iets hoeven te configureren.

Laten we eerst Spring Security instellen voor onze applicatie:

@Configuration @EnableWebSecurity @EnableGlobalMethodSecurity openbare klasse SpringSecurityConfig breidt WebSecurityConfigurerAdapter uit {@Override protected void configure (HttpSecurity http) gooit uitzondering {}}

We overheersen configureren () om niets te doen, betekent dit dat we niet hoeven te worden geverifieerd om een ‚Äč‚Äčeindpunt te raken, waardoor we ons kunnen concentreren op het puur testen van caching.

Laten we vervolgens een eenvoudig REST-eindpunt implementeren:

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

Het resultaat cache-controle koptekst zal er als volgt uitzien:

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

Laten we tot slot een test implementeren die het eindpunt raakt, en bevestigen welke headers in het antwoord worden verzonden:

gegeven () .when () .get (getBaseUrl () + "/ default / gebruikers / Michael") .then () .header ("Cache-Control", "no-cache, no-store, max-age = 0 , moet opnieuw valideren ") .header (" Pragma "," no-cache ");

Dit betekent in wezen dat een browser dit antwoord nooit in de cache zal opslaan.

Hoewel dit inefficiënt lijkt, is er eigenlijk een goede reden voor dit standaardgedrag: Als de ene gebruiker uitlogt en een andere zich aanmeldt, willen we niet dat ze de bronnen van de vorige gebruikers kunnen zien. Het is veel veiliger om standaard niets in het cachegeheugen te cachen, en laat ons verantwoordelijk voor het expliciet inschakelen van caching.

3. Het standaardgedrag van caching opheffen

Soms hebben we te maken met bronnen die we wel in de cache willen hebben. Als we het gaan inschakelen, is het het veiligst om dit per resource te doen. Dit betekent dat alle andere bronnen nog steeds niet standaard in de cache worden opgeslagen.

Om dit te doen, proberen we de cache control headers te overschrijven in een enkele handlermethode, door gebruik te maken van de CacheControl cache. De CacheControl class is een vloeiende builder, waardoor we gemakkelijk verschillende soorten caching kunnen maken:

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

Laten we dit eindpunt in onze test raken en beweren dat we de headers hebben gewijzigd:

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

Zoals we kunnen zien, hebben we de standaardinstellingen overschreven en wordt ons antwoord nu 60 seconden in de cache van een browser opgeslagen.

4. Het standaardgedrag van cachegeheugen uitschakelen

We kunnen ook de standaard cache control headers van Spring Security helemaal uitschakelen. Dit is nogal riskant om te doen, en niet echt aan te raden. Maar als we het echt willen, kunnen we het proberen door de configureren methode van de WebSecurityConfigurerAdapter:

@Override protected void configure (HttpSecurity http) genereert Uitzondering {http.headers (). Disable (); }

Laten we nu opnieuw een verzoek indienen bij ons eindpunt en kijken welk antwoord we krijgen:

gegeven () .when () .get (getBaseUrl () + "/ default / gebruikers / Michael") .then () .headers (nieuwe HashMap ());

Zoals we kunnen zien, zijn er helemaal geen cache-headers ingesteld. Opnieuw, dit is niet veilig, maar bewijst hoe we de standaard headers kunnen uitschakelen als we dat willen.

5. Conclusie

Dit artikel laat zien hoe Spring Security HTTP-caching standaard uitschakelt en legt uit dat dit komt omdat we geen beveiligde bronnen in het cachegeheugen willen opslaan. We hebben ook gezien hoe we dit gedrag naar eigen inzicht kunnen uitschakelen of wijzigen.

De implementatie van al deze voorbeelden en codefragmenten is te vinden in het GitHub-project - dit is een Maven-project, dus het moet gemakkelijk te importeren en uit te voeren zijn zoals het is.