1. Обзор
Для оптимизации сети некоторые веб-сайты позволяют браузерам кэшировать ресурсы, такие как CSS или JS, в локальном хранилище. Это позволяет браузерам сохранять сетевое обращение для каждого запроса.
Таким образом, кэширование ресурсов жизненно важно для сокращения времени загрузки веб-страниц. Не менее важно очищать кэшированные данные, если они не требуются. Например, если пользователь выходит из веб-сайта, браузеры должны удалить все данные сеанса из кеша.
Есть две основные проблемы с кэшированием данных браузерами дольше, чем требуется:
- Современные веб-сайты используют богатый набор файлов CSS и JS, которые потребляют много памяти браузера.
- Веб-сайты, кэширующие конфиденциальные данные, такие как сеансовые файлы cookie, подвержены фишинговым атакам.
В этом руководстве мы увидим, как HTTP -заголовок ответа Clear-Site-Data
помогает веб-сайтам очищать локально сохраненные данные из браузеров.
2. Очистить заголовок данных сайта
Как и заголовок Cache-Control
, Clear-Site-Data
является заголовком ответа HTTP. Веб-сайты могут использовать этот заголовок, чтобы указать браузерам удалить данные, кэшированные в локальном хранилище.
Для веб-сайтов, требующих аутентификации, заголовок Cache-Control
обычно включается в ответ /login
и позволяет браузерам кэшировать пользовательские данные. Точно так же веб-сайты включают заголовок Clear-Site-Data в ответ
/logout
, чтобы очистить все кешированные данные, принадлежащие этому пользователю.
На этом этапе важно понимать, что браузеры обычно подразделяют локальное хранилище на разные типы:
- Локальное хранилище
- Хранилище сеансов
- Печенье
Поскольку веб-сайты могут хранить данные в любом из этих типов, Clear-Site-Data
позволяет указать целевое хранилище в заголовке:
кеш
— для удаления локально кэшированных данных и включает как частный, так и общий кеш браузера.куки
– для удаления данных, хранящихся в куки браузераstorage
— очистить локальное и сеансовое хранилище браузераexecuteContexts
— этот переключатель указывает браузеру перезагрузить вкладку браузера для этого URL-адреса.*
(звездочка) — удаляет данные из всех вышеперечисленных областей хранения
В результате заголовок Clear-Site-Data
должен включать хотя бы один из следующих типов хранилища:
Clear-Site-Data: "cache", "cookies", "storage", "executionContexts"
В следующих разделах мы реализуем службу /logout
в Spring Security и включим в ответ заголовок Clear-Site-Data .
3. Зависимость от Maven
Прежде чем мы напишем код для добавления заголовка Clear-Site-Data
в Spring, давайте добавим в проект зависимости spring-security-web
и spring-security-config :
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
4. ClearSiteDataHeaderWriter
в Spring Security
Ранее мы обсуждали, что Spring предоставляет служебный класс CacheControl
для записи заголовков Cache-Control
в ответ. Точно так же Spring Security предоставляет класс ClearSiteDataHeaderWriter
для простого добавления заголовка в ответ HTTP :
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf()
.disable()
.formLogin()
.loginPage("/login.html")
.loginProcessingUrl("/perform_login")
.defaultSuccessUrl("/homepage.html", true)
.and()
.logout().logoutUrl("/foreach/logout")
.addLogoutHandler(new HeaderWriterLogoutHandler(
new ClearSiteDataHeaderWriter(
ClearSiteDataHeaderWriter.Directive.CACHE,
ClearSiteDataHeaderWriter.Directive.COOKIES,
ClearSiteDataHeaderWriter.Directive.STORAGE)));
}
}
Здесь мы реализовали страницу входа и выхода с помощью Spring Security. В результате Spring добавит заголовок Clear-Site-Data
в ответ на все запросы /foreach/logout
:
Clear-Site-Data: "cache", "cookies", "storage"
Если мы сейчас воспользуемся curl
и отправим запрос на https://localhost:8080/foreach/logout
, то получим в ответ следующие заголовки:
{ [5 bytes data]
< HTTP/1.1 302
< Clear-Site-Data: "cache", "cookies", "storage"
< X-Content-Type-Options: nosniff
< X-XSS-Protection: 1; mode=block
< Cache-Control: no-cache, no-store, max-age=0, must-revalidate
< Pragma: no-cache
< Expires: 0
< Strict-Transport-Security: max-age=31536000 ; includeSubDomains
< X-Frame-Options: DENY
< Location: https://localhost:8080/login.html?logout
< Content-Length: 0
< Date: Tue, 17 Mar 2020 17:12:23 GMT
5. Вывод
В этой статье мы изучили влияние браузеров, кэширующих важные пользовательские данные, даже если это не требуется. Например, браузеры не должны кэшировать данные после того, как пользователь вышел из веб-сайта.
Затем мы увидели, как HTTP -заголовок ответа Clear-Site-Data
позволяет веб-сайтам заставлять браузеры очищать локально кэшированные данные.
Наконец, мы реализовали страницу выхода в Spring Security с помощью ClearSiteDataHeaderWriter
, чтобы добавить этот заголовок в ответ контроллера.
Как всегда, код доступен на GitHub .