過度に許可されたSpring CORS設定

過度に許可されたSpring CORS設定

説明

SpringのCorsConfigurationや@CrossOriginで全オリジンのパターンと認証情報を許可すると、認証情報付きのクロスオリジンアクセスが過度に開かれます。ブラウザーが認証情報を送信できる条件では、信頼できないサイトが機密性のある応答を読める可能性があります。Cookieポリシーなども適用され、この設定だけでCookieの値や認証ヘッダー自体が相手へ渡るわけではありません。SpringはallowedOrigins("*")とallowCredentials(true)の組み合わせを拒否しますが、allowedOriginPatternsではoriginPatterns="*"やsetAllowedOriginPatterns(List.of("*"))のようなパターンを許可します。

想定される影響

  • 信頼できない送信元が、認証Cookieを含むリクエストをブラウザーに送らせる可能性があります。
  • 外部フロントエンドや攻撃者のページから、機密性のあるAPI応答を読めるおそれがあります。
  • 共通のCORS設定が過度に開かれると、複数のSpring APIに影響する可能性があります。

対処方法

  • allowCredentials(true)を使う場合は、送信元を明示的な許可リストで制限してください。
  • originPatterns="*"やsetAllowedOriginPatterns(List.of("*"))のような全許可パターンを使わないでください。
  • 本番環境では必要な信頼済み送信元だけを許可し、認証・認可とCSRF対策も別途適用してください。

例

アプリケーションのCORS処理へ接続する設定オブジェクトの抜粋です。必要なメソッドとヘッダーも別途設定してください。

変更前

java
import java.util.List;
import org.springframework.web.cors.CorsConfiguration;

public class UnsafeCorsConfig {
    CorsConfiguration build() {
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowedOriginPatterns(List.of("*"));
        config.setAllowCredentials(true);
        return config;
    }
}

変更後

java
import java.util.List;
import org.springframework.web.cors.CorsConfiguration;

public class SafeCorsConfig {
    CorsConfiguration build() {
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowedOrigins(List.of("https://app.example.com"));
        config.setAllowCredentials(true);
        return config;
    }
}

説明:

  • 変更前: 全送信元に一致するパターンと認証情報を許可し、認証情報付きアクセスの範囲を広げすぎています。
  • 変更後: 認証情報付きアクセスを、明示した信頼済み送信元に制限します。

@CrossOrigin(originPatterns = "*", allowCredentials = "true")やoriginPatterns = {"*"}を使う場合も送信元を制限してください。

参考資料