모의해킹을 공부하며 웹 서버에 대한 이해는 여러 가지 이유에서 필요하다. 웹 서버의 작동 방식과 구조를 이해하여 보안 취약점을 더 잘 파악할 수 있고, 실제 시스템에 피해를 주지 않는 선에서 테스트 환경에서 다양한 해킹 기법을 실험해 볼 수 있다.
웹 서버란?
웹을 통해 클라이언트에 콘텐츠를 제공하는 네트워크 서비스이다. (간단히 말해, 파일을 전달하는 친구)
클라이언트 (보통 웹 브라우저)로부터 HTTP 요청을 받아들이고, 그에 대한 응답으로 웹 페이지나 데이터를 전송한다.
- (하드웨어 측면에서) 웹 서버
- 웹 서버의 소프트웨어와 웹사이트의 컴포넌트 파일들(HTML 문서, images, CSS stylesheets, JavaScript files 등)을 저장하는 컴퓨터
- 웹에 연결된 다른 기기들이 웹 서버의 데이터(컴포넌트 파일들)를 주고 받는 기능을 수행
- (소프트웨어 측면에서) 웹 서버
- 웹 사용자가 어떻게 호스트 파일들에 접근하는지 관리
- 웹 서버(HTTP 서버)는 사용자가 웹에서 파일에 접근하는 방식을 관리하는 프로그램으로, URL 처리와 HTTP 프로토콜 관리를 수행
- URL 처리: 요청된 주소에 대한 처리 담당
- 프로토콜 관리: HTTP(웹 브라우저와 서버 간의 데이터 전송 규칙)을 정의, 요청을 받고 응답을 생성하는 과정을 관리
웹 사이트는 정적 페이지 또는 동적 페이지로 구성할 수 있다.
이는 용도에 따라 다른데, 예를 들어 로그인된 페이지를 제작한다면 개개인의 모든 페이지를 하나하나 만드는 것은 무의미할 것이다. 이와 같이 개인화된 컨텐츠를 제공하는 것이 목적이라면 동적 페이지를 구현하면 된다. 반면, 고정된 컨텐츠를 관리할 때는 간단하게 정적 페이지를 구현한다.
- 정적(static) 페이지: 서버가 그 불려진 파일을 브라우저에게 전송
<html>
<h1> Score</h1>
<h2> Name: Kim Soyeon </h2>
</html>
- 동적 (dynamic) 페이지: 정적 웹 서버와 추가적인 소프트웨어로 구성, 애플리케이션 서버가 HTTP 서버를 통해 브라우저에게 불려진 파일들을 전송하기 전에 애플리케이션 서버가 업데이트
<html>
<h1> Score</h1>
<h2> Name: <?php echo $_GET['name']; ?> </h2>
</html>
웹 서버는 역할은 단순한 웹 페이지 전달, 즉 HTML, CSS, 이미지와 같은 정적 리소스 제공이다. Apache, Nginx와 같은 서버는 동적 콘텐츠를 처리할 수 있는 기능을 가지고 있다. 그러나 결국 복잡한 비즈니스 로직 처리 기능이나 세션 관리, 트랜잭션 처리 등의 기능은 제공하지 않는다. 그렇다면 동적 페이지는 어떻게 실행하는가? 웹 서버와 WAS를 함께 작동시켜야 한다.
WAS(Web Application Server)란?
웹 애플리케이션을 실행하고 관리하는 서버 소프트웨어이다.
- 비즈니스 로직 처리: 웹 애플리케이션의 복잡한 비즈니스 로직 실행
- 데이터베이스 연결: 데이터베이스와 상호작용하여 필요한 데이터 로드 및 저장
- 세션 관리: 사용자 세션을 관리하여 상태 유지
- 트랜잭션 처리: 여러 데이터베이스 작업을 하나의 트랜잭션으로 처리하여 데이터 일관성 보장
즉, 웹 서버는 클라이언트의 요청을 수신하고 동적 콘텐츠 생성을 위해 WAS를 호출하는 역할을 한다. WAS는 실제로 동적 페이지를 생성하는 비즈니스 로직을 처리한다.
정리하면, 웹 서버는 세 개의 구조로 볼 수 있다.
- 웹 서버 (Web Server): 정해진 파일 (정적 페이지 또는 리소스)을 제공
- WAS (Web Application Server): 동적 페이지 또는 리소스를 담당
- 데이터베이스 (DB)
cf. Front-End (클라이언트 측 코드) = 브라우저가 실행하는 코드 (예) HTML, CSS, JavaScript 등
cf. Back-End (서버 측 코드) (예) PHP, ASP, JSP 등
PHP란?
PHP(Hypertext Preprocessor)는 대표적인 서버 사이드 스크립트 언어로, 현재는 범용 스크립트 언어를 표방한다. 웹 개발에 주로 사용되며, 전 세계 수많은 웹 시스템의 기반이 되는 언어이다.
클라이언트가 서버에 데이터를 전송하는(= 파라미터를 전달하는) 메소드에는 GET과 POST가 있다.
- GET: 데이터를 URL의 쿼리 문자열로 전송, 주로 데이터를 조회할 때 사용
<form method="GET">
<input type="text" name="id"/>
</form>
<?php
echo $_GET['id'];
?>
- POST: 데이터를 HTTP 요청 본문에 포함하여 전송, 주로 데이터를 생성하거나 수정할 때 사용
<form method="POST">
<input type="text" name="id"/>
</form>
<?php
echo $_POST['id'];
?>
둘의 큰 차이는 실행 결과 URL을 통해 알 수 있다. POST 메소드는 URL에 데이터가 노출되지 않는다. 파라미터 전달의 차이가 있기 때문이다.
- GET 메소드는 파라미터를 URL에 붙여 전달한다.
- (예) http:://192.168.50.177:1018/login.php?id=admin&admin1234
- ?: 구분자, 뒤에 포함되는 값은 전달된 파라미터
- &: 파라미터 구분자
- POST 메소드는 request body 부분에 데이터를 넣어서 전달한다.
파라미터를 다른 페이지로 전달하려면?
<?php
echo $_GET['id'];
echo $_GET['pass'];
?>
▲ login_proc.php
위 코드는 로그인을 처리하는 페이지이다. 전달받은 ID와 PW를 화면에 출력한다.
<form method="GET" action="login_proc.php">
<input type="text" name="id" placeholder="User ID"/>
<input type="password" name="pass" placeholder="User Password"/>
<input type="submit" value="login"/>
</form>
▲ login.php
위 코드는 로그인 페이지이다.
login.php 에서 login_proc.php로 데이터를 전달하기 위해 action 속성을 사용한다. action은 전송하면 누가 받아 줄 것인지를 지정하는 것으로, 예제에서는 login.php에서 폼 제출 시 데이터가 login_proc.php로 전달된다.
'모의해킹 > 웹해킹스터디' 카테고리의 다른 글
쿠키(Cookie)와 세션(Session) (0) | 2024.11.27 |
---|---|
[실습] 4개 로직 반영한 로그인 페이지 만들기 (0) | 2024.11.27 |
로그인 로직 이해하기 - 식별과 인증, 그리고 해시 (Hash) (1) | 2024.11.27 |
데이터베이스와 SQL (3) | 2024.11.27 |
[macOS] MAMP로 PHP 웹 개발 환경 세팅 (1) | 2024.11.27 |