CSP(Content Security Policy) 콘텐츠 보안정책 SpringBoot Security 적용 방법

mocaccino·2024년 10월 28일

백엔드로드맵

목록 보기
10/19

CSP(Content Security Policy) 콘텐츠 보안정책이란 무엇인가?

브라우저가 웹 페이지에 허용되는 리소스를 제한해 보안을 강화하는 HTTP 응답 헤더이다. Content-Security-Policy 헤더를 사용하면 가져올 수 있는 리소스와 로드할 수 있는 URL을 제한할 수 있기 때문에 악의적인 스크립트나 리소스가 웹 페이지에 삽입되는 것을 방지할 수 있다.

등장배경

웹의 기본 보안은 동일 출처 정책(Same-Origin Policy)을 기반으로 한다.

  • 동일 출처 정책이란?

    특정 웹 페이지에서 로드된 리소스는 동일한 출처에서만 접근이 가능하도록 하여 데이터 유출과 악성 코드 실행을 방지하는 보안 규칙이다.

    예) https://mybank.com에서 로드된 웹 페이지는 동일한 도메인인https://mybank.com의 리소스만 액세스할 수 있고, 다른 출처( https://evil.example.com)에서 데이터나 스크립트를 로드할 수 없도록 제한한다.

그러나 동일 출처 정책은 완벽하지 않아서 악의적인 사용자가 XSS(교차 사이트 스크립팅) 공격으로 페이지에 악성 코드를 주입할 수 있다.

  • XSS 공격이란?

    웹 페이지에 의도치 않은 스크립트를 삽입하여 사용자 정보를 탈취하거나 악성 행동을 수행하도록 만드는 공격 방법.

CSP는 이러한 공격에 대한 추가 방어막 역할을 하며, 웹 페이지가 로드할 수 있는 리소스를 명확히 제한하여 동일 출처 정책을 보완한다.

주요 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를 통해서만 리소스 로드를 허용함

  • connect-src : Ajax 요청 및 Websocket 연결등의 네트워크 연결 요청 출처를 지정한다.
  • object-src : 플러그인 콘텐츠(예 : <object>태그)의 출처를 지정한다.

    Example
    object-src 'none' : 모든 소스에서 리소스를 로드하지 못하게 한다.

자바스크립트 코드에서 CSP 설정 방법

javascript에서는 주로 meta 태그를 사용해서 CSP를 설정할 수 있다.

<meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src 'self' https://trusted.com;">

위 코드는 동일 출처에서 모든 리소스를 로드할 수 있고, 이미지의 경우에는 https://trusted.com 에서 로드할 수 있도록 허용한다.

스프링 부트 코드에서의 CSP 설정 방법

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를 각각 정의해서 특정 출처에서만 리소스를 로드할 수 있도록 제한하였다.


참고

https://content-security-policy.com/

profile
레거시문서를 줄이자. 계속 업데이트해서 최신화한다.

0개의 댓글