새소식

인기 검색어

보안/웹(Web)

CSP(Content Security Policy)

  • -

1) CSP

 

- XSS 나 데이터를 삽입하는 종류의 공격이 발생하였을 때 피해를 줄이고 웹 관리자가 공격 시도를 보고받을 수 있도록 

 

새롭게 추가된 보안 계층

 

- XSS 공격은 브라우저가 서버로부터 전달받은 컨텐츠를 신뢰한다는 점을 이용하는데, CSP 는 이를 방지하기 위해 웹 

 

페이지에 사용될 수 있는 자원의 위치, 출처 등에 제약을 걸 수 있다.

 

- CSP 구문은 일반적으로 Content-Security-Policy 로 HTTP 헤더에 추가하여 적용할 수 있다

 

예시)

GET / HTTP/1.1
Host: 127.0.0.1:8080
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
Connection: close
Content-Securty-Policy: self,script-src ~~

 

 

- meta 태그의 속성으로 정의하는 방법도 있다.

 

<meta http-equiv="Content-Security-Policy" content="default-src 'self'">

 

- CSP 에서는 인라인 코드를 유해하다고 간주한다. 따라서 CSP를 사용할 때는 기본적으로 인라인 코드를 사용할 수 없다.

 

따라서 <script src="alert.js" /> 이런식으로 코드를 src 속성을 통해 로드해야 한다.

 


- <script> 태그 내에 코드를 삽입하는 것을 포함하여 on* 이벤트 핸들러 속성,  javascript: 스키마 또한 인라인 코드로 

 

간주하고 허락하지 않는다.



- CSP는 기본적으로 eval함수와 같이 문자열 텍스트를 실행가능한 자바스크립트 코드 형태로 변환하는 매커니즘도 유해

 

하다고 간주한다. 문자열 형태로 입력을 받는 함수의 실행은 모두 차단된다.

 

(eval, new Function(), setTimeout([string], ...), setInterval([string], ...) ) 하지만 해당 함수에 문자열 입력이 아닌 인라인 

 

함수 형태로 파라미터가 전달 될 때에는 차단되지 않는다.

 

 

2) CSP에 사용되는 명령어

 

CSP 에 사용되는 명령어는 (명령, 값) 형식으로 사용된다. default-src, img-src 등이 명령에 포함되고,  self, unsafe-inlie

 

등이 값에 포함된다. 

 

예시) default-src 'self','unsafe-inline'

 

 

 

- 명령

 

default-src : src로 끝나는 모든 리소스의 기본 동작을 제어한다. 만약 CSP 구문 내에서 지정하지 않은 지시문이

 

존재한다면 default-src의 정의를 따라간다.



img-src : 이미지를 로드할 수 있는 출처를 제어한다.

 


script-src : 스크립트 태그 관련 권한과 출처를 제어한다.

 


style-src : 스타일시트 관련 권한과 출처를 제어한다.

 


child-src : 페이지 내에 삽입된 프레임 컨텐츠에 대한 출처를 제어한다.

 


base-uri : 페이지의 <base> 태그에 나타날 수 있는 URL을 제어한다.

 

 

 

- 값

 

*://example.com : 출처의 scheme은 와일드카드를 이용해 표현할 수 있다.



https://*.example.com : 출처의 호스트 서브도메인은 와일드카드를 이용해 표현할 수 있다. 

 

(단, 와일드카드는 호스트의 중간에 들어갈 수 없다. https://www.*.com, https://*.example.* 등의 경우는

 

사용할 수 없음)

 

또한 서브도메인을 와일드카드로 표현할 시, 서브도메인이 붙어있지 않는 도메인은 포함되지 않는다. 

 

예시) https://*.example.com으로 출처를 표기할 경우, https://example.com/ 은 포함 안됨

 


https://example.com:* : 출처의 포트는 와일드카드를 이용해 표현할 수 있다.

 

none : 모든 출처를 허용하지 않는다.

 

self : 페이지의 현재 출처 (Origin) 내에서 로드하는 리소스만 허용한다.



unsafe-inline : 예외적으로 인라인 코드의 사용을 허용한다.

 


unsafe-eval : 예외적으로 eval과 같은 텍스트-자바스크립트 변환 메커니즘의 사용을 허용한다.



nonce-<base64-value> : nonce 속성을 설정하여 예외적으로 인라인 코드를 사용한다. <base64-value> 는

 

반드시 요청마다 다른 난수 값으로 설정해야 한다. 해당 출처를 설정하면 unsafe-inline 은 무시된다.

'보안 > 웹(Web)' 카테고리의 다른 글

JWT (Json Web Token)  (0) 2024.07.08
[PHP] mysqli_real_escape_string 함수  (1) 2023.01.09
XSS (Cross Site Scripting)  (0) 2022.12.12
프로토타입 오염 (Prototype Pollution)  (0) 2022.12.05
디코딩 전 필터링  (0) 2022.09.23
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.