펜테스트짐


훈련을 통해 당신의 실력을 향상시켜보세요.



웹 서버측 기술

모두 61명의 회원님이 완료했어요.


이 훈련에서는 웹 애플리케이션이 동적 웹 컨텐츠를 서비스하기 위해 서버측에서 사용될 수 있는 웹 서버, 서버측 스크립트, 데이터베이스 등의 기술들에 대해 알아봅니다.




서버측(Server-Side) 기술이란 클라이언트-서버 모델에서 서버에 의해 실행되는 기술을 말합니다. 


클라이언트-서버 모델에서 서버측의 위치


서버측 기술은 서버측에서 사용되는 PHP와 같은 스크립팅 언어와 MySQL과 같은 데이터베이스, Apache와 같은 웹 서버 소프트웨어 등을 말하며, 웹 애플리케이션의 구현 방식에 따라 다양한 기술이 사용될 수 있습니다.

웹 초창기에는 대부분의 웹 사이트는 정적(=변하지 않는) 웹 컨텐츠를 제공하는 웹사이트였습니다. 이 때는 서버측에 웹 페이지를 미리 만들어서 저장해두고 해당 웹 페이지를 요청하는 사용자에게 보여주기만 하면 됐었습니다. 하지만 웹의 발전과 보급에 따라 웹 사이트는 백엔드 데이터저장소에서 사용자가 요청한 데이터를 가져와 사용자에게 맞춤 데이터나 개인화된 UI를 제공하는 등의 동적(=변하는) 웹 컨텐츠를 제공하는 웹 애플리케이션으로 진화하였습니다. 이를 위해 서버는 더 많은 일을 하게 되었고, 우리는 수신된 사용자의 요청에 응답하기 위해 서버가 도대체 어떤 일을 하는지 이해하는 것이 좋습니다.


다음 그림은 일반적으로 구현되는 서버측의 모습을 좀 더 구체적으로 표현한 그림입니다.


좀 더 상세한 서버측 내부 모습


위 그림에서의 단계별 동작은 아래와 같습니다.

    ➀ 웹 브라우저가 서버로 HTTP 요청을 전송합니다.

    ➁ 서버에 수신된 HTTP 요청은 웹 서버나 WAS가 받아서 요청과 함께 전달된 사용자가 전송한 데이터를 서버측 스크립트(Server-Side Script)에 전달합니다. NginX, Apache, JBoss 등이 사용됩니다. 

    ➂ PHP, 파이썬 등으로 구현된 서버측 스크립트에서는 받은 사용자 데이터를 매개변수로 하여 데이터베이스 등의 백엔드 데이터 저장소에 질의를 보냅니다.

    ➃ 데이터베이스는 전달받은 매개변수를 통해 질의 조건을 충족하는 레코드셋을 반환합니다. 자주 사용되는 데이터베이스는 MySQL, MSSQL, ORACLE, Postgresql 등이 있습니다.

    ➄ 다시 서버측 스크립트는 데이터베이스에서 추출해 온 데이터를 미리 만들어져 있던 HTML Template의 적절한 위치에 배치합니다.

    ➅ 서버측 스크립트는 마지막으로 최종 HTML 페이지를 웹 서버나 WAS에게 반환합니다.

    ➆ 웹 서버나 WAS는 서버측 스크립트로부터 생성된 최종 HTML 페이지를 HTTP 통신을 통해 웹 브라우저에게로 응답합니다.


Web Server (WAS)


