웹 애플리케이션 보안 점검의 가장 기본은 클라이언트와 서버 사이에 오가는 데이터를 확인하고 제어하는 것이다.
이를 위해 필수적으로 사용되는 프록시(Proxy)의 개념을 정리하고, 대표적인 도구인 Burp Suite와 FoxyProxy를 이용해 실습 환경을 구축해본다.
1. 프록시(Proxy)란 무엇인가?
프록시는 사전적 의미로 '대리' 또는 '대행'을 뜻한다.
네트워크 환경에서 프록시 서버는 클라이언트(브라우저)와 서버 사이에서 중계자 역할을 수행한다.
보안 점검에서는 이 프록시가 일종의 '검문소'가 된다.
클라이언트가 보내는 Request(요청)와 서버가 되돌려주는 Response(응답)를 중간에서 가로채(Intercept), 데이터의 내용을 분석하거나 값을 변조하여 보안 취약점을 테스트할 수 있게 해준다.
2. 사용 도구 : Burp와 FoxyProxy
실습에 사용되는 두 도구는 유기적으로 작동하며 효율적인 분석 환경을 제공한다.
- Burp Suite: 웹 애플리케이션 보안 테스트를 위한 통합 플랫폼이다. 핵심 기능인 Proxy 툴을 통해 HTTP(S) 패킷을 가로채고 수정한다.
- FoxyProxy: 브라우저(Chrome, Firefox 등)에서 프록시 서버 설정을 손쉽게 전환할 수 있도록 돕는 확장 프로그램이다. 원래 브라우저에서 프록시를 쓰려면 설정 메뉴 깊숙이 들어가서 IP와 포트를 일일이 입력해야 하지만, 확장 프로그램을 쓰면 매번 브라우저에서 복잡하게 설정할 필요 없이 클릭 한 번으로 프록시를 켜고 끌 수 있다.

3. 도구 설정
🔵 Burp Suite 설정
여기서는 Burp Suite Community Edition v2026.4.2를 사용한다.
1️⃣ 포트 변경
기본 포트인 8080은 타 서비스(Tomcat 등)와 충돌할 가능성이 높다.
사용할 8081번 포트가 현재 비어 있는 것을 확인한다.

Proxy Settings > Proxy Listeners에서 포트를 8081로 변경한다.

Bind to port 부분을 8081로 수정한다.
Bind to address는 일단은 loopback only으로 설정하고 넘어간다.

💡 Bind to address 설정
Burp가 실행 중인 PC의 어떤 네트워크 인터페이스(통로)를 통해 들어오는 연결을 허용할 것인지를 결정하는 옵션이다.
프록시 서버는 외부(브라우저 등)로부터 요청을 받아야 하므로, 어디로 들어오는 문을 열어둘지 지정하는 것이다.
1. Loopback only (루프백 전용)
- 주소: 127.0.0.1 (localhost)
- 의미: 현재 Burp가 설치된 컴퓨터 내부에서 발생하는 연결만 허용.
- 용도: 같은 PC에 떠 있는 웹 브라우저(Chrome, Firefox 등)의 트래픽을 분석할 때 사용.
- 보안: 외부 기기가 내 Burp에 접속할 수 없으므로 가장 안전한 설정이다.
2. All interfaces (모든 인터페이스)
- 주소: 0.0.0.0
- 의미: 내 PC가 가진 모든 네트워크 카드로 들어오는 연결을 허용함. (Wi-Fi, 유선 LAN, 가상 네트워크 등)
- 용도: 다른 기기(모바일 폰, 태블릿, 혹은 같은 네트워크의 다른 PC)의 트래픽을 Burp로 보내서 분석할 때 사용한다.
- 주의사항: 공공장소나 보안되지 않은 네트워크에서 이 설정을 켜면, 다른 사람이 내 PC의 8081 포트로 접속하여 내 프록시를 무단으로 이용할 위험이 있다.
3. Specific address (특정 주소)
- 의미: 사용자가 직접 지정한 특정 IP 주소로 들어오는 연결만 허용합니다.
용도: 여러 개의 네트워크 인터페이스 중 특정 네트워크(예: 가상 머신용 내부망)에 연결된 요청만 골라 받고 싶을 때 선택.
예시: VMnet8로 연결된 가상머신에서 들어올 경우 192.168.100.1로 지정
설정이 완료되면 Running에 체크한다.

netstat -na | findstr 8081 명령어로 해당 포트가 정상적으로 LISTENING 상태인지 확인한다.

2️⃣ 인터셉트 규칙 설정
기본적으로 Request만 가로채도록 설정되어 있는 경우가 많다.
Response interception rules에서 체크박스를 활성화하여 서버에서 오는 응답도 확인할 수 있도록 설정한다.

3️⃣ 한글 깨짐 방지
User interface > Message editor > HTTP message display 에서 Font를 한글을 지원하는 폰트로 변경하고, Character Sets를 UTF-8로 지정한다.


4️⃣ 설정 저장

저장 위치를 지정하고 파일명을 임의로 지정하면 자동으로 json 형식으로 저장된다.
예) Burpsetting1.json
Burp를 완전 종료 후 다시 실행하여 설정 파일을 그대로 로드하여 Start Burp를 한다.

프록시 설정을 다시 열어보면 수정한 포트(8081)가 적용되어 있는 것을 확인할 수 있다.

