[WebTier/Apache] Content Security Policy Header
1. Overview
Content Security Policy Header를 테스트한다.
default-src 개념만 알면, 나머지 XXX-src 는 동일하므로 default/script-src 만 테스트한다.
2. Descriptions
2.1 default-src
아래와 같이 설정 시에, 모든 동작(img, css, media, script, connect)이 수행되지 않는다.
1
2
3
<IfModule mod_headers.c>
Header always set Content-Security-Policy: "default-src 'none';"
</IfModule>
예시로 Javascript 동작 과정에서 default-src를 살펴보자.
다음의 Inline Script , HTML 로 구성된 경우,
1
2
3
4
5
6
7
8
9
<html>
<head>
<meta charset="UTF-8">
<title>Welcome</title>
</head>
<body>
<button onclick="alert('Hello World')">Button</button>
</body>
</html>
Button 이 동작하지 않으며 Browser Console에 log가 있다.
1
Refused to apply inline style because it violates the following Content Security Policy directive: "default-src 'self'". Either the 'unsafe-inline' keyword, a hash ('sha256-biLFinpqYMtWHmXfkA1BPeCY0/fNt46SAZ+BBk5YUog='), or a nonce ('nonce-...') is required to enable inline execution. Note that hashes do not apply to event handlers, style attributes and javascript: navigations unless the 'unsafe-hashes' keyword is present. Note also that 'style-src' was not explicitly set, so 'default-src' is used as a fallback.
self(나 자신 허용, 하위 도메인은 아님) 설정을 하거나, wls.local:80
도메인은 허용 설정 할 수 있다.
그러나 아래와 같은 설정에도, script 는 동작하지 않는다.
1
2
3
Header always set Content-Security-Policy: "default-src 'self';"
또는
Header always set Content-Security-Policy: "default-src wls.local:80;"
그 이유는, 위 Browser Console log에도 나와 있는데,
최소한 아래와 같이 unsafe-inline
으로 inline javascript 허용을 해야 한다.
1
2
3
Header always set Content-Security-Policy: "default-src 'self' 'unsafe-inline';"
또는
Header always set Content-Security-Policy: "default-src 'none' 'unsafe-inline';"
2.2 script-src
script-src를 self(나 자신 허용, 하위 도메인 불가) 설정 시에는 unsafe-inline
등의 설정이 없어도 된다.
1
Header always set Content-Security-Policy: "default-src 'none'; script-src 'self';"
다음과 같이 외부 도메인의 External Script 설정이 있다.
1
2
3
4
5
6
7
8
9
10
<html>
<head>
<meta charset="UTF-8">
<title>Welcome</title>
<script src="http://child.wls.local/scripts/button.js"></script>
</head>
<body>
<button>Button</button>
</body>
</html>
아래와 같이 self
뿐만 아니라 하위 도메인도 별개로 추가 해야 한다.
1
Header always set Content-Security-Policy: "default-src 'none'; script-src 'self' child.wls.local;"
3. 참고
- https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP
- https://cyberx.tistory.com/171
- https://velog.io/@taylorkwon92/%EC%98%A4%EB%8A%98%EC%9D%98-TIL