과도하게 허용된 Spring CORS 설정

과도하게 허용된 Spring CORS 설정

설명

Spring의 CorsConfiguration 또는 @CrossOrigin에서 모든 출처 패턴을 허용하면서 credential 전송도 허용하면 인증 정보가 포함된 교차 출처 요청이 과도하게 허용됩니다. 브라우저가 인증 정보를 전송할 수 있는 조건에서는 신뢰하지 않는 사이트가 민감한 응답을 읽을 수 있습니다. 쿠키 정책 등도 적용되며, 이 설정만으로 쿠키 값이나 인증 헤더 자체가 상대 사이트에 전달되는 것은 아닙니다. 현재 Spring 문서는 allowedOrigins("*")와 allowCredentials(true) 조합을 거부하고 allowedOriginPatterns 사용을 별도로 설명하므로, 실제로 문제가 되는 설정은 originPatterns="*" 또는 setAllowedOriginPatterns(List.of("*")) 같은 전체 허용 패턴입니다.

잠재적 영향

  • 신뢰되지 않은 출처가 인증 쿠키가 포함된 요청을 보내도록 브라우저를 유도할 수 있습니다.
  • 민감한 API 응답이 외부 프런트엔드나 공격자 제어 페이지에서 접근될 수 있습니다.
  • Spring 기반 API 전반의 CORS 정책이 과도하게 열려 동일한 구성이 반복될 수 있습니다.

해결 방법

  • allowCredentials(true)를 사용할 때는 허용 출처를 명시적인 allowlist로 제한합니다.
  • 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;
    }
}

설명:

  • 변경 전: 모든 출처 패턴을 허용한 상태에서 credential 전송도 허용해, 어떤 Origin이든 매치되어 인증 정보가 포함된 교차 출처 요청이 과도하게 열립니다.
  • 변경 후: 명시적인 신뢰 도메인만 허용해 credential 사용 범위를 제한합니다.

@CrossOrigin(originPatterns = "*", allowCredentials = "true") 또는 originPatterns = {"*"}를 사용하는 경우에도 허용 출처를 제한하세요.

참조