🔵 FoxyProxy 설정
크롬 웹스토어에서 FoxyProxy 확장프로그램을 찾아서 Chrome에 추가한다.
확장프로그램 관리 > FoxyProxy 세부정보에 들어가서 '시크릿 모드에서 허용'을 활성화 해준다.
툴바에 고정해 두면 편하다.
1️⃣ 프록시 등록
Options > Proxies 메뉴로 들어가서 Add를 선택한다.

Host는 127.0.0.1, Port는 Burp에서 설정한 8081을 입력한다.

💡Host/Port 설정
Hostname과 Port는 브라우저가 보낸 데이터를 어디에 있는 어떤 프로그램에게 전달할지를 결정하는 주소지 정보다.
브라우저(FoxyProxy) → 127.0.0.1:8081 → Burp Suite
- 사용자가 웹사이트 접속을 시도한다.
- FoxyProxy가 가로채서, 데이터를 127.0.0.1(내 PC)의 8081번 포트로 던진다.
- 8081번 포트에서 Listening 상태에 있던 Burp Suite가 그 데이터를 낚아채서 화면에 보여준다.
- 이렇게 전달된 데이터는 Burp Suite에서 수정되거나 분석된 뒤, 다시 실제 인터넷 서버로 나간다.
2️⃣ 패턴 등록
모든 트래픽을 프록시로 보낼 필요는 없기에 Pattern 탭에 실습 대상 서버인 (http://192.168.100.23/) 주소를 등록하여 해당 사이트 접속 시에만 프록시가 작동하도록 설정한다.
http와 https를 모두 잡을 수 있도록 맨 앞에는 와일드카드(*)로 표시한다.
모두 입력한 후 Save를 눌러 저장한다.

2️⃣ 프록시 활성화
저장한 후 Proxy by Patterns를 누르면 위에 지구 아이콘 같은게 뜨는데, 이것이 프록시가 활성화되어 있다는 뜻이다.

4. 실습: Request-Response 테스트
실제 프록시를 통해 서버의 응답을 중계받는 과정을 진행한다.
실습용 웹 서버(192.168.100.23)에 테스트용 php 코드를 작성한다.
[root@www ~]# cd /var/www/html
[root@www html]# vi proxy_test.php
<?php
// 1. 요청 라인 정보 (Method, URI, Protocol)
echo "<h2>1. Request Information</h2>";
echo "<b>Method:</b> " . $_SERVER['REQUEST_METHOD'] . "<br>";
echo "<b>Request URI:</b> " . $_SERVER['REQUEST_URI'] . "<br>";
// 2. 모든 HTTP 헤더 정보 (Burp에서 수정한 헤더가 여기서 보입니다)
echo "<h2>2. HTTP Request Headers</h2>";
echo "<pre>";
foreach (getallheaders() as $name => $value) {
echo "<b>$name:</b> $value\n";
}
echo "</pre>";
// 3. POST 데이터 확인 (Body 데이터)
echo "<h2>3. POST Body Data</h2>";
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
echo "<pre>";
print_r($_POST);
echo "</pre>";
} else {
echo "<i>No POST data (GET request)</i>";
}
// 4. 간단한 테스트용 폼
echo "<h2>4. Send Test POST Request</h2>";
?>
<form method="POST" action="">
<input type="text" name="test_data" value="Hello Burp!">
<input type="submit" value="Submit to Proxy">
</form>
- $_SERVER: 서버 환경 및 요청 정보를 담고 있는 PHP 내장 배열.
- getallheaders(): 클라이언트(브라우저 또는 프록시)가 서버로 보낸 모든 헤더를 가져온다.
- $_POST: HTTP Body를 통해 전달된 파라미터들을 담고 있다.
대상 URL은 http://192.168.100.23/proxy_test.php이다.
1️⃣ 요청(Request) 가로채기
Burp Suite에서 Intercept on 상태로 둔다.

클라이언트(크롬 브라우저)에서 해당 주소에 접속한다.
http://192.168.100.23/proxy_test.php
프록시가 중간에서 요청을 잡았기 때문에 로딩 상태에 머무른다.

Burp Suite의 Intercept 탭에 클라이언트가 서버로 보내는 HTTP 요청 패킷이 나타난다.

여기서 Forward 버튼을 눌러 서버로 데이터를 보낸다.
서버 쪽에서 보내는 응답(Response)가 뜬다.
2️⃣ 응답(Response) 가로채서 변조하기
서버가 요청을 처리한 뒤 응답을 보내면, 이 역시 브라우저에 바로 나타나지 않고 Burp Suite에 먼저 잡힌다.
서버는 proxy_test.php 파일 내의 PHP 코드 결과물(웹 페이지 소스)을 응답한다.
Burp에서 서버의 응답 내용 일부를 임의로 바꿔본다.
- 수정 전: User-Agent: Mozilla/5.0 (Windows NT ...
- 수정 후: User-Agent: My-Secret-Hacker-Tool/1.0

Forward를 누르면 변조된 응답이 클라이언트에게 전송되는 것을 확인할 수 있다.

'Journey to Security > 웹 보안' 카테고리의 다른 글
| [SQLi] 취약한 웹앱 공격 실습 (1) 로그인 우회 (0) | 2026.05.16 |
|---|---|
| [SQLi] 취약한 실습용 웹 애플리케이션 만들기 (Claude AI 이용) (0) | 2026.05.16 |