보통 웹서버라고하면 HTTP 요청에 대한 응답을 HTML 페이지로 다시보내는 컴퓨터 프로그램이다.
웹서버는 브라우저가 HTTP 요청을 보내면 HTML을 동적으로 생성하기위해 코드가 실행되도록 허용하며, 데이터베이스의 콘텐츠를 통합한다. 오늘은 웹 서버 내에서 코드와 자원을 구성하는 방법을 알아보고 보안취약점을 정리해본다.

웹서버는 HTTP 요청에대해 정적 자원과 동적 자원, 두가지 유형의 콘텐츠를 제공한다. 현대의 웹 서버는 정정 자원과 동적자원을 모두 호스팅 할 수 있으며, 서버가 반환하는 자원은 HTTP 요청의 URL에 따라 달라진다.

1. 정적 자원 (Static Resources)

정적 자원은 HTML파일, 이미지 또는 HTTP 응답에의해 변경되지않고 반환하는 유형의 파일로 초기 웹사이트에서 사용된었다.

URL 결정

  • URL 결정은 클라이언트의 요청이 웹 서버에서 적절한 리소스와 매칭되는 과정이다.
  • 웹 서버는 요청 URL을 분석하여 해당 경로에 맞는 정적 파일을 찾는다. (예: /images/logo.png라는 요청이 들어오면 서버는 정적 파일 디렉토리에서 logo.png 파일을 찾아 클라이언트에게 전송)

gzip과 cache 웹서버는 응답에 사용되는 대역폭을 줄이고자 gzip 알고리즘을 사용하여 대용량 자원파일을 동적으로 압축하거나 일정 시간내에 사용자가 다시 볼 정적 자원의 로컬 복사본을 캐싱하고 사용하도록 브라우저에 지시하는 HTTP 응답에 캐시헤더를 추가한다.
이는 웹 사이트가 사용자에게 잘 응답하고 서버가 처리해햐하는 부하를 줄일 수 있다.

취약점 정적 자원은 단순한 파일이기때문에 눈에 띄는 보안상 취약점은 별로 없다. 하지만 파일의 URL을 해결하는 프로세스는 취약점이 있을 수 있어 서버에 접근제어규칙(access control rule)을 정의 해야한다.

콘텐츠 전송 네트워크 (Content Delivery Network, CDN)

  • CDN은 정적 자원의 전송속도를 향상시키기위해 클라이언트와 가까운 서버에 캐싱하여 제공하는 콘텐츠 전송 네트워크이다.
  • 지리적으로 분산된 여러 서버에 자원을 복제해 놓고, 사용자 요청이 들어오면 가장 가까운 위치에서 자원을 브라우저에 전송해 응답 속도를 높인다. (예: Cloudflare, Akamai, Amazon CloudFront)
  • CDN을 사용하면 서버 부담이 줄어들고, 전 세계 사용자에게 신속하게 콘텐츠를 전달할 수 있다.

콘텐츠 관리 시스템 (Content Management System, CMS)

  • CMS는 웹 콘텐츠를 손쉽게 관리하고 게시할 수 있도록 돕는 소프트웨어이다.
  • 사용자는 프로그래밍 지식 없이도 정적 페이지, 이미지, 동영상 등을 추가하거나 수정할 수 있으며, CMS 자체에서 정적 콘텐츠를 서버에 저장하고 제공할 수 있다.
  • CMS는 대규모 웹사이트에서 콘텐츠를 효율적으로 관리하는 데 유용하다.

정적 자원을 사용하면 간단하게 HTML을 작성할 수 있지만,비효율적이기때문에 대부분 동적 자원을 사용한다.

2. 동적 자원 (Dynamic Resources)

동적자원은 웹서버가 HTTP 요청에대해 실행하거나 해석하는 코드, 스크립트 또는 템플릿(Templet)이 있다.