웹 서버란 HTTP 요청에 대한 응답을 제공하는 소프트웨어입니다. 엄밀히 말해 원래 웹 서버라는 용어는 응답으로 HTML, CSS, 이미지, 비디오 등의 정적 컨텐츠를 제공하는 소프트웨어를 말합니다. 데이터베이스에서 데이터를 가져와 동적으로 웹 컨텐츠를 제공하기 위한 소프트웨어는 WAS(Web Application Server)라는 웹 서버와 구분되는 다른 용어가 있으며, 이 두 용어는 개념적으로 구분되는 것이 일반적입니다. 하지만 사실상 요즘은 대부분의 웹 서버는 PHP, ASP, JSP 등의 스크립트 언어용 모듈을 제공하여 동적 컨텐츠를 만들 수 있으며, WAS에도 웹 서버의 기능이 포함되어 있기 때문에 사실상 그 경계가 모호해졌습니다. 물론, 조직의 여건이나 사정에 따라 웹 서버는 정적 웹 컨텐츠를 처리하고 WAS로는 동적 웹 컨텐츠를 처리하게 하는 등 역할을 분리하여 둘 다 사용하는 경우도 있습니다. 아무튼 이 훈련에서는 웹 서버와 WAS의 차이에 대해 굳이 구체적으로 설명 드리지 않습니다.

웹 서버나 WAS에는 아래와 같은 것들이 있습니다.


Apache HTTP 서버

Apache HTTP 서버(아파치 HTTP 서버)는 전 세계적으로 가장 많이 사용되었던 오픈소스 웹 서버 소프트웨어입니다. 아파치 소프트웨어 재단에서 만들었으며, 유닉스를 기반으로 만들어진 NCSA HTTPd를 기반으로 1995년에 만들어졌습니다. 유닉스 뿐만 아니라 윈도우, 리눅스 등의 운영체제 모두에서 실행되는 등 크로스 플랫폼이 지원되며, MPM(Multi-Processing Module)을 이용한 모듈식 구성을 지원하므로 확장성이 매우 뛰어난 것이 장점입니다. 정적 웹 컨텐츠와 동적 웹 컨텐츠 모두를 처리할 수 있다는 장점이 있습니다.

PHP, MySQL(또는 MariaDB)와 함께 앞글자만 따서 APM이라는 이름으로 웹 애플리케이션 개발을 위한 표준 스택으로 간주됩니다. 들어 보신 분도 계시겠지만 LAMP, WAMP 등은 어떤 운영체제 위에서 구동되는 APM 이느냐에 따라 이름이 결정된 것으로 모두 Apache HTTP 서버, PHP, MySQL(또는 MariaDB)로 구성된 스택입니다.


NGINX

NGINX(엔진엑스)는 Apache HTTP 서버의 대안으로 주목받고 있는 차세대 오픈소스 웹 서버 소프트웨어입니다. 러시아의 이고르 시쇼브(Igor Sysoev)라는 사람이 Apache HTTP 서버의 C10K 문제를 해결하기 위해 만들었으며, 2004년에 발표했습니다. 발표 이후 Apache HTTP 서버 등의 다른 웹 서버보다 리소스 공간을 더 적게 차지하면서 더 많은 동시 연결을 처리하고, 웹의 발달에 발맞추어 Apache HTTP 서버가 제공하지 못하는 요구사항을 충족해오면서 발빠르게 성장했습니다. 이고르 시쇼브는 회사를 설립해 NGINX Plus라는 기업을 위한 상용 버전을 시장에 내놓게 됩니다. NGINX는 자체적으로 동적 웹 컨텐츠를 처리하지 못하고, FastCGI, SCGI 등의 다른 프로그램과 함께 사용해야 합니다. W3Tech의 분석에 따르면 NGINX의 시장 점유율은 꾸준한 성장세를 보여준다고 합니다. 


 웹 서버 사용율 현황 (출처: W3Techs)


Google Web Server

GWS는 구글이 자체 인프라에 사용하는 웹 서버 소프트웨어입니다. 


Microsoft IIS

IIS(인터넷정보서비스, 아이아이에스)마이크로소프트에서 만든 웹 서버 소프트웨어로 윈도우 운영체제 위에서 실행됩니다. 앞서 살펴본 웹 서버들과 점유율(액티브 웹 사이트 기준) 면에서 비교했을 때 가장 성적이 좋지 않은 웹 서버입니다. 


Apache Tomcat

