«1. Обзор

Для оптимизации сети некоторые веб-сайты позволяют браузерам кэшировать ресурсы, такие как CSS или JS, в локальном хранилище. Это позволяет браузерам сохранять сетевое обращение для каждого запроса.

Таким образом, кэширование ресурсов жизненно важно для сокращения времени загрузки веб-страниц. Не менее важно очищать кэшированные данные, если они не требуются. Например, если пользователь выходит из веб-сайта, браузеры должны удалить все данные сеанса из кеша.

Есть две основные проблемы с кэшированием данных браузерами дольше, чем это необходимо:

    Современные веб-сайты используют богатый набор файлов CSS и JS, которые потребляют много памяти браузера Веб-сайты, которые кэшируют конфиденциальные данные, такие как файлы cookie сеанса, подвержены фишингу атаки

В этом руководстве мы увидим, как HTTP-заголовок ответа Clear-Site-Data помогает веб-сайтам очищать локально сохраненные данные из браузеров.

2. Заголовок Clear-Site-Data

Как и заголовок Cache-Control, Clear-Site-Data является заголовком ответа HTTP. Веб-сайты могут использовать этот заголовок, чтобы указать браузерам удалить данные, кэшированные в локальном хранилище.

Для веб-сайтов, требующих аутентификации, заголовок Cache-Control обычно включается в ответ /login и позволяет браузерам кэшировать пользовательские данные. Точно так же веб-сайты включают заголовок Clear-Site-Data в ответ /logout, чтобы очистить все кэшированные данные, принадлежащие этому пользователю.

На этом этапе важно понимать, что браузеры обычно классифицируют локальное хранилище по разным типам:

    Локальное хранилище Файлы cookie хранилища сеанса

нам указать целевое хранилище в заголовке:

    cache — для удаления локально кэшированных данных, включая файлы cookie как частного, так и общего кэша браузера — для удаления данных, хранящихся в хранилище файлов cookie браузера — для очистки локальных и сеансовых файлов cookie. хранение контекстов выполнения браузера — этот переключатель указывает браузеру перезагрузить вкладку браузера для этого 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("/baeldung/logout")
          .addLogoutHandler(new HeaderWriterLogoutHandler(
            new ClearSiteDataHeaderWriter(
              ClearSiteDataHeaderWriter.Directive.CACHE,
              ClearSiteDataHeaderWriter.Directive.COOKIES,
              ClearSiteDataHeaderWriter.Directive.STORAGE)));
    }
}

Здесь мы реализовали страницу входа и выхода с помощью Spring Security. В результате Spring добавит заголовок Clear-Site-Data в ответ на все запросы /baeldung/logout:

Clear-Site-Data: "cache", "cookies", "storage"

Если мы сейчас используем curl и отправим запрос на https://localhost:8080/baeldung/ 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.