CSP 란?CSP 헤더 구문 HTML 메타 태그로 CSP 설정메타 태그의 한계Spring Security CSP 설정의존성 추가WebSecurityConfig.javaReportREFERENCE
CSP 란?
XSS 공격은 웹 서버가 사용자의 악의적인 입력을 검증하거나 인코딩하지 않고 처리하여 페이지를 렌더링할 때 발생합니다. 코드 주입, 클릭 재킹 또한 사용자의 데이터를 훔쳐 서버로 악의적인 공격을 할 수 있습니다.
CSP는 이러한 악의적인 공격들을 줄여주는 HTTP 응답 헤더 입니다.
웹 서버는 Content-Security-Policy 헤더를 통해 렌더링할 수 있는 리소스의 허용 목록을 지정합니다.(CSS, JavaScript, 이미지 등)
CSP 헤더 구문
Content-Security-Policy : <directive>; <directive>; <directive> ; …
HTML 메타 태그로 CSP 설정
HTML HEAD 부분에 아래의 코드를 추가하면 브라우저가 다른 출처로 form 데이터를 제출하는 것을 방지할 수 있습니다.
<meta http-equiv="Content-Security-Policy" content="form-action 'self';">
“form-action” 과 같은 부분을 Fetch 지시자(지시문)라고 하고 다양한 Fetch지시문은 아래 링크에서 확인 할 수 있습니다.
동일한 출처에게만 허용하려면 ‘self’로 추가하고 아니라면 “http://instakyuram.com/” 와 같이 다른 출처를 기입할 수도 있습니다.
메타 태그의 한계
메타 태그는 기능이 제한적입니다. 콘텐츠 보안 정책 위반을 보고하는 report 기능을 사용할 수 없습니다.
대신 Spring Security의 CSP설정의 도움을 받을 수 있습니다.
Spring Security CSP 설정
의존성 추가
Spring Security 의존성이 추가되어있지 않다면 추가 해줍니다.
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> <version>2.6.1</version> </dependency>
WebSecurityConfig.java
아래와 같이 설정할 수 있습니다
@EnableWebSecurity @Configuration @EnableConfigurationProperties({SecurityConfigProperties.class}) public class WebSecurityConfig { ... public SecurityFilterChain filterChain(HttpSecurity http, Jwt jwt, TokenService tokenService) throws Exception { http .headers() .contentSecurityPolicy("script-src 'self'; style-src 'self'"); } }

Report
브라우저가 차단한 요청을 Report하도록 POST 명령을 보낼 수 있습니다.
String REPORT_TO = "{\"group\":\"csp-violation-report\",\"max_age\":2592000,\"endpoints\":[{\"url\":\"https://localhost:8080/report\"}]}"; http .csrf().disable() .authorizeRequests() .antMatchers("/**").permitAll().and() .headers().addHeaderWriter(new StaticHeadersWriter("Report-To", REPORT_TO)) .xssProtection() .and() .contentSecurityPolicy("form-action 'self'; report-uri /report; report-to csp-violation-report");