페이지의 컨텐츠에서 사용하는 자원들이 모두 웹 서버에서 의도한 자원이 맞는지 확인하는 용도로 사용
XSS나 데이터를 삽입하는 류의 공격이 발생했을 때, 피해를 줄이고 웹 관리자가 공격 시도를 보고 받을 수 있도록 새롭게 추가된 보안 계층
XSS 공격은 브라우저가 서버로부터 전달받은 컨텐츠를 신뢰한다는 점을 이용->공격자에 의해 추가된 악성 컨텐츠도 믿음->CSP가 이를 방지하기 위해 웹 페이지에 사용될 수 있는 자원의 위치, 출처 등에 제약을 검
CSP 헤더: 1개 이상의 정책 지시문이 세미콜론으로 분리된 형태
정책 지시문은 지시문과 1개 이사의 출처가 공백으로 분리된 형태
지시문 : default-src, script-src 등
출처: 'self', https:, *.dreamhack.io 등
ex) default-src 'self' https://example.dreamhack.io
일반적으로 Content-Security-Policy HTTP 헤더에 추가하여 적용
ex) Content-Security-Policy: <policy-directive>; <policy-directive>
페이지 내부의 자원들이 같은 오리진이나 https://~에서만 로드되어야 함을 알려주는
ex) Content-Security-Policy: default-src 'self' https://~
헤더 외에 메타 태그의 엘리먼트로도 정의 가능
ex)<meta http-equiv="Content-Security-Policy" content="default-src 'self' https://example.dreamhack.io">
CSP Evaluator를 통해 작성한 CSP가 안전한지 검사 가능
CSP가 Inline Code를 유해하다고 간주 -> CSP 에서 Inline Code 사용 불가
Inline Code: src 속성으로 코드를 로드하지 않고 태그 내에 직접 코드를 삽입하는 것
ex)
<script>alert(1);</script>
script 태그 내에 코드를 직접 삽입 했기에 Inline Code
<script src="alert.js"></script> 와 같이 src 속성에 코드 경로 정의하는 방식 권장
script 태그 내 코드 삽입, on 이벤트 핸들러 속성(onerror, onfocus 등), javascript: url 스키마, CSS 스타일시트를 Inline Code로 간주
문자열 텍스트를 실행 가능한 자바스크립트 코드 형태로 변환하는 메커니즘을 유해하다고 간주
eval, new Function(), setTimeout([string], ...), setInterval([string], ...)
: 문자열 형태로 입력 받는 함수
단, 문자열 입력이 아닌 인라인 함수형태로 파라미터가 전달되는 경우 차단 x
차단
setTimeout("alert(1)", ...)
허용
setTimeout(function(){alert(1)}, ...)
<policy Directive>는 <directive>와 <value>로 구성
<directive>: 지시문, 컨텐츠 내에서 로드하는 리소스 세분화->어떤 리소스에 대한 출처를 제어할지 결정
<value>: 정의한 리소스의 출처 정의, 여러개의 출처 정의 가능(공백 통해 구분)
base> 태그에 나타날 수 있는 URL을 제어(서브도메인: https://hello.example.com의 hello)
base64-value>: nonce 속성을 설정하여 예외적으로 인라인 코드를 사용 <base64-value> 는 반드시 요청마다 다른 난수 값으로 설정, 해당 출처를 설정하면 unsafe-inline 은 무시됨hash-algorithm>-<base64-value>: script 혹은 style 태그 내 코드의 해시를 표현, 해당 출처를 설정하면 unsafe-inline 은 무시됨Content-Security-Policy: default-src 'self' Content-Security-Policy: default-src 'self' https://googleapis.com https://*.googleapis.comContent-Security-Policy: default-src 'self'; img-src *; script-src static.dreamhack.ioContent-Security-Policy: child-src 'self' frame.dreamhack.ioContent-Security-Policy: base-uri 'none' Content-Security-Policy: script-src 'unsafe-eval'Content-Security-Policy: script-src 'unsafe-inline'Content-Security-Policy: script-src ‘nonce-YTQyYWZkODYtYWYyNy00ZGQzLTg2YjMtNzJhY2ZmOWY5OGNj'Content-Security-Policy: script-src 'sha256-5jFwrAK0UV47oFbVg/iCCBbxD8X1w+QvoOUepu4C2YA='