Apache Tocat(아파치 톰캣)은 웹 서버가 아니고 WAS입니다. 오픈소스 소프트웨어이며 이름에서 알 수 있듯이 아파치 소프트웨어 재단에서 만들었습니다. 서버측 스크립팅 언어 중 자바 기반의 웹 애플리케이션에서 사용됩니다. 웹 서버 기능을 내장하고 있어 단독으로 사용할 수 있지만, 사용자가 많은 대규모 웹 애플리케이션에서는 Apache HTTP 서버(웹 서버)와 연동하여 사용하는 것이 권장된다.


JBoss

JBoss(제이보스)는 RedHat에서 개발한 오픈소스 WAS입니다. 주로 자바 기반의 웹 애플리케이션에서 사용되며 유닉스, 리눅스, 윈도우 환경에서 구동됩니다.


Resin

Caucho Technology에서 개발한 WAS로 PHP와 자바 기반의 웹 애플리케이션에서 사용됩니다. GPL 라이센스를 채택한 Resin과 라이센스를 구매한 기업을 위한 Resin Pro 제품이 있습니다.


Glassfish

Glassfish 는 2006년 Sun Microsystems에서 출시한 오픈소스 Java EE 애플리케이션 서버이며 현재 Eclipse Foundation에서 호스팅하고 있습니다. 대부분의 Java 애플리케이션 서버와 마찬가지로 Glassfish는 Java Servlet, EJB (Enterprise JavaBeans) 등을 지원하지만 HTTP 요청에 대한 응답으로 웹 컨텐츠를 제공하는 웹 서버로 작동할 수도 있습니다.


Jeus

Jeus(제우스)는 티맥스소프트에서 만든 국산 WAS입니다. 역시 한국에서의 점유율이 높습니다. 


서버측 스크립트


서버측 스크립트는 동적 웹 애플리케이션을 개발하기 위해 스크립트를 사용해 서버 안에 내부 로직을 구현하고, 사용자의 요청에 대해 적절한 기능을 수행하거나 데이터 요청에 따른 응답을 제공하는 코드를 말합니다. 서버측 스크립트는 위의 "서버측의 일반적인 모델" 그림에서 보았듯이 사용자의 요청에 따라 데이터베이스에 질의를 수행한 후 웹 브라우저에게 응답을 전달하기 전에 실행됩니다. 이는 데이터베이스에 기반한 동적 웹 컨텐츠를 제공하는 웹 애플리케이션에 국한되지만 데이터베이스 질의 대신 다른 기능을 수행할 뿐 거의 유사합니다. 서버측 스크립팅이 사용되는 경우는 대표적으로 데이터베이스에 접속해 사용자가 올바른 아이디와 패스워드를 입력했는지 검증하는 로그인 기능이나 사용자의 구매 내역 등의 개인화된 데이터를 가져오는 온라인 쇼핑몰 사이트, 메일 작성/송수신을 지원하는 이메일 사이트, 사용자 권한에 따라 리소스를 접근 제어하는 웹 사이트 등이 있으며 웹 애플리케이션의 역할 및 종류, 기능, 구현 방식에 따라 매우 다양합니다.


서버측 스크립트는 서버측에만 저장되어 있고, 서버측에서만 실행되는 소스코드로 사용자가 볼 수 없습니다. 반면 앞서 HTML, CSS와 함께 클라이언트측 기술에 포함된 자바스크립트는 (요즘은 Node.js의 등장으로 인해 서버측 스크립팅 언어로도 사용되기도 합니다만) 대표적인 클라이언트측 스크립트로 웹 브라우저에 의해 로컬PC에 복사/저장되어 사용자가 소스코드를 확인할 수 있습니다.

서버측 스크립트를 작성하기 위해서는 서버측 스크립팅 언어를 사용해야 합니다. 그럼 주로 사용되는 몇 가지 서버측 스크립팅 언어에 대해 간단히 살펴보겠습니다. 아래 설명드리는 스크립팅 언어의 사용법을 학습하기 위해서는 전문 서적을 구매하시거나 코딩을 전문적으로 교육하는 플랫폼을 이용하시는 것이 좋습니다.


