본문 바로가기
웹 보안 정책

CSP(Content-Security Policy)

by 웹하는빡통 2019. 12. 31.

콘텐츠 보안 정책(Content-Security policy)신뢰할 수있는 웹 페이지 컨텍스트에서 악의적 인 콘텐츠 실행으로 인한 크로스 사이트 스크립팅, 클릭 재킹 및 기타 코드 삽입 공격을 방지하기 위해 도입 된 컴퓨터 보안 표준이다. 

웹에서 사용하는 컨텐츠(이미지,스크립트 등등)에 대한 규칙 같은거라 생각하면 된다.
SOP(Same Origin Policy)와 유사하게 차단한다는 점에서 비슷하지만,

CSP의 경우 웹 사이트가 직접 룰을 적용해서 사용하게 된다. 

 

CSP에 사용되는 대표적인 헤더들이 있는데 바로

Content-Security-Policy : W3C에서 지정한 표준헤더, 대부분 이걸 사용
X-Content-Security-Policy : Firefox/IE 구형 브라우저에서 사용되는 헤더
X-WebKit-CSP : Chrome 기반의 구형 브라우저에서 사용되는 헤더

 

예시)

만약 공격자가 XSS공격을 한다 가정 해보자 일반적으로 XSS공격은 브라우저가 애플리케이션에 속한 스크립트와 그렇지 않은 악의적인 스크립트를 구분하지 못할때 생기는 취약점이다. 

예를 들어 https://www.google.com/js/google.js에서 코드를 로드하고 실행한다 가정하자 그러면 우리는 그 코드를 신뢰할 것이다. 그리고 그 코드를 받은 브라우저에게도 이상이 없는 코드로 판단할 것이지만 

만약 https://www.google.com/js/google.js가 아닌 https://www.google.com/js/gogle.js라는악의적인 코드가있다고 하자 그러면 이 코드가 악의적인 코드인지를 스스로 판단하기는 어려울 것이다 왜냐 브러우저는 소스에코드에 상관없이 페이지에 요청하는 코드라면 무조건적으로 그 코드가 악의적인지 아닌지 상관없이 다운로드하여 실행하기 때문이다.  이를 방지하기 위해 CSP를 사용하는 것이다. 서버에 제공하는 모든것을 맹목적으로 신뢰하는 대신 CSP는 신뢰할 수 있는 콘텐츠 소스의 허용 목록을 생성 할 수 있게 해주는 Content-Security-Policy HTTP 헤더를 정의하고 브라우저에는 이런 소스에서 받은 리소스만 실행하거나 렌더링할 것을 지시하게 된다. 그러면 공격자가 아무리 악성 스크립트를 주입하더라도 그 스크립트가 허용 목록과 일치 하지 않으니 공격실행 자체가 될 수 없는 것이다. 

아래 사진은 코드의 출처가 다음 두 가지 소스 중 하나일 때만 스크립트 실행을 허용하는 정책을 정의하는 코드이다. 

그렇다 끝이다 정말 간단하다. script-src는 특정 페이지에 대한 스크립트 관련 권한 집합을 제어하는 지시문이고.

self를 이용하여 스크립트의 한 가지 유효한 소스로 지정한다. https://apis.google.com 또한 유효한 다른 소스로 지정한 것을 알 수 있다.  브라우저는 현재 페이지의 출처뿐 아니라 HTTPS를 통해 apis.google.com에서도 제공되는 자바스크립트를 다운하고 실행한다.  

 

그리고 위 사진같이 CSP 보안정책을 정의한 상태에서 공격자가 다른 소스에서 스크립트를 로드할 경우 오류를 발생시켜 버린다. 그러면 공격자가 아무리 사이트로 악성코드를 주입하더라도 즉시 오류 메시지가 발생하여 어떠한 공격을 할 수 없게 되는 것이다.  

 

다양한 리소스 정책적용 

CSP는 페이지가 로드하도록 허용되는 리소스를 상당히 세분화하여 제어할 수 있는 다양하고 충분한 정책 지시문을 제공한다. 

  • base-uri 는 페이지의 <base> 요소에 나타날 수 있는 URL을 제한합니다.

  • child-src 는 작업자와 삽입된 프레임 콘텐츠에 대한 URL을 나열합니다. 예: child-src https://youtube.com을 사용하면 다른 출처가 아니라 YouTube에서 가져온 동영상을 삽입할 수 있습니다. 지원 중단된 frame-src 지시문 대신 이 지시문을 사용하세요.

  • connect-src 는 (XHR, WebSockets 및 EventSource를 통해) 연결할 수 있는 출처를 제한합니다.

  • font-src 는 웹 글꼴을 제공할 수 있는 출처를 지정합니다. font-src https://themes.googleusercontent.com을 통해 Google의 웹 글꼴을 사용할 수 있습니다.

  • form-action  <form> 태그에서의 제출을 위해 유효한 엔드포인트를 나열합니다.

  • frame-ancestors 는 현재 페이지를 삽입할 수 있는 소스를 지정합니다. 이 지시문은 <frame>, <iframe>, <embed>  <applet> 태그에 적용됩니다. 이 지시문은 <meta> 태그에서 사용할 수 없고 HTML 이외의 리소스에만 적용됩니다.

  • frame-src 는 지원 중단되었습니다. child-src 를 대신 사용하세요.

  • img-src 는 이미지를 로드할 수 있는 출처를 정의합니다.

  • media-src 는 동영상과 오디오를 제공하도록 허용되는 출처를 제한합니다.

  • object-src 는 플래시와 기타 플러그인에 대한 제어를 허용합니다.

  • plugin-types 는 페이지가 호출할 수 있는 플러그인의 종류를 제한합니다.

  • report-uri  콘텐츠 보안 정책 위반 시 브라우저가 보고서를 보낼 URL을 지정합니다. <meta> 태그에서는 이 지시문을 사용할 수 없습니다.

  • style-src  script-src에서 스타일시트에 해당합니다.

  • upgrade-insecure-requests 는 사용자 에이전트에 URL 구성표를 다시 작성하여 HTTP를 HTTPS로 변경하도록 지시합니다. 이 지시문은 다시 작성해야 할 이전 URL이 많은 웹사이트를 위한 것입니다.   

해당 정책 정의 출처: https://developers.google.com/web/fundamentals/security/csp/?hl=ko(좀 더 자세한 내용을 보고싶으면 해당 링크로 들어가시면 됩니다~) 

 

   또한 속성에 매핑도는 값은 4가지 정도 있습니다.
- 'none'은 예상할 수 있듯이 아무것과도 일치하지 않습니다.
- 'self' 는 현재 출처와 일치하지만 하위 도메인은 일치하지 않습니다.
- 'unsafe-inline'은 인라인 자바스크립트 및 CSS를 허용합니다.
- 'unsafe-eval'은 eval 같은 텍스트-자바스크립트 메커니즘을 허용합니다.

 

CSP 보안정책에 대한 좀더 세부적인 내용은 차차 추가적으로 수정하여 블로깅 하겠습니다~.

'웹 보안 정책' 카테고리의 다른 글

SOP(Same-Origin-Policy)  (1) 2019.12.26

댓글