Перейти к основному содержимому

Заголовок Clear-Site-Data в Spring Security

· 4 мин. чтения

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 .