PHP

PHP는 널리 사용되는 오픈소스 서버측 스크립팅 언어로 정적인 웹 사이트나 동적 웹 애플리케이션을 제작하는데 사용합니다. 1995년 "라스무스 러돌프"라는 사람이 최초 공개했습니다. 원래 PHP는 개인적인 프로젝트로 시작하였고, 당시 PHP라는 이름은 Personal Home Page의 약자였습니다. 하지만 현재는 웹 애플리케이션을 개발하기 위한 매우 강력한 스크립팅 언어로서 전 세계인에게 선택 되어지고 있으며, PHP 이름의 약자는 PHP: Hypertext Preprocessor라는 이름으로 변경되었습니다. 

PHP를 사용해 제작된 웹 앱의 수는 소규모의 웹 애플리케이션부터 이름만 들어도 알만한 대규모 웹 애플리케이션(예를 들자면, 페이스북이 PHP로 개발되었습니다.)까지  셀 수 없을 만큼 매우 방대합니다. 웹 애플리케이션 개발을 지원하는 상용 솔루션으로는 다음의 것들이 있습니다.

  • 블로그 - Wordpress, Joomla
  • 게시판 - PHPBB, vBulletin
  • 전자상거래, 쇼핑 카트 - Prestashop, OpenCart
  • 관리자 패널 - PHPMyAdmin


또한 웹 개발 프레임워크로는 대표적으로 다음 두 가지가 있습니다.

  • Laravel(라라벨)
  • CodeIgniter(코드이그나이터)


PHP는 HTML 파일에 쉽게 삽입할 수 있으며, 다음과 같이 <?php ... ?>로 둘러싸인 스크립트 실행 영역을 삽입하여 구현합니다.

<html>
<head>
  <title>PHP 간단 예제</title>
</head>
<body>
  <?php echo "Hello, hunters!" ?>
</body>
</html>

PHP에 대한 추가적인 설명은 위키백과 PHP를 읽어보시기 바랍니다.


JSP

JSP는 Jakarta Server Page(자카르타 서버 페이지) 또는 Java Server Page(자바 서버 페이지)의 약자로 자바 기반의 동적 웹 애플리케이션을 제작하기 위한 서버측 스크립팅 언어입니다. 서블릿(Servlet) 컨테이너가 지원되는 Apache Tomcat과 같은 WAS가 있어야 JSP를 실행할 수 있습니다. JSP는 실행되기 전에 내부적으로 서블릿으로 컴파일되고, WAS가 이 서블릿을 통해 정해진 기능을 수행하게 됩니다. 기능이 수행된 후에는 앞서 살펴본 바와 같이 데이터 저장소에서 추출한 데이터를 HTML Template과 결합하고 최종적으로 웹 브라우저에 응답으로 보내게 됩니다.

JSP는 말씀드렸다시피 자바 언어를 기반으로 하므로 아래와 같은 자바의 특징을 갖고 있습니다.

  • 객체 지향성: 자바에서는 모든 것이 객체로 표현됩니다. 
  • 플랫폼 독립성: 운영체제 독립적으로 운영체제의 종류에 상관없이 한번 작성된 애플리케이션은 소스코드의 변경없이도 다른 운영체제에서 쉽게 구동할 수 있습니다.
  • 운영체제 아키텍처 중립성: 32비트나 64비트 운영체제 모두에서 int 등의 데이터 유형이 차지하는 메모리 용량이 동일합니다. 참고로 C는 int 데이터 유형이 32비트에서는 2바이트, 64비트에서는 4바이트를 차지합니다.
  • 멀티스레드 지원: 하나의 프로그램에서 동시에 다중 스레드를 실행할 수 있습니다.
  • 고성능: 자바는 JIT(Just-In-Time) 컴파일러를 사용하므로 고성능을 지원합니다. (JIT 컴파일에 대해서는 위키백과 JIT컴파일 참조)
  • 보안: 자바로 개발된 애플리케이션은 JRE(Java Runtime Environment, 자바 실행 환경)에서 실행되므로 상대적으로 안전합니다.


