CSP (Content Security Policy) 이해하기

What is Content Security Policy (CSP)?

CSP (Content Security Policy, 콘텐츠 보안 정책)는 웹 페이지가 로드할 수 있는 리소스를 제어하여 XSS 및 데이터 삽입 공격을 방지하는 보안 메커니즘입니다.

CSP는 HTTP 헤더를 통해 신뢰할 수 있는 콘텐츠 출처를 지정하여 악성 스크립트 실행을 차단합니다.

Why is CSP Important?

현대 웹 애플리케이션은 다양한 출처의 리소스를 사용하며, 이는 공격 기회를 제공합니다. CSP는 다음과 같은 방식으로 위협을 완화합니다:

  • XSS 공격 방지: 신뢰할 수 있는 스크립트 출처를 지정함으로써, CSP는 악의적인 스크립트가 주입되어 실행되는 것을 차단합니다.
  • 데이터 유출 방지: 특정 도메인으로만 데이터를 전송하도록 제한하여 민감한 정보가 외부로 유출되는 것을 막을 수 있습니다.
  • 클릭재킹 방지: frame-ancestors 지시어를 사용하여 다른 사이트에서 페이지를 프레임으로 로드하는 것을 제어함으로써 클릭재킹 공격을 예방할 수 있습니다.
  • 혼합 콘텐츠 방지: HTTPS 페이지에서 HTTP 콘텐츠가 로드되는 것을 방지하여 보안 연결을 유지합니다.

How Does CSP Work?

웹 서버는 Content-Security-Policy HTTP 헤더를 브라우저에 전송하여 리소스 로드를 제어합니다:

Content-Security-Policy: script-src 'self';

브라우저는 이 정책을 적용하여 위반하는 리소스를 차단하고 필요시 위반 보고서를 전송합니다.

Key CSP Directives

CSP는 다음과 같은 주요 지시어를 제공합니다:

지시어설명
default-src다른 많은 지시어에 대한 기본 정책을 설정합니다. 특정 지시어가 설정되지 않은 경우 이 값이 사용됩니다.
script-srcJavaScript 코드의 유효한 출처를 지정합니다.
style-srcCSS 스타일시트의 유효한 출처를 지정합니다.
img-src이미지의 유효한 출처를 지정합니다.
font-src글꼴의 유효한 출처를 지정합니다.
media-src오디오 및 비디오와 같은 미디어 파일의 유효한 출처를 지정합니다.
connect-srcfetch, XMLHttpRequest, WebSocket, EventSource 등을 사용하여 연결할 수 있는 출처를 제한합니다.
frame-src프레임으로 로드될 수 있는 유효한 출처를 지정합니다. (사용 중단됨, child-src 사용 권장)
child-src웹 워커 및 프레임과 같은 중첩된 브라우징 컨텍스트의 유효한 출처를 지정합니다.
object-src<object>, <embed>, <applet> 태그의 유효한 출처를 제어합니다. 보안상의 이유로 'none'으로 설정하는 것이 좋습니다.
frame-ancestors현재 페이지를 프레임, iframe, object, embed, applet 등으로 삽입할 수 있는 유효한 부모 출처를 지정합니다. 이는 클릭재킹 공격을 방어하는 데 중요합니다.
report-uri / report-toCSP 위반이 발생했을 때 브라우저가 보고서를 전송할 URL을 지정합니다. report-to는 새로운 지시어로, JSON 형식의 보고서를 지원하며 report-uri를 대체합니다.

Source Values

각 지시어는 다음과 같은 출처 값을 가질 수 있습니다:

출처 값설명
'self'현재 문서와 동일한 출처만 허용
'unsafe-inline'인라인 JavaScript 및 CSS 허용 (보안 위험)
'unsafe-eval'eval() 등의 기능 허용 (보안 위험)
'none'모든 출처 차단
https://example.com특정 도메인 허용
*.example.comexample.com의 모든 하위 도메인 허용
data:data URI 스킴 리소스 허용
nonce-<base64-value>특정 nonce가 있는 스크립트/스타일만 허용
sha256-<base64-value>특정 해시와 일치하는 인라인 코드 허용

How to Apply CSP

CSP 적용 방법:

  1. HTTP 헤더 (권장):

    • Nginx: add_header Content-Security-Policy "default-src 'self'; script-src 'self' https://trusted-cdn.com";
    • Apache: Header set Content-Security-Policy "default-src 'self'; script-src 'self' https://trusted-cdn.com"
  2. <meta> 태그 (일부 기능 제한):

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

    참고: <meta> 태그는 frame-ancestors, report-uri, sandbox 지시어를 지원하지 않습니다.

CSP Implementation Strategy

기존 웹사이트 기능이 중단되지 않도록 CSP를 점진적으로 도입하세요:

  • Report-Only 모드: 정책 시행 없이 위반 사항만 보고

    Content-Security-Policy-Report-Only: default-src 'self'; report-uri /csp-violation-report-endpoint;
    
  • 느슨한 정책으로 시작하여 점차 강화

  • 인라인 코드가 필요하면 'unsafe-inline' 대신 nonce/해시 사용

  • 정기적인 모니터링과 업데이트 수행

Benefits of CSP

  • 강력한 XSS 방어: 신뢰할 수 없는 스크립트 차단
  • 데이터 삽입 공격 감소: 악성 데이터 주입 제한
  • 클릭재킹 보호: frame-ancestors로 프레이밍 제어
  • 보안 인식 향상: 웹사이트 리소스 가시성 개선

Conclusion

CSP는 현대 웹 애플리케이션 보안의 필수 요소로, XSS 및 기타 일반적인 공격으로부터 보호합니다. 구현이 다소 복잡할 수 있지만, 보안상 이점이 매우 큽니다. 점진적인 도입과 지속적인 모니터링을 통해 웹사이트의 보안을 크게 강화할 수 있습니다.