1. 概要

ネットワークを最適化するために、一部のWebサイトでは、ブラウザーがCSSやJSなどのリソースをローカルストレージにキャッシュできるようになっています。 これにより、ブラウザはすべてのリクエストのネットワークラウンドトリップを節約できます。

したがって、リソースのキャッシュは、Webページの読み込み時間を改善するために不可欠です。 同様に重要なのは、必要がなくなったらキャッシュされたデータをクリアすることです。 たとえば、 ユーザーがWebサイトからログアウトした場合、ブラウザーはすべてのセッションデータをキャッシュから削除する必要があります。

ブラウザが必要以上にデータをキャッシュすることには、主に2つの問題があります。

  • 最新のWebサイトは、ブラウザのメモリを大量に消費するCSSファイルとJSファイルの豊富なセットを使用しています
  • セッションCookieなどの機密データをキャッシュするWebサイトは、フィッシング攻撃を受けやすい

このチュートリアルでは、HTTPの Clear-Site-Data 応答ヘッダーが、Webサイトがブラウザーからローカルに保存されたデータをクリアするのにどのように役立つかを確認します。

2. Clear-Site-Dataヘッダー

Cache-Control ヘッダーと同様に、Clear-Site-DataはHTTP応答ヘッダーです。 Webサイトはこのヘッダーを使用して、ローカルストレージにキャッシュされているデータを削除するようにブラウザに指示できます。

認証が必要なWebサイトの場合、 Cache-Control ヘッダーは通常、 / login 応答に含まれ、ブラウザーがユーザーデータをキャッシュできるようにします。 同様に、Webサイトでは、 /logout応答にClear-Site-Dataヘッダーを含めて、このユーザーに属するキャッシュデータをクリアします。

この時点で、ブラウザは通常、ローカルストレージをさまざまなタイプに分類することを理解することが重要です。

  • ローカルストレージ
  • セッションストレージ
  • クッキー

Webサイトはこれらのタイプのいずれかにデータを保存できるため、 Clear-Site-Data を使用すると、ヘッダーでターゲットストレージを指定できます。

  • cache –ローカルにキャッシュされたデータを削除し、プライベートブラウザキャッシュと共有ブラウザキャッシュの両方を含みます
  • Cookies –ブラウザのCookieに保存されているデータを削除します
  • storage –ブラウザのローカルおよびセッションストレージをクリアします
  • executionContexts –このスイッチは、そのURLのブラウザタブをリロードするようにブラウザに指示します
  • * (アスタリスク)–上記のすべてのストレージ領域からデータを削除します

その結果、 Clear-Site-Data ヘッダーには、次のストレージタイプの少なくとも1つが含まれている必要があります。

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

次のセクションでは、 / logout サービスをSpringセキュリティに実装し、応答にClear-Site-Dataヘッダーを含めます。

3. Mavenの依存関係

SpringにClear-Site-Dataヘッダーを追加するコードを作成する前に、 spring-security-webspring-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 inSpringセキュリティ

Springは、応答にCache-Controlヘッダーを書き込むためのCacheControlユーティリティクラスを提供することを前に説明しました。 同様に、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)));
    }
}

ここでは、SpringSecurityを使用してログインおよびログアウトページを実装しました。 その結果、Springは、すべての / baeldung / logout リクエストに応答して、Clear-Site-Dataヘッダーを追加します。

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. 結論

この記事では、ブラウザが重要なユーザーデータを必要としない場合でもキャッシュすることの影響を調査しました。 たとえば、ユーザーがWebサイトからログアウトした後、ブラウザーはデータをキャッシュしないでください。

次に、HTTPの Clear-Site-Data responseヘッダーを使用して、Webサイトがブラウザーにローカルにキャッシュされたデータをクリアするように強制する方法を確認しました。

最後に、Springセキュリティに ClearSiteDataHeaderWriter を使用してログアウトページを実装し、このヘッダーをコントローラーの応答に追加しました。

いつものように、コードはGitHubから入手できます。