HTTP 요청은 기본적으로 Cross-Site HTTP Request가 가능하다. 즉 <img>태그나 <link>태그로 다른 도메인의 자료들을 가져오는 것이 가능하다. 하지만 <script></script>로 둘러싸여 있는 스크립트에서 생성된 Cross-Site Http Requests는 Same Origin Policy를 적용 받기 때문에 Cross-Site HTTP Requests가 불가능하다. 즉, Protocol, Host명, Port가 같아야만 요청이 가능하다. Ajax가 널리 사용되면서 이 상황에서도 Cross-Site HTTP Requests가 가능해야 한다는 요구가 늘어났고, CORS가 나오게 되었다.
CORS 요청은
Simple Request는 서버에 1번 요청하고, 서버도 1한 회신하는 것으로 처리 종료.
Simple Request 조건에 해당하지 않으면 브라우저는 Preflight 방식으로 요청한다. GET, POST, HEAD 외의 다른 방식으로 요청을 보낼 수도 있고, 다른 Content-type으로 요청을 보낼 수도 있고, 커스텀 헤더도 사용할 수 있다.
이름에서도 알 수 있듯이, 본 요청과 예비 요청으로 나뉘어 전송된다. 먼저 서버에 예비 요청을 보내고 서버는 예비 요청(Preflight Request)에 응답하고 그 다음에 본 요청(Actual Request)을 서버에 보내고, 서버도 본 요청에 응답한다.
하지만, 예비 요청과 본 요청에 대한 서버의 응답을 프로그램 내에서 구분하여 처리하는 것은 아니다. Access-Control 계열의 Response Header만 적절히 정해주면 OPTIONS 요청으로 오는 예비 요청과 GET, POST, HEAD, PUT, DELETE 등으로 오는 본 요청의 처리는 서버가 알아서 처리한다.
HTTp Cookie와 HTTP Authentication 정보를 인식할 수 있게 해주는 요청이다. 요청 시 xhr.withCredentials = true를 지정해서 Credential 요청을 보낼 수 있고, 서버는 Response Header에 반드시 Access-Control-Allow-Credentials: true를 포함해야 하고, Access-Control-Allow-Origin 헤더의 값에는 *가 오면 안되고 http://foo.origin처럼 구체적인 도메인이 와야한다. 만약 Crudentials 옵션은 true로 줬는데 Access-Control-Allow-Origin의 값을 *로 주면 에러가 발생한다.
CORS 요청은 기본적으로 Non-Credential 요청이므로, xhr.withCredentials = true 를 지정하지 않으면 Non-Credential 요청이다.
서버에서 CORS 요청을 처리할 때 지정하는 헤더
게시판이나 웹 메일 등에 자바스크립트와 같은 코드를 삽입해 개발자가 고려하지 않은 기능이 작동하게 하는 치명적일 수 있는 공격. 또한 대부분의 웹 해킹 공격 기법과는 다르게 클라이언트 즉, 사용자를 대상으로 한 공격이다.
위 세가지로 분류 할 수 있다.

공격자는 미리 XSS 공격에 취약한 웹 사이트를 탐색하고, XSS 공격을 위한 스크립트를 포함한 URL을 사용자에게 노출시킨다.
사용자가 해당 URL을 클릭할 경우, 취약한 웹 사이트의 서버에 스크립트가 포함된 URL을 통해 Request를 전송하고, 웹 서버에서는 해당 스크립트를 포함한 Response를 전송하게 된다.

웹사이트의 게시판에 스크립트를 삽입하는 공격 방식이다.
공격자는 게시판에 스크립트를 삽입한 후 공격 대상자가 해당 게시글을 클릭하도록 유도한다.
공격자는 XSS 공격을 위한 스크립트를 포함한 게시글을 웹사이트에 업로드하고, 게시글의 URL을 사용자에게 노출시킨 후 사용자가 게시글을 확인함으로써 URL에 대한 요청을 서버에 전송하게 된다.
웹 서버에서 스크립트를 포함한 Response를 전송하며 공격이 수행된다 .

DOM 환경에서 악성 URL을 통해 사용자의 브라우저를 공격하는 것이다.
원본 클라이언트 측에서 사용하는 희생자의 브라우저에서 DOM "환경"을 수정한 결과 공격 페이로드가 실행되는 공격이다. 스크립트를 사용하여 클라이언트 측 코드가 예기치 않은 방식으로 실행되도록 한다. 즉, 페이지 자체(HTTP 응답은 변경되지 않음)가 변경되지 않지만 DOM 환경에서 발생한 악의적인 수정으로 인해 페이지에 포함된 클라이언트 측 코드가 다르게 실행 된다. 일반적으로 DOM Based XSS 취약점이 있는 브라우저를 대상으로 조작된 URL을 이메일을 통해 사용자에게 전송하면 피해자는 이 URL 링크를 클릭하는 순간 공격피해를 입게 된다.
XSS 공격은 IPS,IDS,방화벽 등으로도 방지할 수 없다.
때문에 단순히 문자를 필터링 하는 방법들이 존재한다.
script 문자 필터링
XSS 공격은 입력값에 대한 검증이 제대로 이루어지지 않아 발생하는 취약점이기 때문에 모든 입력값을 필터링을 해주면 된다. 정규식을 사용하기도 한다.
htmlentities 사용
PHP함수 중 htmlentities라는 함수가 있다.
모든 특수문자를 HTML 엔티티(entity)로 변환한다.
ex) <는 <로, >는 >로 표현함.