JSP는 PHP와 유사하게 HTML 페이지 내부에 특정 마크업으로 구분된 영역을 삽입하는 형태로 사용할 수 있습니다.

  • 지시문(Directive): 컨테이너가 JSP 페이지 처리를 위해 필요한 속성과 값들을 정의합니다.
<%@ directive-name
  attribute1="value1"
  attribute2="value2"
  ...
  attributeN="valueN" %>
  • 표현식(Expression): 어떤 값을 출력하거나 메소드를 호출할 때 사용됩니다.
<%= Some-expression %>
  • 선언문(Declaration): 변수나 메소드를 선언할 때 사용됩니다.
<%! Dec var %>
  • 스크립틀릿(Scriptlet): 자바 코드를 실행할 때 사용됩니다.
<% Some-java-code %>


다음은 임의의 숫자가 100보다 큰 수인 경우 퇴근하고, 100 이하인 경우에는 남게 되는 퇴근 복불복 게임의 간단한 예제입니다.

<html>
<head>
  <title>JSP 간단 예제</title></head><body>
  <%
    double num = Math.random(); // 스크립틀릿을 이용해 if-else 자바 코드를 실행함.
    if (num > 100) {
  %>
      <h2>축하합니다. 얼른 퇴근하세요!</h2><p>(<%= num %>)</p> // 표현식을 이용해 num 값을 출력함.
  <%
    } else {
  %>
      <h2>저런~ 당신이 해야할 일이 있어요.</h2><p>(<%= num %>)</p> // 표현식을 이용해 num 값을 출력함.
  <%
    }
  %>
  <a href="<%= request.getRequestURI() %>"> // 표현식을 이용해 getRequestURI() 메소드를 호출함.
    <h3>다시 해볼까요?</h3>
  </a>
</body>
</html>


JSP에 관한 추가적인 설명은 위키백과 JSP를 읽어보시기 바랍니다.


Python

파이썬은 "귀도 반 로섬"이라는 사람이 만들어서 1991년 발표된 객체지향의 범용 프로그래밍 언어이며, 물론 오픈소스입니다. 귀도가 크리스마스 주간에 심심하다는 이유로 시간 때우기용으로 개발한 언어입니다. 본인이 좋아하던 코미디 그룹의 이름인 "몬티 파이썬"에서 이름을 따왔다고 합니다. 웹 개발 분야에서 서버측 스크립팅을 위해서 사용되기도 하지만 데스크탑 애플리케이션, 머신러닝, 딥러닝 등의 개발 등 다양한 전문적인 실무에서 사용됩니다. 또한 초보자도 쉽게 배울 수 있는 프로그래밍 언어이며 교육용 언어로도 다양한 곳에서 선택되고 있습니다. 웹 개발에만 초점을 둔다면 아래에 나올 루비 언어가 파이썬에 비해 더 두각을 나타내고 있습니다만 파이썬은 웹 뿐만 아니라 데이터 과학 분야 등 다방면에서 많이 활용되고 있는 대세 언어임에 틀림없습니다. 2020년 10월 TIOBE에서 선정한 프로그래밍 언어별 검색어 점유율에서는 C와 자바에 이어 3위에 랭크된 언어이며, TIOBE의 CEO인 "폴 얀센"은 자바의 하락세와 파이썬의 지속적인 상승세를 언급하며 순위가 뒤바뀌는 것은 중요한 사건이 될 것이라 하기도 했습니다. 


TIOBE 프로그래밍 커뮤니티 인덱스 (2020년 10월 기준) 

