진진이랑 2025. 1. 17. 08:00
728x90
반응형

CSP는 Content Security Policy로 웹 애플리케이션에서 XSS(Cross-Site-Scripting) 및 데이터 삽입 공격을 방지하기 위해서 사용하는 보안 기능이다. CSP는 브라우저가 웹 페이지에 로드할 수 있는 리소스 종류와 출처를 제한하도록 명시하는 HTTP응답헤더나 <meta>태그를 통해 설정된다.

CSP의 주요 목적 악성 스크립트의 실행을 방지하고, 신뢰할 수 없는 리소스 로드 차단 그리고 데이터 탈취 및 세션 하이재킹을 방어하는 것이다.
CSP 보안 정책은 xss와 같은 보안 취약점을 예방하고, 리소스 로드 제한으로 데이터 유출 방지를 할 수 있지만,
초기설정이 복잡해지거나 기존 사이트에 적용할 경우 호환성 문제가 발생할 수 있다. 그리고 개발 과정에서 외부 플러그인을 이용할 때도 CSP정책 위반되어 별도 설정들을 하여 허용하는 방식을 해야하기도 한다. 백엔드에서는 Spring framework, Spring Boot를 이용하여 개발할 때 Spring Security를 이용해서 CSP설정을 할 수 있다.


CSP의 동작 원리는 서버가 브라우저에 보낼 정책을 설정하고, 브라우저는 이 정책을 기반으로 허용되지 않는 리소스 로드를 차단한다.
예시는 다음과 같은 정책이 설정된 것이다.

//예시

Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted-cdn.com

모든 리소스의 기본 출처는 현재 도메인('self')로 제한한다.
스크립트는 현재 도메인 또는 지정된 신뢰할 수 있는  CDN에서만 로드한다.
 
CSP의 디렉티브를 설정 할 수도 있다.

  • default-src: 모든 리소스의 기본 출처를 설정.
  • script-src: 스크립트의 허용 출처를 설정.
  • style-src: CSS 스타일의 허용 출처를 설정.
  • img-src: 이미지 리소스의 허용 출처를 설정.
  • connect-src: AJAX 요청 등 네트워크 요청의 허용 출처를 설정.
  • font-src: 웹 폰트의 허용 출처를 설정.
  • frame-src: iframe 콘텐츠의 허용 출처를 설정.

 
그리고 해당 디렉티브 뒤에는 디렉티브에 맞는 출처 또는 제한 규칙을 설정해야 한다.

  • 'self': 현재 도메인만 허용.
    • 예: script-src 'self'
  • 'none': 아무 것도 허용하지 않음.
    • 예: script-src 'none'
  • 'unsafe-inline': 인라인 코드(예: <script> 내부의 코드)를 허용. (권장하지 않는 방법)
    • 예: style-src 'unsafe-inline'
  • 'unsafe-eval': eval()과 같은 실행 함수를 허용. (권장하지 않는 방법)
    • 예: script-src 'unsafe-eval'
  • URL 출처: 특정 URL을 허용.
  • 와일드카드(*): 모든 출처를 허용. (권장하지 않는 방법)
    • 예: img-src *
  • 데이터 스키마(data:): data: URI를 허용.
    • 예: img-src data:
  • 블롭 스키마(blob:): blob: URI를 허용.
    • 예: script-src blob:
  • 미디어 스키마(mediastream:): 미디어 스트림을 허용.
    • 예: media-src mediastream:
  • 파일 스키마(filesystem:): 파일 시스템 URI를 허용.
    • 예: script-src filesystem:
728x90
반응형