Jarná bezpečnosť - hlavičky vyrovnávacej pamäte

1. Úvod

V tomto článku preskúmame, ako môžeme ovládať ukladanie do vyrovnávacej pamäte HTTP pomocou Spring Security.

Predvedieme jeho predvolené správanie a tiež vysvetlíme jeho dôvody. Potom sa pozrieme na spôsoby, ako čiastočne alebo úplne zmeniť toto správanie.

2. Predvolené správanie pri ukladaní do pamäte cache

Vďaka efektívnemu používaniu hlavičiek kontroly medzipamäte môžeme nášmu prehliadaču nariadiť, aby ukladal prostriedky do medzipamäte a vyhýbal sa sieťovým skokom. To znižuje latenciu a tiež zaťaženie nášho servera.

V predvolenom nastavení Spring Security nastavuje pre nás konkrétne hodnoty hlavičky riadenia cache, bez toho aby sme museli niečo konfigurovať.

Najprv si nastavíme Spring Security pre našu aplikáciu:

@Configuration @EnableWebSecurity @EnableGlobalMethodSecurity verejná trieda SpringSecurityConfig rozširuje WebSecurityConfigurerAdapter {@Override protected void configure (HttpSecurity http) vyvoláva výnimku {}}

Prehlasujeme Konfigurovať () nič nerobiť, to znamená, že na dosiahnutie koncového bodu nebudeme musieť byť autentifikovaní, čo nám umožní sústrediť sa na čisto testovanie ukladania do pamäte cache.

Ďalej implementujeme jednoduchý koncový bod REST:

@GetMapping ("/ default / users / {name}") public ResponseEntity getUserWithDefaultCaching (@PathVariable názov reťazca) {return ResponseEntity.ok (nové UserDto (meno)); }

Výsledný kontrola cache hlavička bude vyzerať takto:

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

Na záver poďme implementovať test, ktorý zasiahne koncový bod, a presadiť, aké hlavičky sa odošlú v odpovedi:

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

To v podstate znamená, že prehľadávač túto odpoveď nikdy neuloží do medzipamäte.

Aj keď sa to môže javiť ako neúčinné, je tu skutočne dobrý dôvod pre toto predvolené správanie - Ak sa jeden používateľ odhlási a druhý sa prihlási, nechceme, aby mohol vidieť zdroje predchádzajúcich používateľov. Je oveľa bezpečnejšie, aby sme predvolene nič nekládali do medzipamäte, a necháme zodpovednosť za výslovné povolenie ukladania do pamäte cache.

3. Prekonanie predvoleného správania pri ukladaní do pamäte cache

Niekedy môžeme mať na mysli zdroje, ktoré chceme uložiť do pamäte cache. Ak to povolíme, bolo by najbezpečnejšie urobiť to pre každý zdroj. To znamená, že žiadne ďalšie zdroje sa predvolene nebudú ukladať do medzipamäte.

Aby sme to dosiahli, skúsme prepísať hlavičky ovládacích prvkov vyrovnávacej pamäte v jednej metóde obsluhy pomocou funkcie CacheControl cache. The CacheControl class je plynulý program na vytváranie, ktorý nám uľahčuje vytváranie rôznych typov ukladania do pamäte cache:

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

Poďme v tomto teste zasiahnuť tento koncový bod a tvrdiť, že sme zmenili hlavičky:

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

Ako vidíme, predvolené hodnoty sme prepísali a naša odpoveď sa teraz na 60 sekúnd uloží do vyrovnávacej pamäte prehliadača.

4. Vypnutie predvoleného správania pri ukladaní do pamäte cache

Môžeme tiež úplne vypnúť predvolené hlavičky kontroly cache pre Spring Security. Je to dosť riskantné a skutočne sa to neodporúča. Ale ak naozaj chceme, môžeme to skúsiť prekonaním konfigurovať metóda WebSecurityConfigurerAdapter:

@Override protected void configure (HttpSecurity http) vyvolá výnimku {http.headers (). Disable (); }

Poďme znova požiadať o náš koncový bod a pozrime sa, akú odpoveď dostaneme:

dané () .when () .get (getBaseUrl () + "/ default / users / Michael"). potom () .headers (nový HashMap ());

Ako vidíme, vôbec neboli nastavené žiadne hlavičky cache. Opäť to nie je bezpečné, ale dokazuje to, ako môžeme vypnúť predvolené hlavičky, ak chceme.

5. Záver

Tento článok ukazuje, ako Spring Security predvolene zakazuje ukladanie do vyrovnávacej pamäte HTTP, a vysvetľuje, že je to tak preto, lebo nechceme ukladať zabezpečené prostriedky do medzipamäte. Tiež sme videli, ako môžeme toto správanie podľa potreby zakázať alebo upraviť.

Implementáciu všetkých týchto príkladov a útržkov kódu nájdete v projekte GitHub - jedná sa o projekt Maven, takže by malo byť ľahké ho importovať a spustiť tak, ako je.