
브라우저가 웹 페이지에 허용되는 리소스를 제한해 보안을 강화하는 HTTP 응답 헤더이다. Content-Security-Policy 헤더를 사용하면 가져올 수 있는 리소스와 로드할 수 있는 URL을 제한할 수 있기 때문에 악의적인 스크립트나 리소스가 웹 페이지에 삽입되는 것을 방지할 수 있다.
웹의 기본 보안은 동일 출처 정책(Same-Origin Policy)을 기반으로 한다.
특정 웹 페이지에서 로드된 리소스는 동일한 출처에서만 접근이 가능하도록 하여 데이터 유출과 악성 코드 실행을 방지하는 보안 규칙이다.
예) https://mybank.com에서 로드된 웹 페이지는 동일한 도메인인https://mybank.com의 리소스만 액세스할 수 있고, 다른 출처( https://evil.example.com)에서 데이터나 스크립트를 로드할 수 없도록 제한한다.
그러나 동일 출처 정책은 완벽하지 않아서 악의적인 사용자가 XSS(교차 사이트 스크립팅) 공격으로 페이지에 악성 코드를 주입할 수 있다.
웹 페이지에 의도치 않은 스크립트를 삽입하여 사용자 정보를 탈취하거나 악성 행동을 수행하도록 만드는 공격 방법.
CSP는 이러한 공격에 대한 추가 방어막 역할을 하며, 웹 페이지가 로드할 수 있는 리소스를 명확히 제한하여 동일 출처 정책을 보완한다.
CSP는 특정 헤더를 사용하며 설정할 수 있는데, 각 헤더는 웹 페이지에서 어떤 리소스를 로드할 수 있는 지 정의한다.
default-src : 모든 리소스의 기본 출처 지정, 설정되지 않은 다른 항목에 이 설정이 기본 값으로 사용된다.
script-src : javascript 파일이 로드 될 수 있는 출처를 지정한다.
Example
script-src 'self' : 동일한 출처(동일한 주소 체계, 호스트 및 포트)에서 리소스를 로드 가능
script-src 'unsafe-eval' : JavaScript와 같은 안전하지 않은 동적 코드 평가를 허용함. eval()
style-src : CSS 파일의 출처를 지정한다.
img-src : 이미지 파일의 출처를 지정한다.
Example
img-src 'self' data : 데이터 체계(예:Base64로 인코딩된 이미지)를 통해 리소스를 허용함.
img-src https://cdn.com : 지정된 도메인과 일치하는 https를 통해서만 리소스를 로드할 수 있음.
img-src https: : 모든 도메인에서 https를 통해서만 리소스 로드를 허용함
javascript에서는 주로 meta 태그를 사용해서 CSP를 설정할 수 있다.
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src 'self' https://trusted.com;">
위 코드는 동일 출처에서 모든 리소스를 로드할 수 있고, 이미지의 경우에는 https://trusted.com 에서 로드할 수 있도록 허용한다.
SpringBoot의 SpringSecurity 에서 CSP 설정이 가능하다.
SecurityFilterChain을 사용한 최신 CSP 설정 방법은 아래와 같다.
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.headers(headers -> headers
.contentSecurityPolicy("default-src 'self'; script-src 'self' https://trusted-scripts.com")
);
return http.build();
}
}
SecurityFilterChain을 사용해서 CSP를 설정하는 방식으로, default-src와 script-src를 각각 정의해서 특정 출처에서만 리소스를 로드할 수 있도록 제한하였다.