Using Content Security Policy

초안
이 문서는 작성중입니다.

Content Security Policy을 설정하는 것은 어떤 정책을 실행하게 할 것인지를 결정하는 것을 포함하고 이런 정책 실행 부분을 Content-Security-Policy 헤더를 사용해서 정책을 실행하게 설정하는 것입니다.

Firefox 23이전에 X-Content-Security-Policy 헤더가 사용되었습니다. Firefox 23과 그 이후 버전은 표준인 Content-Security-Policy헤더를 사용합니다. 이전 헤더와 표준 헤더로 전환되는 동안 웹 사이트들은 Content-Security-Policy 와 Content-Security-Policy 양쪽 모두를 전송할 수 있습니다. 이런경우에는 X-Content-Security-Policy 헤더는 무시되고 Content-Security-Policy에 포함되어 있는 정책이 상용되게 됩니다.

Specifying your policy

정책을 지정하기 위해서 Content-Security-Policy HTTP 헤더를 아래 같이 정책을 지정할 수 있습니다:

Content-Security-Policy: policy

policy라는 문자열은 policy directives 를 포함해서 웹 사이트의 콘텐츠 보안 정책을 설명하게 됩니다. 

Writing a policy

A policy is described using a series of policy directives, each of which describes the policy for a certain resource type or policy area. Your policy should include a default-src policy directive, which is a fallback for any resource type you don't explicitly establish a policy for. A policy needs to include a default-src or script-src directive in order for CSP to restrict inline scripts from running, as well as blocking the use of eval(). A policy needs to include a default-src or style-src directive in order for CSP to restrict inline styles from being applied from a <style> element or a .style attribute

The syntax for a policy is a string of semicolon-separated directives, each following the syntax described in Supported policy directives.

Examples: Common use cases

웹 사이트를 위한 보안 정책을 사용하기 위해서 공통적인 시나리오들이 있습니다. 여기서 몇몇 예를 살펴보겠습니다.

Example 1

웹사이트의 관리자가 모든 웹 사이트 내의 콘텐츠는 사이트와 같은 도메인에서 제공하게하려고 한다. 단, 서브도메인은 제외: 

Content-Security-Policy: default-src 'self'

Example 2

웹 사이트 관리자가 모든 콘텐츠에 대해 신뢰하는 도메인과 그 서브 도메인에게 허용하려 한다. 

Content-Security-Policy: default-src 'self' *.mydomain.com

Example 3

웹 사이트 관리자가 웹 애플리케이션의 사용자가 어느 도메인에서라도 이미지를 웹 콘텐츠에 포함하기를 원하지만 오디오나 비디오는 신뢰하는 도메인만으로 제한하고 모든 스크립트는 신뢰할 수 있는 코드를 호스팅하는 특정 서버만 포함 시키려 한다.

Content-Security-Policy: default-src 'self'; img-src *; media-src media1.com media2.com; script-src userscripts.example.com

이것은 기본적으로 콘텐츠는 문서가 있는 원래 호스트에서만 허용된다. 아래와 같은 예외를 포함하고 있다.:

  • 이미지들은 어디서나 다운로드 될 수 있다. ( img-src에 "*" 로 표시).
  • 미디어는 media1.com 와 media2.com 에서만 허용한다 ( 그리고 이들 호스트의 서브도메인은 제외한다).
  • 실행 가능한 스크립트는 오로지 userscripts.example.com에서만 허용한다.

Example 4

온라인 뱅킹 사이트의 관리자가 사용자의 사이트 접속시 공격자가 내용을 엳듣는 것을 방지하기 위해서, 사이트의 모든 콘텐츠가 SSL을 사용해서 전달되도록 하기를 원한다면 다음과 같습니다. 

Content-Security-Policy: default-src https://onlinebanking.jumbobank.com

기본 콘텐츠가 전달되는 곳은 지정된 onlinebanking.jumbobank.com 가 HTTPS를 통해서만 사용하도록 정하고 있다.

Example 5

웹 메일 사이트의 관리자가 이메일 안의 HTML을 사용하게 하려하고 이미지는 어느 서버에서나 적재할 수 있지만 Javascript 혹은 다른 잠재적이고 위험한 콘텐츠가 아닌 곳에서는 허용하지 않는다. 

Content-Security-Policy: default-src 'self' *.mailsite.com; img-src *

이 예제는 CSP에 script-src;를 이용하지 않았지만 이 사이트는  default-src 디렉티브에 명시되어 설정된다. 이 의미는 스크립트들은 콘텐츠가 적재된 원래 서버에서만 적재될 수 있다는 의미이다.

Testing your policy

To ease deployment, CSP can be deployed in "report-only" mode. The policy is not enforced, but any violations are reported to a provided URI. Additionally, a report-only header can be used to test a future revision to a policy without actually deploying it.

You can use the Content-Security-Policy-Report-Only HTTP header to specify your policy, like this:

Content-Security-Policy-Report-Only: policy 

If both a Content-Security-Policy-Report-Only header and a Content-Security-Policy header are present in the same response, both policies are honored. The policy specified in Content-Security-Policy headers is enforced while the Content-Security-Policy-Report-Only policy generates reports but is not enforced.

Note that the X-Content-Security-Policy-Report-Only header was used before Firefox 23. If both the X-Content-Security-Policy-Report-Only and Content-Security-Policy-Report-Only are sent, the Content-Security-Policy-Report-Only will be used and the X-Content-Security-Policy-Report-Only will be ignored.

The UserCSP Addon also helps test and develop Content Security Policies for a site.

See also

 

Document Tags and Contributors

Contributors to this page: Androidbee
Last updated by: Androidbee,