✔️ 컨텐츠 보안 정책(Content Security Policy)
- 교차 사이트 스크립팅(XSS)과 데이터 주입 공격을 비롯한 특정 유형의 공격을 탐지하고 완화하는 데 도움이 되는 추가 보안 계층이다.
▶️ 이러한 공격은 데이터 절도에서 사이트 훼손, 맬웨어 배포에 이르기까지 모든 것에 사용된다.
- CSP는 이전 버전과 완벽하게 호환되도록 설계되었다.
- CSP를 지원하지 않는 브라우저는 CSP를 무시하고 평소와 같이 작동하며 기본적으로 웹 콘텐츠에 대한 표준 동일 출처 정책을 사용한다.
- 사이트에서 CSP 헤더를 제공하지 않는 경우 브라우저도 마찬가지로 표준 동일 출처 정책을 사용한다.
- SOP(Same Origin Policy)와 유사하게 차단한다는 점에서 비슷하지만, CSP의 경우 웹 사이트가 직접 룰을 적용해서 사용하게 된다.
예시
- 일반적으로 XSS공격은 브라우저가 애플리케이션에 속한 스크립트와 그렇지 않은 악의적인 스크립트를 구분하지 못할때 생기는 취약점이다.
- 브러우저는 소스 코드에 상관없이 페이지에 요청하는 코드라면 무조건적으로 그 코드가 악의적인지 아닌지 상관없이 다운로드하여 실행한다. 이를 방지하기 위해 CSP를 사용하는 것이다.
- 서버에 제공하는 모든것을 맹목적으로 신뢰하는 대신 CSP는 신뢰할 수 있는 콘텐츠 소스의 허용 목록을 생성 할 수 있게 해주는 Content-Security-Policy HTTP 헤더를 정의하고 브라우저에는 이런 소스에서 받은 리소스만 실행하거나 렌더링할 것을 지시하게 된다.
- 그러면 공격자가 아무리 악성 스크립트를 주입하더라도 그 스크립트가 허용 목록과 일치하지 않으니 공격실행 자체가 될 수 없는 것이다.
✔️ CSP 활성화
- Content-Security-Policy HTTP 헤더를 반환하도록 웹 서버를 구성해야 한다.
<meta> 요소를 사용하여 정책을 구성할 수 있다.
<meta
http-equiv="Content-Security-Policy"
content="default-src 'self'; img-src https://*; child-src 'none';" />
◼️ 정책 작성하기
- 자체 정책이 없을 때는 다른 리소스 유형에 대한 폴백인
default-src 지시문을 포함해야 한다.
- 인라인 스크립트 실행을 방지하고
eval() 사용을 차단하려면 정책에 default-src 또는 script-src 지시문을 포함해야 한다.
- 인라인 스타일이
<style> 요소 또는 style 속성에서 적용되는 것을 제한하려면 정책에 default-src 또는 style-src 지시문이 포함되어야 한다.
- 다양한 유형의 항목에 대한 특정 지시문이 있으므로 각 유형은 글꼴, 프레임, 이미지, 오디오 및 비디오 미디어, 스크립트 및 작업자를 포함하여 자체 정책을 가질 수 있다.
⭐ 예시 1
- 모든 콘텐츠가 사이트 자체의 출처(하위 도메인 제외)에서 오기를 원한다.
Content-Security-Policy: default-src 'self'
⭐ 예시 2
- 신뢰할 수 있는 도메인 및 모든 하위 도메인의 콘텐츠를 허용하려고 한다(CSP가 설정된 도메인과 동일할 필요는 없음).
Content-Security-Policy: default-src 'self' example.com *.example.com
⭐ 예시 3
- 웹 애플리케이션 사용자가 자신의 콘텐츠에 모든 원본의 이미지를 포함할 수 있도록 허용하지만 오디오 또는 비디오 미디어는 신뢰할 수 있는 공급자로 제한하고
모든 스크립트는 신뢰할 수 있는 코드를 호스팅하는 특정 서버로만 제한하려고 한다.
Content-Security-Policy: default-src 'self'; img-src *; media-src example.org example.net; script-src userscripts.example.com
- 이미지는 출처에 상관없이 로드할 수 있다("*" 와일드카드 참고).
- 미디어는 example.org 및 example.net에서만 허용되며 해당 사이트의 하위 도메인에서는 허용되지 않는다.
- 실행 가능한 스크립트는 userscripts.example.com에서 온 것만 허용된다.
⭐ 예시 4
- 온라인 뱅킹 사이트의 웹 사이트 관리자는 공격자가 요청을 도청하는 것을 방지하기 위해 모든 콘텐츠가 TLS를 사용하여 로드되었는지 확인하려고 한다.
Content-Security-Policy: default-src https://onlinebanking.example.co
- 서버는 단일 출처인 onlinebanking.example.com에서 특별히 HTTPS를 통해 로드되는 문서에 대한 액세스만 허용한다.
⭐ 예시 5
- 웹 메일 사이트의 웹 사이트 관리자는 전자 메일에 HTML을 허용하고 어디에서나 로드된 이미지를 허용하려고 하지만
JavaScript 또는 기타 잠재적으로 위험한 콘텐츠는 허용하지 않으려고 한다.
Content-Security-Policy: default-src 'self' *.example.com; img-src *
- 이 예제에선 script-src를 지정하지 않고, default-src 지시문을 사용한다. 즉, 원본 서버에서만 스크립트를 로드할 수 있습니다.
참고글1 https://developer.mozilla.org/ko/docs/Web/HTTP/CSP
참고글2 https://webstone.tistory.com/98