파이썬의 특징은 다음과 같습니다.

  • 오픈소스: 무료입니다.
  • 객체지향성: 모든 것이 객체로 이루어져 있습니다. 클래스라는 개념과 객체를 캡슐화 등 OOP를 지원합니다. 
  • 플랫폼 독립성: 코드의 변경없이 윈도우, 리눅스 등의 플랫폼에서 구동이 가능합니다.
  • 높은 확장성: C 또는 C++언어로 파이썬 코드를 쉽게 작성하고 컴파일할 수 있습니다.  
  • 높은 생산성: 빠른 개발 속도를 자랑하므로 프로토타입을 개발하기 위한 언어로 사랑받기도 합니다.
  • 동적인 데이터 타입: int, double 등과 같은 변수의 타입을 별도로 지정할 필요없이 할당되는 값에 따라 자동으로 결정됩니다.
  • 짧고 쉬운 구문: 코드가 짧고 간결하여 배우기 쉬운 사람 친화적인 언어입니다.

파이썬용 웹 개발 프레임워크는 Django가 있습니다.

파이썬에 관한 추가적인 설명은 위키백과 파이썬을 읽어보시기 바랍니다.


Ruby

루비는 "마츠모토 유키히로(애칭: 마츠)"라는 일본 사람이 1995년에 발표한 객체 지향 프로그래밍 언어이며 무료로 사용할 수 있는 오픈소스입니다. 당시 마츠는 펄(Perl)과 파이썬을 즐겨 사용했고, 자연스레 이 두 프로그래밍 언어의 영향을 받게 되었다고 합니다. 루비라는 이름도 펄 언어의 팬이였던 마츠가 펄(Perl)이 진주(Pearl)와 발음이 같아 자신이 개발한 언어도 보석 중 발음하기 쉬운 것으로 선택했다는 말도 있고, 마츠 지인의 탄생석에서 따왔다는 말도 있습니다. 실제로 루비는 파이썬과는 매우 유사하며 루비와 파이썬은 경쟁 관계의 언어로 간주되기도 합니다. 발표 이후 2000년대 초중반에는 개발자들 사이에게 선풍적인 인기를 끌기도 했으나 현재는 그 인기가 좀 주춤한 상태입니다. 미국과 일본(특히 일본에서는 자국민이 만들어서인지 파이썬보다 인기가 많을 정도)에서 주로 사용되지만 우리나라(대한민국)에서는 루비 개발자나 관련 자료를 찾아보기 힘듭니다.  

루비는 파이썬과 거의 유사한 특징을 갖습니다.

  • 오픈소스: 무료입니다.
  • 객체지향성: 모든 것이 객체로 이루어져 있습니다.
  • 플랫폼 독립성: 루비를 지원하는 운영체제라면 한번 작성된 애플리케이션은 코드 수정없이 다른 운영체제에서도 구동할 수 있습니다.
  • 높은 생산성: 빠른 개발 속도를 자랑하므로 프로토타입을 개발하기 위한 언어로 사랑받기도 합니다.
  • 자유로운 형식: 다른 프로그래밍 언어와는 달리 들여쓰기에 민감하지 않고, 어느 행과 열에서도 코드를 작성할 수 있습니다.
  • 쉬운 구문: 상대적으로 단순하고 깔끔한 구문으로 가독성이 높고, 사람 친화적입니다.

루비를 이용한 웹 개발 프레임워크는 Ruby On Rails가 있으며, 루비 언어 기반의 "레일즈"라는 프레임워크입니다. 이 웹 프레임워크가 루비 언어 성장의 견인차 역할을 했다고 해도 과언이 아닙니다.

Ruby에 관한 추가적인 설명은 위키백과 루비를 읽어보시기 바랍니다.


ASP.NET

ASP.NET(에이에스피닷넷)은 동적 웹 애플리케이션을 만들기 위해 마이크로소프트에서 2002년에 출시한 닷넷 프레임워크 기반의 서버측 웹 프레임워크입니다. ASP(Active Server Page)의 후속 제품으로 오픈소스입니다. 단 한번의 개발로 윈도우, 리눅스나 다양한 가전제품 등 멀티 플랫폼에서 구동되는 애플리케이션 제작을 목표를 갖고 자바 플랫폼에 대항하기 위해 만들었습니다. ASP.NET 애플리케이션은 주로 C#이나 F#Visual Basic.NET 등의 언어와 Visual Studio라는 개발 도구를 통해 작성되며 Apache 등의 웹 서버에서 구동을 지원하기는 하나 일부 호환되지 않는 부분들이 있기 때문에 일반적으로는 마이크로소프트의 웹 서버인 IIS 위에서 구동되도록 구성합니다.