초기의 동적자원은 사용자가 특정 URL에 방문했을때 웹서버가 실행한 간단한 스크립트 파일로 구성되었으며, 펄(Perl) 언어로 작성되는 경우가 많았다. 동적 자원을 구성하는 코드는 직관적이지않은데, 이를 해결하고자 웹 개발자들은 HTML 템플릿을 사용하여 동적 웹페이지를 작성했다.

1. 템플릿 (Template)

  • 템플릿은 웹 페이지의 공통 구조를 정의하는 파일로, 데이터베이스나 외부 소스로부터 가져온 데이터로 채워져 동적 콘텐츠를 생성한다
  • 웹 서버는 클라이언트 요청을 처리할 때 해당 템플릿 파일에 데이터를 주입해 HTML 문서를 동적으로 생성하고, 이를 응답으로 보낸다.
  • 예를 들어, 사용자가 방문한 페이지에 따라 사용자 맞춤 정보를 템플릿에 삽입하여 전송할 수 있다.

2. 데이터베이스 (Database)

대부분의 웹사이트들은 사용자 정보를 저장하기위해 데이터베이스를 사용하는데, 이 웹서버와 DB 사이의 인터페이스는 해커들의 Injection 공격의 대상이된다.

SQL 데이터베이스

  • 관계형 데이터베이스로, 데이터를 표 형태로 저장하고 구조화된 쿼리 언어(SQL 문)를 사용하여 데이터를 관리한다.
  • 관계형 데이터베이스는 데이터의 손상을 방지하고 통일된 쿼리를 가능하게하는 데이터 무결성 제약 조건(data integrity constaint)이 있다. (예: MySQL, PostgreSQL, Oracle 등)
  • 서버는 클라이언트 요청에 따라 SQL 쿼리를 실행해 데이터를 검색하거나 조작한 뒤, 이를 템플릿에 주입해 동적인 페이지를 생성한다.

SQL 데이터베이스는 병목 현상이 발생 할 수 있는데, 만약 웹에 접속하는 대부분의 HTTP 요청이 DB를 호춣한다면 DB 서버의 부하 증가와 함께 사용자의 엡 사이트 성능을 저하 시킬수있다.
이 성능문제를 해결하기위해 DB의 무결성을 희생하고 확장성을 높이는 데이터베이스가 NoSQL 데이터베이스이ㅏ.

NoSQL 데이터베이스

  • 비관계형 데이터베이스로, 대규모 데이터를 유연하게 저장하고 관리할 수 있는 구조를 제공한다. (예:MongoDB, Cassandra, Redis 등)
  • 문서, 키-값, 그래프 등 다양한 형식으로 데이터를 저장하며, 구조화된 데이터에 적합한 SQL과 달리 유연하고 확장 가능한 구조를 가져, 비정형 데이터 처리나 실시간 데이터 제공에 유리하다.
  • 스키마(Schema)가 없기때문에 데이터 구조를 업그레이드하지 않고도 쉽게 레코드에 필드를 추가 할 수 있다.
  • 하지만 이 유연성으로인해 데이터 중복 문제가 발생하여 성능저하가 발생하거나 일관성을 유지하기 어려운 문제가 있다.

3.분산 캐시 (Distributed Cache)

  • 동적 자원은 메몬리 내 분산캐시에서 데이터를 로드 할 수 있다.
  • 분산 캐시는 데이터를 여러 서버에 분산해 저장하여 서버에 과부하를 줄이고 응답 속도를 높이는 역할을 한다.
  • 자주 요청되는 데이터를 메모리에 캐싱해 두어 데이터베이스에 직접 접근하지 않고도 빠르게 제공할 수 있다.
  • Redis와 Memcached와 같은 분산 캐시 시스템을 사용해 사용자 세션, API 응답 등 빈번한 데이터 요청을 처리하는 데 효과적이다.

캐시서버의 무단 접근을 방지하기 위해, Redis와 Memcached는 SDK(Software Development Kit) 라이브러리를 개발하여 캐시와의 연결 및 인증을 강화하였다.

태그: ,

카테고리:

업데이트:

댓글남기기