Tavaszi biztonság - Gyorsítótár-vezérlő fejlécek
1. Bemutatkozás
Ebben a cikkben azt vizsgáljuk, hogy miként vezérelhetjük a HTTP gyorsítótárat a Spring Security segítségével.
Bemutatjuk az alapértelmezett viselkedését, és elmagyarázzuk a mögöttes érvelést. Ezután megvizsgáljuk a viselkedés részleges vagy teljes megváltoztatásának módjait.
2. Gyorsítótár alapértelmezett viselkedése
A gyorsítótár-vezérlő fejlécek hatékony használatával utasíthatjuk böngészőnket az erőforrások gyorsítótárba helyezésére és a hálózati ugrások elkerülésére. Ez csökkenti a várakozási időt és a szerverünk terhelését.
Alapértelmezés szerint a Spring Security meghatározott gyorsítótár-vezérlő fejléc értékeket állít be számunkra, anélkül, hogy bármit konfigurálnunk kellene.
Először állítsuk be a Spring Security alkalmazást:
@Configuration @EnableWebSecurity @EnableGlobalMethodSecurity nyilvános osztály A SpringSecurityConfig kiterjeszti a WebSecurityConfigurerAdapter {@Override protected void configure (HttpSecurity http) dobja a kivételeket {}}
Felülírjuk Beállítás() ha semmit sem teszünk, ez azt jelenti, hogy nem kell hitelesítenünk a végpont eléréséhez, ami lehetővé teszi számunkra, hogy pusztán a gyorsítótár tesztelésére összpontosítsunk.
Ezután valósítsunk meg egy egyszerű REST végpontot:
@GetMapping ("/ default / users / {name}") public ResponseEntity getUserWithDefaultCaching (@PathVariable String name) {return ResponseEntity.ok (new UserDto (név)); }
A kapott gyorsítótár-vezérlés fejléc így fog kinézni:
[cache-control: no-cache, no-store, max-age = 0, must-revalidate]
Végül hajtsunk végre egy tesztet, amely eléri a végpontot, és állítsuk be, hogy milyen fejléceket küldünk a válaszban:
adott () .when () .get (getBaseUrl () + "/ default / users / Michael") .then () .header ("Cache-Control", "no-cache, no-store, max-age = 0 , must-revalidate ") .header (" Pragma "," no-cache ");
Lényegében ez azt jelenti, hogy a böngésző soha nem tárolja gyorsítótárba ezt a választ.
Bár ez hatástalannak tűnhet, valójában jó oka van ennek az alapértelmezett viselkedésnek - Ha egy felhasználó kijelentkezik, egy másik pedig bejelentkezik, akkor nem akarjuk, hogy láthassák a korábbi felhasználói erőforrásokat. Sokkal biztonságosabb, ha alapértelmezés szerint nem tárolunk semmit gyorsítótárba, és ránk hagyhatunk felelősséget a gyorsítótárazás kifejezett engedélyezéséért.
3. Az alapértelmezett gyorsítótár-viselkedés felülbírálása
Néha előfordulhat, hogy olyan erőforrásokkal foglalkozunk, amelyeket tárolni szeretnénk. Ha engedélyezni fogjuk, akkor a legbiztonságosabb erőforrásonként megtenni. Ez azt jelenti, hogy más erőforrások továbbra sem kerülnek gyorsítótárba alapértelmezés szerint.
Ehhez próbáljuk meg felülbírálni a gyorsítótár-vezérlő fejléceket egyetlen kezelő módszerrel, a CacheControl gyorsítótár. A CacheControl class folyékony készítő, amely megkönnyíti számunkra a különböző típusú gyorsítótárak létrehozását:
@GetMapping ("/ users / {name}") public ResponseEntity getUser (@PathVariable String name) {return ResponseEntity.ok () .cacheControl (CacheControl.maxAge (60, TimeUnit.SECONDS)) .body (new UserDto (név) ); }
Tesztünk során érjük el ezt a végpontot, és állítsuk be, hogy megváltoztattuk a fejléceket:
adott () .when () .get (getBaseUrl () + "/ users / Michael") .then () .header ("Cache-Control", "max-age = 60");
Mint láthatjuk, felülbíráltuk az alapértelmezéseket, és most egy böngésző 60 másodpercig tárolja a válaszunkat.
4. Az alapértelmezett gyorsítótár-viselkedés kikapcsolása
A Spring Security alapértelmezett gyorsítótár-vezérlő fejléceit is teljesen kikapcsolhatjuk. Ez meglehetősen kockázatos dolog, és nem igazán ajánlott. De, ha nagyon akarjuk, akkor kipróbálhatjuk a Beállítás módszere WebSecurityConfigurerAdapter:
A @Orride protected void configure (HttpSecurity http) a Kivételt dobja {http.headers (). Disable (); }
Most kérjünk újra a végpontunkhoz, és nézzük meg, milyen választ kapunk:
adott () .when () .get (getBaseUrl () + "/ default / users / Michael") .then () .headers (új HashMap ());
Mint láthatjuk, egyáltalán nem állítottak be gyorsítótár fejléceket. Újra, ez nem biztonságos, de azt bizonyítja, hogyan kapcsolhatjuk ki az alapértelmezett fejléceket, ha akarjuk.
5. Következtetés
Ez a cikk bemutatja, hogy a Spring Security hogyan tiltja alapértelmezés szerint a HTTP gyorsítótárat, és elmagyarázza, hogy ez azért van, mert nem akarjuk a gyorsítótárat gyorsítótárba helyezni. Láttuk azt is, hogyan tilthatjuk le vagy módosíthatjuk ezt a viselkedést, ahogyan azt jónak látjuk.
Ezeknek a példáknak és kódrészleteknek a megvalósítása megtalálható a GitHub projektben - ez egy Maven projekt, ezért könnyen importálhatónak és futtathatónak kell lennie.