ASP.Net에 관한 추가적인 설명은 위키백과 ASP.NET을 읽어보시기 바랍니다.


데이터베이스


수많은 웹 애플리케이션은 사용자에 의하거나 혹은 개발자나 관리자의 목적에 의해 데이터를 생성하고 어떤 데이터는 잘 보관하고 있다가 필요한 때에 다시 제공하기도 합니다. 바로 이러한 기능을 수행하기 위해 필요한 것 중 하나가 데이터베이스(Database, DB)입니다.

데이터베이스의 정의에 대해 위키백과에서는 아래와 같이 서술하고 있습니다.

"여러 사람이 공유하고 사용할 목적으로 통합 관리되는 정보의 집합이다. 논리적으로 연관된 하나 이상의 자료의 모음으로 그 내용을 고도로 구조화함으로써 검색과 갱신의 효율화를 꾀한 것이다. 즉, 몇 개의 자료 파일을 조직적으로 통합하여 자료 항목의 중복을 없애고 자료를 구조화하여 기억시켜 놓은 자료의 집합체라고 할 수 있다."

데이터베이스의 종류로는 관계형 데이터베이스와 비관계형 데이터베이스가 있습니다.


관계형 데이터베이스

흔히들 줄여서 RDB(Relational DB)라고 하는 관계형 데이터베이스는 데이터베이스계의 대표격입니다. 그냥 데이터베이스라고 부르면 왠만해서는 모두 관계형 데이터베이스라고 생각하시면 됩니다. 관계형 데이터베이스는 Key와 Value의 쌍으로 이루어진 데이터를 2차원 구조의 행(Row)과 열(Column)로 구성된 테이블에 저장합니다. 어떤 형태인지 감이 오지 않으시는 분들은 엑셀같은 스프레드시트를 생각하시면 편하실 겁니다. 그리고 데이터가 저장된 이 테이블들은 필요에 의해 서로서로 관계를 형성하여 종속성과 제약을 갖게 됩니다. 


데이터베이스의 Movie 테이블에 몇 개의 영화 데이터가 저장되어 있다.


이러한 데이터베이스를 관리하기 위해서는 특별한 소프트웨어가 필요합니다. 바로 DBMS(DataBase Management System)입니다. DBMS를 통해 데이터베이스를 구축하고 테이블 생성 또는 수정, 삭제하거나 데이터를 검색, 저장, 변경, 삭제하는 등의 데이터를 조작할 수 있습니다. 이 때 사용하는 것이 바로 SQL(Structured Query Language)입니다. SQL이란 단어는 어쩌면 많이 들어보셨을 수도 있겠네요. 바로 웹 해킹의 꽃이라고 불리기도 하는 SQL 인젝션이란 공격할 때 말하는 그 SQL이 맞습니다. SQL 인젝션을 하기 위해 반드시 알아야 하겠죠? 이 SQL은 추후 SQL 인젝션 공격 훈련에서 보다 자세히 다뤄보고 이번 훈련에서는 간단히 훑어보겠습니다.


SQL은 크게 다음의 세 가지 종류로 나뉘어집니다.

  • DDL (Data Definition Language, 데이터 정의 언어): CREATE, DROP, ALTER 등의 테이블과 인덱스를 관리하기 위한 구문입니다.
  • DML (Data Manipulation Language, 데이터 조작 언어): INSERT, UPDATE, DELETE, SELECT 등 테이블에서 데이터를 조작, 검색하기 위한 구문입니다.
  • DCL (Data Control Language, 데이터 제어 언어): GRANT, REVOKE, COMMIT, ROLLBACK 등 데이터에 대한 접근을 제어하기 위한 구문입니다.


