Print
카테고리: [ Apache HTTP Server ]
조회수: 9754

1. 주제

오늘은 Apache HTTP Server 에 설정할 수 있는 몇가지 헤더 관련 보안 설정들을 적어봅니다.


2. 세션 쿠키에서 HttpOnly 속성 제거

 1) 우선 mod_headers 가 enable 되어 있어야 하겠죠?

 2) httpd.conf 파일에 아래와 같이 설정해줍니다.

  Header edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure

3. Apache Clickjacking 공격 차단 방법

  : Clickjacking 이란? (2008년 Robert Hansen, Jeremiah Grossman 발표)

  Click + Hijacking 의 합성어로 ClickJacking 또는 UI Redress 공격이라 부르기도 합니다.
  클릭할 경우 공격자가 지정한 페이지로 넘어가거나 정보 탈취한다고 하죠!

 1) 역시 header 모듈 enable 되었는지 확인하시고,

 2) httpd.conf 에 아래 설정 추가해줍니다.

  Header always append X-Frame-Options SAMEORIGIN

4. X-XSS 공격 차단 방법

 이 역시 스텝은 같고요~ 아래와 같이 설정해줍니다.

 이렇게 설정하면 브라우저가 XSS 공격을 감지하면 자동으로 페이지 로드 자체를 block 해줍니다.

  Header set X-XSS-Protection "1; mode=block"

5. XHR과 CORS

브라우저는 인증 토큰, 쿠키, 여러 개인 메타 데이터 등 노출되지 않아야 할 사용자 데이터를 저장하게 됩니다. 

그런데 a.com에 있는 어떤 스크립트가 b.com의 사용자 데이터에 접근하고 수정할 수 있는 문제가 발생하게 됩니다. 이러한 문제를 해결하게 위해 초기의 XHR은 동일 출처의 request만 처리하게끔 제한했지요. 즉 request의 출처는 요청되는 resource의 출처와 동일해야 한다는 것입니다. 예를 들면 a.com의 XHR은 a.com에 있는 리소스만 요청할 수 있습니다. 이 Same origin의 조건에 만족하지 못하면 브라우저는 XHR request 처리를 거부하고 에러가 납니다. 이러한 하나의 웹 자원이 다른 웹 자원 접근 시 동일 출처가 아닌 경우 접근을 제한하는 Same Origin Policy는 W3C 표준입니다. 동일 출처라는 것은 호스트, 포트, Scheme(HTTP 또는 HTTPS)가 모두 동일해야 합니다. (단 IE 구 버전의 경우는 조금 다르게 해석할 수 있으므로 주의하세요)

그런데 Same origin을 제약을 거두어야 할 때도 있죠. 그래서 Cross-origin Resource Sharing, 이른바 CORS라는 개념이 나옵니다. 

CORS는 스크립트를 실행하고 요청되는 곳의 URL만 다르고 동일한 XHR API를 사용합니다. CORS 요청에 대한 Opt-in (사전 동의) 인증 매커니즘은 하위 계층에서 처리됩니다. 요청이 생성되면 브라우저는 자동으로 보호된 Origin HTTP 헤더를 추가합니다. 요청이 어디서 생성되었는지 통보하는 것이죠. 원격 서버는 Origin 헤더를 검사하고 요청을 수락할지 판단한 후에 Access-Control-Allow-Origin 헤더를 리턴합니다. (만약 접근을 허용하고 싶지 않다면 Access-Control-Allow-Origin 헤더를 빼기만 하면 됩니다. 클라이언트 브라우저는 자동으로 요청에 실패합니다)

CORS는 서버가 CORS를 인지하고 있다는 사실을 확인하기 위한 몇몇 대안이 있는데, 

CORS 요청은 쿠키, HTTP 인증과 같은 사용자 자격 증명을 포함하지 않음

클라이언트는 Same-origin request에 제한되어 있는데, GET, POST, HEAD 등 허용되는 메소드에 의해 전송되고 읽혀지는 HTTP 헤더의 접근을 제한함

HTTP 쿠키와 HTTP Authentication 정보를 인식하게 하려면 클라이언트에서 요청 생성 시에 XHR 객체의 추가 속성(withCredentials)를 설정해야 합니다. 그리고 서버는 응용 프로그램에 개인 사용자 데이터 포함을 허용하는 Access-Control-Allow-Credentials로 응답해야 합니다. 

var invocation = new XMLHttpRequest();
var url = 'http://a.com/resources/credentialed-content/';

function callOtherDomain(){

  if(invocation) {
    invocation.open('GET', url, true);
    invocation.withCredentials = true;
    invocation.onreadystatechange = handler;
    invocation.send();
  }
  ...