CSP는 웹 페이지 보안을 위해 인라인 코드와 문자열을 실행하는 메커니즘을 기본적으로 차단한다.
CSP 기본 정책 - 인라인 코드 (Inline Code)
인라인 코드 차단: <script>alert(1);</script>와 같이 <script> 태그 안에 직접 코드를 삽입하는 인라인 코드를 유해하다고 간주하여 사용을 차단
외부 스크립트 권장: 인라인 코드 대신 <script src="alert.js"></script> 처럼 scr 속성을 사용해 외부 스크립트를 로드하도록 권장
허용되지 않는 인라인 코드 유형:
on 이벤트 핸들러 속성 (예: onclick="...")
javascript: URL 스킴
인라인 <style> 태그와 style 속성도 차단되며, 외부 스타일시트 사용을 권장
CSP 기본 정책 - eval
eval 차단: eval() 함수과 같이 문자열을 실행 가능항 자바스크립트 고드로 변환하는 모든 메커니즘을 차단
차단되는 예제: setTimeout("alert(1)", ....) 와 같이 문자열을 사용한 함수 호출은 차단
허용되는 예제: setTimeout(function(){alert(1)}, ...) 처럼 인라인 함수 형태로 전달되는 경우는 허용
Policy Directive
<directive> <value>형식으로 구성됨
<directive> (지시문):어떤 종류의 리소스에 대해 출처를 제어할지 결정하는 역할
<value> (값): 지시문에서 제어할 리소스의 출처를 정의하며, 여러 출처를 공백으로 구분하여 나열 가능
지시문
설명
default-src
-src로 끝나는 모든 지시문의 기본 동작을 제어합니다. 만약 CSP 구문 내에서 지정하지 않은 지시문이 존재한다면default-src의 정의를 따라갑니다.
img-src
이미지를 로드할 수 있는 출처를 제어합니다.
script-src
스크립트 태그 관련 권한과 출처를 제어합니다.
style-src
스타일시트 관련 권한과 출처를 제어합니다.
child-src
페이지 내에 삽입된 프레임 컨텐츠에 대한 출처를 제어합니다.
base-uri
페이지의 <base>태그에 나타날 수 있는 URL을 제어합니다.
값 (출처)
설명
*://example.com
출처의 scheme은 와일드카드를 이용해 표현할 수 있습니다.
https://*.example.com
출처의 호스트 서브도메인은 와일드카드를 이용해 표현할 수 있습니다. (단, 와일드카드는 호스트의 중간에 들어갈 수 없습니다. i.e)https://www.*.com,https://*.example.* 또한 서브도메인을 와일드카드로 표현할 시, 서브도메인이 붙어있지 않는 도메인은 포함되지 않습니다. i.e)https://*.example.com으로 출처를 표기할 경우,https://example.com은 포함 안됨
https://example.com:*
출처의 포트는 와일드카드를 이용해 표현할 수 있습니다.
none
모든 출처를 허용하지 않습니다.
self
페이지의 현재 출처 (Same Origin) 내에서 로드하는 리소스만 허용합니다.
unsafe-inline
예외적으로 인라인 코드의 사용을 허용합니다.
unsafe-eval
예외적으로eval과 같은 텍스트-자바스크립트 변환 메커니즘의 사용을 허용합니다
nonce-<base64-value>
nonce속성을 설정하여 예외적으로 인라인 코드를 사용합니다.<base64-value>는 반드시 요청마다 다른 난수 값으로 설정해야 합니다. 해당 출처를 설정하면unsafe-inline은 무시됩니다.
<hash-algorithm>-<base64-value>
script혹은style태그 내 코드의 해시를 표현합니다. 해당 출처를 설정하면unsafe-inline은 무시됩니다.