Spring Boot · 2026-03-17

Spring Boot 엔드포인트 보안: CSRF·CORS·XSS 방어

Spring Boot 환경에서 엔드포인트 보안의 핵심인 CSRF, CORS, XSS의 개념과 Spring Security 설정 예제, 취약점 대응과 운영 관점 고려사항을 정리한 자료

작성일 : 2026-03-17 ㆍ 작성자 : 관리자
post
목차

소개

웹 애플리케이션이 외부와 통신할 때 엔드포인트 보안은 가장 먼저 확인해야 할 부분이다. CSRF, CORS, XSS는 흔한 취약점이다. 각 취약점의 원리와 Spring Boot에서의 실무적 설정 방안을 단계별로 정리한다. 이해를 돕기 위해 설정 예제와 운영 시 고려사항을 함께 제시한다.

CSRF 이해와 Spring Boot 설정

CSRF 개념

CSRF(Cross-Site Request Forgery)는 인증된 사용자의 권한을 이용해 의도하지 않은 상태 변경을 발생시키는 공격이다. 주로 세션 기반 인증을 사용하는 웹에서 문제가 된다. 안전한 처리에는 요청 출처 검증과 토큰 기반 검사가 필요하다.

Spring Security에서의 처리 원칙

Spring Security는 기본적으로 CSRF 방어를 제공한다. HTML 폼 기반 애플리케이션에서는 CSRF 토큰을 사용해 검증한다. 반면, 순수 REST API(토큰 기반 인증)에서는 CSRF 검사를 비활성화할 수 있다. 다만 그때는 다른 인증·검증 수단이 확실해야 한다.

설정 예제

일반적인 서버 렌더링 환경에서는 CookieCsrfTokenRepository를 사용해 CSRF 토큰을 쿠키로 전달하는 방법이 유용하다. SPA와 통신할 때는 프론트엔드가 쿠키에서 토큰을 읽어 요청 헤더에 붙여 보낸다.

 @Bean
 public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
     http
         .csrf(csrf -> csrf
             .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
         )
         .authorizeHttpRequests(auth -> auth
             .anyRequest().authenticated()
         )
         .formLogin(withDefaults());
     return http.build();
 }

반면 JWT 같은 토큰 기반 인증을 사용하는 REST API라면 CSRF를 명시적으로 비활성화하고, 토큰 검증을 철저히 하는 편이 현실적이다.

 @Bean
 public SecurityFilterChain apiSecurity(HttpSecurity http) throws Exception {
     http
         .csrf(csrf -> csrf.disable())
         .sessionManagement(sess -> sess.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
         .authorizeHttpRequests(auth -> auth.anyRequest().authenticated());
     return http.build();
 }

CORS(교차 출처 자원 공유) 이해와 설정

CORS 개념

CORS는 브라우저가 다른 출처의 리소스에 접근할 때 적용하는 정책이다. 서버가 허용한 출처만 요청을 수락하도록 한다. 프론트엔드와 백엔드가 분리된 환경에서 반드시 설정해야 한다.

Spring Security와 CORS 연동

Spring Security에서 CORS는 Security 설정에서 활성화하고, 별도의 CorsConfigurationSource로 세부 정책을 제공하는 방식이 안정적이다. 특히 credentials(쿠키) 사용 여부와 허용 출처를 정확히 명시해야 한다.

설정 예제

 @Bean
 public CorsConfigurationSource corsConfigurationSource() {
     CorsConfiguration config = new CorsConfiguration();
     config.setAllowedOrigins(List.of("https://example.com"));
     config.setAllowedMethods(List.of("GET","POST","PUT","DELETE"));
     config.setAllowedHeaders(List.of("Content-Type","X-CSRF-TOKEN"));
     config.setAllowCredentials(true);
     UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
     source.registerCorsConfiguration("/**", config);
     return source;
 }

 @Bean
 public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
     http
         .cors(cors -> cors.configurationSource(corsConfigurationSource()))
         .csrf(csrf -> csrf.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()));
     return http.build();
 }

CORS 설정 시 와일드카드(*)를 사용하면 쿠키 기반 인증과 충돌한다. 운영 환경에서는 명시적 도메인 목록을 유지하는 것이 안전하다.

XSS 개념과 방어 전략

XSS 개념

XSS(Cross-Site Scripting)는 공격자가 악성 스크립트를 페이지에 삽입해 다른 사용자의 브라우저에서 실행되게 하는 취약점이다. 입력 검증 실패와 출력 시 인코딩 누락이 주요 원인이다.

서버 측 방어 원칙

  • 입력 검증: 허용값(화이트리스트) 기준으로 필드 검증
  • 출력 인코딩: HTML, JavaScript, CSS 문맥에 맞는 인코딩 적용
  • 콘텐츠 보안 정책(CSP): 브라우저 차원의 스크립트 실행 제어
  • 신뢰할 수 없는 HTML 유지 시 HTML Sanitizer 사용

Spring Boot 적용 예

Spring에서 CSP와 보안 헤더를 추가하면 XSS 위험을 줄일 수 있다. 다음은 기본 헤더 설정 예시다.

 @Bean
 public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
     http
         .headers(headers -> headers
             .contentSecurityPolicy("default-src 'self'; script-src 'self'")
             .xssProtection(xss -> xss.block(true))
         )
         .csrf(csrf -> csrf.disable());
     return http.build();
 }

또한 사용자 입력을 그대로 렌더링하는 템플릿에서는 자동 이스케이프 기능을 활용한다. 프론트엔드에서 받은 데이터는 서버에서도 한 번 더 검증하고, 필요한 경우 HTML Sanitizer로 정화한다.

운영과 모니터링 관점

설정만으로 끝나지 않는다. 로그와 웹 방화벽, 정기적인 취약점 스캔이 병행되어야 보안 수준이 유지된다. 다음 항목을 권장한다.

  • 보안 헤더와 토큰 오류 로그 수집
  • 취약점 스캐너로 정기 점검
  • 변경 관리 시 보안 설정 회귀 테스트 포함

마무리

spring boot csrf 설정, spring boot xss 방어, spring security cors csrf 설정을 한 번에 이해하면 엔드포인트 보안이 크게 향상된다. 각 기술의 특징을 이해하고, 애플리케이션 특성에 맞춰 적절히 조합하는 것이 핵심이다.

spring boot csrf 설정 spring boot xss 방어 spring security cors csrf 설정 Spring Boot 보안 CSRF 방어 CORS 설정 XSS 방지 엔드포인트 보안