본문 바로가기

Book

웹 개발자를 위한 웹 보안: 4장 요약 - 웹 서버 작동 방식

728x90

 

 

웹 서버는 HTTP 요청에 대응하여 정적 자원과 동적 자원 두 가지 콘텐츠를 제공한다. 정적 자원은 HTML 파일, 이미지 파일과 같이 HTTP 응답에서 변경되지 않고 변환하는 유형의 파일이다. 동적 자원은 웹 서버가 HTTP 요청에 대응하여 실행하거나 해석하는 코드, 스크립트 또는 템플릿을 의미한다.

 

정적 자원을 반환할 때 웹 서버는 데이터를 HTTP 응답에 추가하거나 정적 자원을 반환하기 전에 처리한다. 응답에 사용되는 대역폭을 줄이기 위해 압축하거나, 일정 시간 내에 사용자가 다시 요청하는 경우에 빠르게 대비하기 위해 정적 자원의 로컬 복사본을 캐시하고 사용하도록 HTTP 응답에 캐시 헤더를 추가하기도 한다. 이를 통해 사용자에게 잘 응답하고 서버가 처리해야 하는 부하를 감소시킨다. 이런 프로세스 때문에 정적 자원은 보안 취약점과는 거리가 멀다.

 

정적 파일의 전송 속도를 향상시키기 위해 콘텐츠 전송 네트워크 (CDN)가 개발되었는데, 정적 자원의 중복된 복사본을 전 세계 데이터 센터에 저장하고 가장 가까운 물리적 위치에서 브라우저로 신속하게 전달하는 것이다. 그러나 CDN과 통합하면 서드 파티가 사용자의 보안 인증서에 따라 서비스하므로 보안 문제를 일으킬 수 있다.

 

정적 콘텐츠로 구성된 사이트는 코딩 대신 콘텐츠 관리 시스템 (CMS)를 일반적으로 사용하여 구축된다. CMS를 통해 페이지에 통일된 스타일을 부여하고 관리자가 브라우저에서 직접 콘텐츠를 업데이트할 수 있다. 다양한 CMS 플러그인이 있는데, 고객 추적을 위한 구글 애널리틱스, 인증 확인을 위한 페이스북 로그인, 그리고 고객 지원을 위한 젠데스크 등이 있다. CMS를 통합하거나 플러그인 서비스를 이용해 다른 사람의 코드로 사이트를 구축하면 이론적으로 보안이 강화된다. 그러나 이러한 서비스와 플러그인의 보편성은 해커들의 표적이 되기 때문에 자주 패치한다. 따라서 서드 파티 코드를 사용할 때는 보안 권고 사항을 준수하고 보안 패치를 사용할 수 있게 되는 즉시 배포해야 한다.

 

동적 자원은 많은 유형의 콘텐츠를 표시할 수 있는 단일 웹 페이지를 구현하는 것이다. 예를 들어 사용자가 사이트에서 특정 제품을 볼 때마다 웹 페이지는 URL에서 제품 코드를 추출하고, 데이터베이스에서 제품 가격, 이미지, 설명 등을 로드하여 데이터를 HTML에 채우게 된다. 은행 웹사이트에 접속할 때 계좌 내역을 조회하는 것, 구글과 같은 검색엔진으로 검색할 때 일치한 항목만 반납하고 동적인 페이지로 돌려주는 것 등 사용자의 계정이나 인풋에 따라 다르게 보이는 것을 의미한다. 그러나 동적 자원은 HTML로 콘텐츠를 동적으로 채우는 공격에 취약할 수 있다.

 

동적 자원을 구성하는 코드는 정적 HTML 파일에 비해 직관적이지 않고, 렌더링된 출력이 어떻게 보일지 염두에 두고 코드를 변경하기가 어렵다. 따라서 이를 해결하기 위해 템플릿 파일을 사용해 동적 웹 페이지를 작성한다. 데이터베이스나 HTTP 요청에서 데이터를 끌어와 HTML에 보간하거나 HTML 템플릿의 섹션을 조건부로 렌더링하거나 데이터 구조를 루프해 HTML 블록을 반복적으로 렌더링한다. 이렇게 HTML에 코드 조각을 삽입하면 코드가 깨끗하고 읽기 쉽기 때문에 모든 최신 웹 프레임워크는 템플릿 파일을 사용한다.

 

웹 서버에서 동작 자원 코드를 실행할 때 데이터베이스에서 데이터를 로드하기도 하는데, 일반적으로 사용되는 SQL과 NoSQL 두 가지가 있다. SQL 데이터베이스는 관계형이며, 데이터베이스 테이블은 키를 통해 서로 관련돼 있다. 데이터 손상을 방지하고 데이터베이스에 대한 통일된 쿼리를 가능하게 하는 데이터 무결성 제약 조건을 특징으로 한다. 또한 트랜잭션을 통해 SQL 문이 일괄 처리 내에서 실행되지 않으면 데이터베이스 상태 변경이 되지 않아 일관성을 유지한다. SQL 데이터베이스 서버가 부하로 인해 사용자의 웹사이트 성능을 저하시키는 문제가 있다. 따라서 최근에는 데이터 무결성 요구 사항을 희생하여 확장성을 높이는 NoSQL을 많이 사용하고  있다.

 

동적 자원은 메모리 내 분산 캐시에서 데이터를 로드할 수 있다. 캐싱을 통해 쉽게 검색할 수 있는 형태로 다른 곳에 보관된 데이터의 복사본을 저장해 데이터의 검색 속도를 높인다. 언어에 구애받지 않고 여러 소프트웨어에서 데이터 구조를 공유할 수 있다. 그러나 데이터베이스와 같은 방식으로 해킹에 취약하다.