요청에 사용된 XMLHttpRequestUpdate 객체에 이벤트 리스너가 등록되어 있지 않아야 함.
ReadalbeStream가 request에 포함되지 않아야 함.
Simple Requests
Preflight Requests
예비 요청을 먼저 보낸 후 요청이 안전한지 검사한 후 본 요청을 보냄
먼저 OPTIONS method로 예비 요청을 보내 본 요청이 안전한 지 검사
안전하다고 판단되면 본 요청을 보내고, 서버가 응답
Preflight requests
Requests with Credentials
HTTP Cookie와 HTTP Authentication 정보를 인식할 수 있게 해주는 Request
Client는 request 생성 시 반드시 withCredentials=true;로 지정해줘야 함
Request without Credentials
Requests with Credentials이 아닌 모든 Request
CORS Header와 Request 타입을 이해했으면 실습 코드를 살펴보자
위에 나와있는 php 코드는 Simple Requests를 나타내는 코드이다.
request & response
다음은 php코드가 Request 한 HTTP와 secret-cors.php의 Response HTTP이다.
만약 다른 사용자가 secret를 탈취하기 위해 어떻게 할까??
바로 악성 페이지를 만들어서 해당 페이지 요청 시 secret값이 담김 URL을 요청하도록 하면 된다.
그러기 위해 바로 XMLHttpRequest가 사용된다.
Exploit Code를 한 번 짜 볼까??
exploit code
이렇게 Exploit code를 짜면
alert에 secret이 나타났다.
결론은
SOP 때문에 Same-Origin으로 공유하는 Resource가 한정되어 있다.
그래서 Cross-Origin의 Resource를 가져와야 하는데 이러한 방법이 CORS라고 한다.
CORS는 Resource를 가져올 때 HTTP Header를 이용하여 해당 Origin이 Request를 할 수 있는지 확인 후 허용하면
Request를 한다. 그래서 해커들은 이를 악용하여 Exploit code를 이용하여 개인정보를 탈취할 수도 있다.
CSP(Content Security Policy)
콘텐츠 보안 정책 CSP는 XSS나 데이터를 삽입하는 공격을 방어하는 보안 계층이야
원래 나타나 있는 스크립트 외 공격자가 삽입한 악성 스크립트나 권한이 있는 서버에 요청을 보내는 것을 막을 수 있어 어떻게 나타내냐?? SOP랑 마찬가지로 HTTP Header를 이용하여 나타내는데 Header에 적절한 지시문을 사용하여 웹 페이지에서 사용될 수 있는 자원의 위치, 출처 등을 제약을 걸 수 있어!!
아직 잘 모르겠지...?
사용 방법을 같이 살펴보면서 이해해보자구
CSP를 사용하는 방법은 2가지가 있는데
1. Server-Side Request Header에 CSP 추가
header에 'Content-Security-Policy': <Directive Reference> <Value Reference>를 추가하면 된다.
지시문의 종류는 다음과 같다.
Directive Reference
Directive Reference
내용
default-src
다른 CSP가 없다면 default로 설정되는 CSP
script-src
Javascript 관련 권한과 출처를 제어
style-src
Stylesheet 관련 권한과 출처를 제어
img-src
Image 관련 권한과 출처를 제어
child-src
<frame>,<iframe>등을 검토해 웹 사이트 안에 삽입된 웹의 권한과 출처를 제어
base-uri
페이지의 <base> 태그에 나타날 수 있는 URL을 제어
font-src
font 관련 권한과 출처를 제어
host-source: <origin>
허용 되는 origin에 대한 권한과 출처를 제어
scheme-source: <scheme>
허옹 되는 scheme에 대한 권한과 출처를 제어
이 외에도 많은 Directive Reference가 존재한다.
Value Reference
Value Reference
내용
*
모든 domain을 허용
none
모든 출처를 허용하지 않음
self
페이지의 현재 Origin내 Resource만 허용
example.com
example.com 내 Resource만 허용
*.example.com
example.com과 example.com의 subdomain 내 Resource만 허용