간단히 DML 중 하나의 예를 들면, 위의 Movie 테이블에서 영화 "기생충"의 영화명, 개봉년도, 카테고리코드 정보를 검색하는 SQL 쿼리는 다음과 같습니다. 

SELECT MovieName, ReleasedYear, CategoryCode FROM movie WHERE MovieName = 'Parasite';


주요 상용 DBMS 제품으로는 다음과 같은 것들이 있습니다.

  • MySQL: 오라클 데이터베이스에 필적할만한 DBMS였으나, 오라클에 인수되고 말았습니다. 무료인 오픈소스 버전과 유료 라이센스가 필요한 버전이 있습니다. Apache, PHP와 함께 주로 사용됩니다. 
  • MariaDB: 오픈소스입니다. 오라클의 MySQL 인수에 썩 기분이 좋지 않았던 MySQL 직원들이 나와 만들었습니다. 이름만 다를 뿐 거의 MySQL과 동일합니다.
  • Oracle DBMS: 오라클 데이터베이스를 위한 DBMS입니다. DBMS계의 최강자로 군림하며 엄청난 수익을 자랑합니다. 주로 규모가 있는 기업에서 사용합니다.
  • MS SQL Server: 마이크로소프트의 DBMS입니다. 일반적으로 윈도우 운영체제와 IIS, ASP.NET 기반의 웹 애플리케이션을 구축할 때 사용됩니다.
  • PostgreSQL: 오픈소스입니다. 위의 DBMS를 맹렬히 추격하고 있는 신흥 강자입니다. 


비관계형 데이터베이스

앞서 살펴본 관계형 데이터베이스는 행과 열로 구성된 테이블에 저장된 정형화된 데이터를 관리하기 위한 것입니다. 하지만 스마트폰의 등장으로 이미지, 비디오 등의 정형화되지 않은 즉, 비정형 데이터가 급증하기 시작했고 기존의 관계형 데이터베이스는 이런 비정형 데이터를 관리하기에는 적합하지 않았습니다. 따라서 NoSQL 데이터베이스라고 불리는 비관계형 데이터베이스가 등장합니다. NoSQL은 Not only SQL의 약자로 SQL 뿐만 아니라 다양한 유형의 데이터베이스를 사용하여 비정형 데이터를 관리할 수 있는 집합 지향의 새로운 데이터베이스라는 점에 착안한 이름입니다.

여기서 말하는 다양한 유형의 데이터베이스란 다음의 네 가지 모델이 있습니다. 지금은 그냥 '이런 것들이 있구나' 정도로만 읽어보시고 넘어가셔도 됩니다.

  • Key-value 모델: 키와 값으로 구성된 가장 단순한 구조로 키를 이용해 값에 접근합니다. 값을 이용해 키로 접근하는 것은 불가능합니다. Strings, Bitmaps, Hash, Lists 등 다양한 형태의 데이터를 저장할 수 있습니다. 대표적으로 Redis가 있습니다.


Key-value 모델의 구조 (출처: Redislabs)

  • Document 모델: JSON 또는 BSON 형태의 문서 형태로 데이터를 저장하는 모델입니다. MongoDB가 바로 이 모델을 사용합니다.


Document 모델의 구조 (출처: Pingax)


  • Column-family 모델: 하나의 Row Key에 매핑되는 다수의 Column-value 쌍의 모음으로 데이터를 저장하는 모델입니다. 대표적인 DBMS로는 Casandra, Hbase 등이 있습니다.


Column-family 모델의 구조 (출처: Tutorialspoint)


  • Graph 모델: 노드,  엣지, 프로퍼티를 사용해 그래프의 형태로 데이터를 저장하는 모델입니다. 아래의 그림에서 각 노드를 잇는 선은 노드간의 관계를 정의한 것입니다. 사실 집합 지향이라기 보다는 관계형 모델에 가깝습니다. 대표적인 DBMS로는 AllegroGraph, Amazon Neptune 등이 있습니다.


Graph 모델의 구조 (출처: 위키백과)




참고 문헌