기타 애플리케이션 프로토콜
기타 애플리케이션 프로토콜¶
개요¶
HTTP 외에도 네트워크에서는 다양한 애플리케이션 계층 프로토콜이 사용됩니다. 이 장에서는 DHCP, FTP, 이메일 프로토콜(SMTP, POP3, IMAP), SSH, Telnet, WebSocket 등을 학습합니다.
난이도: ⭐⭐
학습 목표: - 각 프로토콜의 역할과 동작 원리 이해 - 프로토콜별 포트 번호 숙지 - 보안 고려사항 파악 - 실무에서의 활용 방법 학습
목차¶
1. DHCP¶
DHCP 개요¶
DHCP(Dynamic Host Configuration Protocol)는 네트워크에 연결된 장치에 IP 주소와 네트워크 설정을 자동으로 할당하는 프로토콜입니다.
┌─────────────────────────────────────────────────────────────────┐
│ DHCP 기본 개념 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 포트: UDP 67 (서버), UDP 68 (클라이언트) │
│ RFC: 2131 │
│ │
│ 할당 정보: │
│ - IP 주소 │
│ - 서브넷 마스크 │
│ - 기본 게이트웨이 │
│ - DNS 서버 │
│ - 임대 시간 (Lease Time) │
│ │
└─────────────────────────────────────────────────────────────────┘
DHCP DORA 과정¶
┌─────────────────────────────────────────────────────────────────┐
│ DHCP DORA 과정 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ [클라이언트] [DHCP 서버] │
│ (IP 없음) (192.168.1.1) │
│ │ │ │
│ │──(1) DHCP Discover ─────────────────▶ │ │
│ │ 출발지: 0.0.0.0 │ │
│ │ 목적지: 255.255.255.255 (브로드캐스트) │
│ │ "IP 주소가 필요합니다" │ │
│ │ │ │
│ │◀─(2) DHCP Offer ─────────────────────│ │
│ │ "192.168.1.100을 제안합니다" │ │
│ │ 서브넷: 255.255.255.0 │ │
│ │ 게이트웨이: 192.168.1.1 │ │
│ │ DNS: 8.8.8.8 │ │
│ │ 임대 시간: 24시간 │ │
│ │ │ │
│ │──(3) DHCP Request ──────────────────▶ │ │
│ │ "192.168.1.100을 요청합니다" │ │
│ │ │ │
│ │◀─(4) DHCP Ack ───────────────────────│ │
│ │ "192.168.1.100 사용을 승인합니다" │ │
│ │ │ │
│ [IP 설정 완료] │ │
│ (192.168.1.100) │ │
│ │
└─────────────────────────────────────────────────────────────────┘
DORA: Discover → Offer → Request → Acknowledge
DHCP 메시지 유형¶
| 메시지 | 방향 | 설명 |
|---|---|---|
| DISCOVER | 클라이언트 → 서버 | IP 주소 요청 (브로드캐스트) |
| OFFER | 서버 → 클라이언트 | IP 주소 제안 |
| REQUEST | 클라이언트 → 서버 | 제안 수락 또는 갱신 요청 |
| ACK | 서버 → 클라이언트 | 요청 승인 |
| NAK | 서버 → 클라이언트 | 요청 거부 |
| RELEASE | 클라이언트 → 서버 | IP 반납 |
| INFORM | 클라이언트 → 서버 | 추가 설정 요청 |
DHCP 임대 과정¶
┌─────────────────────────────────────────────────────────────────┐
│ DHCP 임대 시간 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 임대 시작 │
│ │ │
│ ├────────────────────────────────────── 임대 시간 (T) │
│ │ │
│ ├──────────────── T/2 (50%) │
│ │ │ │
│ │ └─ 갱신 시도 (Request to 서버) │
│ │ 성공 시: 임대 시간 연장 │
│ │ │
│ ├──────────────────────────── T * 7/8 (87.5%) │
│ │ │ │
│ │ └─ 리바인딩 시도 │
│ │ (브로드캐스트) │
│ │ │
│ └────────────────────────────────────── T (100%) │
│ │ │
│ └─ 임대 만료 │
│ IP 해제 │
│ │
└─────────────────────────────────────────────────────────────────┘
DHCP 관련 명령어¶
# Linux - DHCP 클라이언트
# IP 해제
sudo dhclient -r eth0
# IP 갱신
sudo dhclient eth0
# 상세 정보 출력
sudo dhclient -v eth0
# Windows
ipconfig /release # IP 해제
ipconfig /renew # IP 갱신
# macOS
sudo ipconfig set en0 DHCP # DHCP 재설정
2. FTP¶
FTP 개요¶
FTP(File Transfer Protocol)는 클라이언트와 서버 간에 파일을 전송하기 위한 프로토콜입니다.
┌─────────────────────────────────────────────────────────────────┐
│ FTP 기본 정보 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 포트: │
│ - 제어 연결: TCP 21 │
│ - 데이터 연결: TCP 20 (Active) 또는 임의 포트 (Passive) │
│ │
│ 특징: │
│ - 두 개의 채널 사용 (제어 + 데이터) │
│ - 평문 전송 (보안 취약) │
│ - ASCII/Binary 전송 모드 │
│ - Active/Passive 모드 │
│ │
└─────────────────────────────────────────────────────────────────┘
FTP Active vs Passive 모드¶
┌─────────────────────────────────────────────────────────────────┐
│ Active 모드 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ [클라이언트] [FTP 서버] │
│ (임의 포트 N) (포트 21, 20) │
│ │ │ │
│ │──(1) 제어 연결 (N → 21) ────────────▶ │ │
│ │ "PORT N+1" │ │
│ │ │ │
│ │◀─(2) 데이터 연결 (20 → N+1) ──────────│ │
│ │ 서버가 클라이언트로 연결 │ │
│ │ │ │
│ ※ 클라이언트 방화벽이 외부 연결 차단 시 문제 발생 │
│ │
├─────────────────────────────────────────────────────────────────┤
│ Passive 모드 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ [클라이언트] [FTP 서버] │
│ (임의 포트) (포트 21, 임의 포트) │
│ │ │ │
│ │──(1) 제어 연결 (N → 21) ────────────▶ │ │
│ │ "PASV" │ │
│ │ │ │
│ │◀──── 응답: 포트 P 사용 ───────────────│ │
│ │ │ │
│ │──(2) 데이터 연결 (N+1 → P) ──────────▶ │ │
│ │ 클라이언트가 서버로 연결 │ │
│ │ │ │
│ ※ 클라이언트가 항상 연결 시작 → 방화벽 문제 적음 │
│ │
└─────────────────────────────────────────────────────────────────┘
FTP 주요 명령어¶
| 명령 | 설명 | 예시 |
|---|---|---|
| USER | 사용자명 전송 | USER username |
| PASS | 비밀번호 전송 | PASS password |
| LIST | 디렉토리 목록 | LIST |
| CWD | 디렉토리 변경 | CWD /home/user |
| PWD | 현재 디렉토리 | PWD |
| RETR | 파일 다운로드 | RETR file.txt |
| STOR | 파일 업로드 | STOR file.txt |
| DELE | 파일 삭제 | DELE file.txt |
| MKD | 디렉토리 생성 | MKD newdir |
| RMD | 디렉토리 삭제 | RMD olddir |
| PASV | Passive 모드 | PASV |
| PORT | Active 모드 | PORT 192,168,1,100,4,1 |
| QUIT | 연결 종료 | QUIT |
FTP 응답 코드¶
| 코드 범위 | 의미 | 예시 |
|---|---|---|
| 1xx | 긍정 예비 응답 | 150 파일 상태 OK |
| 2xx | 긍정 완료 응답 | 200 명령 OK, 226 전송 완료 |
| 3xx | 긍정 중간 응답 | 331 사용자명 OK, 비밀번호 필요 |
| 4xx | 부정 일시 응답 | 421 서비스 불가 |
| 5xx | 부정 영구 응답 | 530 로그인 실패, 550 권한 없음 |
FTP 클라이언트 사용¶
# 기본 FTP 클라이언트
ftp ftp.example.com
# 연결 후 명령어
ftp> user username
ftp> pass password
ftp> ls # 목록 확인
ftp> cd directory # 디렉토리 이동
ftp> get file.txt # 다운로드
ftp> put file.txt # 업로드
ftp> binary # 바이너리 모드
ftp> ascii # ASCII 모드
ftp> passive # Passive 모드 토글
ftp> bye # 연결 종료
SFTP와 FTPS¶
┌─────────────────────────────────────────────────────────────────┐
│ FTP vs SFTP vs FTPS │
├─────────────────────────────────────────────────────────────────┤
│ │
│ FTP │ SFTP │ FTPS │
│ (평문) │ (SSH 기반) │ (TLS/SSL 기반) │
│ │ │ │
│ ┌─────────┐ │ ┌─────────┐ │ ┌─────────┐ │
│ │ FTP │ │ │ SFTP │ │ │ FTP │ │
│ ├─────────┤ │ ├─────────┤ │ ├─────────┤ │
│ │ TCP │ │ │ SSH │ │ │ TLS/SSL │ │
│ └─────────┘ │ ├─────────┤ │ ├─────────┤ │
│ │ │ TCP │ │ │ TCP │ │
│ 포트: 21 │ └─────────┘ │ └─────────┘ │
│ │ │ │
│ 보안: 없음 │ 포트: 22 │ 포트: 990 (implicit) │
│ │ 보안: SSH 암호화 │ 21 (explicit) │
│ │ │ 보안: TLS 암호화 │
│ │
└─────────────────────────────────────────────────────────────────┘
권장: SFTP 사용 (SSH 기반으로 단일 포트 사용)
3. 이메일 프로토콜¶
이메일 전송 구조¶
┌─────────────────────────────────────────────────────────────────┐
│ 이메일 전송 과정 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ [발신자] [발신 서버] [수신 서버] [수신자] │
│ alice@a.com mail.a.com mail.b.com bob@b.com │
│ │ │ │ │ │
│ │──(1) SMTP─▶│ │ │ │
│ │ (작성) │ │ │ │
│ │ │ │ │ │
│ │ │──(2) SMTP───────▶│ │ │
│ │ │ (서버 간 전송) │ │ │
│ │ │ │ │ │
│ │ │ │──(3) 저장─▶│ │
│ │ │ │ (메일박스) │ │
│ │ │ │ │ │
│ │ │ │◀─(4) POP3/IMAP──│ │
│ │ │ │ (메일 수신) │ │
│ │
│ 프로토콜: │
│ - SMTP: 메일 전송 (발송) │
│ - POP3: 메일 수신 (다운로드 후 삭제) │
│ - IMAP: 메일 수신 (서버에 유지) │
│ │
└─────────────────────────────────────────────────────────────────┘
SMTP (Simple Mail Transfer Protocol)¶
┌─────────────────────────────────────────────────────────────────┐
│ SMTP 정보 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 포트: TCP 25 (기본), 587 (submission), 465 (SSL) │
│ RFC: 5321 │
│ 용도: 이메일 전송 │
│ │
│ SMTP 세션 예시: │
│ │
│ C: 연결 (TCP 25) │
│ S: 220 mail.example.com ESMTP ready │
│ C: EHLO client.example.com │
│ S: 250-mail.example.com Hello │
│ S: 250-AUTH LOGIN PLAIN │
│ S: 250 STARTTLS │
│ C: MAIL FROM:<alice@example.com> │
│ S: 250 OK │
│ C: RCPT TO:<bob@example.com> │
│ S: 250 OK │
│ C: DATA │
│ S: 354 Start mail input │
│ C: Subject: Test │
│ C: │
│ C: Hello, this is a test. │
│ C: . │
│ S: 250 OK Message queued │
│ C: QUIT │
│ S: 221 Bye │
│ │
└─────────────────────────────────────────────────────────────────┘
SMTP 주요 명령어¶
| 명령 | 설명 |
|---|---|
| HELO/EHLO | 클라이언트 식별 (EHLO는 확장 SMTP) |
| MAIL FROM | 발신자 지정 |
| RCPT TO | 수신자 지정 |
| DATA | 메일 내용 시작 |
| QUIT | 연결 종료 |
| AUTH | 인증 |
| STARTTLS | TLS 암호화 시작 |
| RSET | 트랜잭션 초기화 |
POP3 (Post Office Protocol v3)¶
┌─────────────────────────────────────────────────────────────────┐
│ POP3 정보 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 포트: TCP 110 (기본), 995 (SSL/TLS) │
│ RFC: 1939 │
│ 용도: 이메일 수신 (다운로드) │
│ │
│ 특징: │
│ - 메일을 로컬로 다운로드 │
│ - 서버에서 삭제 (기본) │
│ - 단일 기기에서 사용 적합 │
│ - 오프라인 읽기 가능 │
│ │
│ POP3 세션 예시: │
│ │
│ S: +OK POP3 server ready │
│ C: USER alice │
│ S: +OK │
│ C: PASS password123 │
│ S: +OK Logged in │
│ C: STAT │
│ S: +OK 3 1024 │
│ C: LIST │
│ S: +OK 3 messages │
│ S: 1 512 │
│ S: 2 256 │
│ S: 3 256 │
│ S: . │
│ C: RETR 1 │
│ S: +OK 512 octets │
│ S: (메일 내용) │
│ S: . │
│ C: DELE 1 │
│ S: +OK Deleted │
│ C: QUIT │
│ S: +OK Bye │
│ │
└─────────────────────────────────────────────────────────────────┘
IMAP (Internet Message Access Protocol)¶
┌─────────────────────────────────────────────────────────────────┐
│ IMAP 정보 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 포트: TCP 143 (기본), 993 (SSL/TLS) │
│ RFC: 3501 (IMAP4) │
│ 용도: 이메일 수신 (서버 동기화) │
│ │
│ 특징: │
│ - 메일을 서버에 보관 │
│ - 여러 기기에서 동기화 │
│ - 폴더 관리 가능 │
│ - 부분 다운로드 지원 │
│ - 온라인 상태 필요 │
│ │
└─────────────────────────────────────────────────────────────────┘
POP3 vs IMAP 비교¶
| 특성 | POP3 | IMAP |
|---|---|---|
| 메일 저장 위치 | 로컬 (다운로드) | 서버 |
| 다중 기기 동기화 | 어려움 | 지원 |
| 오프라인 읽기 | 용이 | 제한적 |
| 서버 저장 공간 | 적음 | 많음 필요 |
| 폴더 관리 | 제한적 | 지원 |
| 부분 다운로드 | 불가 | 가능 |
| 적합한 용도 | 단일 기기 | 다중 기기 |
이메일 포트 정리¶
| 프로토콜 | 포트 | 보안 |
|---|---|---|
| SMTP | 25 | 평문 |
| SMTP Submission | 587 | STARTTLS |
| SMTPS | 465 | SSL/TLS |
| POP3 | 110 | 평문 |
| POP3S | 995 | SSL/TLS |
| IMAP | 143 | 평문 |
| IMAPS | 993 | SSL/TLS |
4. SSH¶
SSH 개요¶
SSH(Secure Shell)는 네트워크 상에서 암호화된 원격 접속을 제공하는 프로토콜입니다.
┌─────────────────────────────────────────────────────────────────┐
│ SSH 정보 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 포트: TCP 22 │
│ RFC: 4251-4256 │
│ 버전: SSH-2 (권장), SSH-1 (폐기) │
│ │
│ 기능: │
│ - 암호화된 원격 쉘 접속 │
│ - 파일 전송 (SCP, SFTP) │
│ - 포트 포워딩/터널링 │
│ - X11 포워딩 │
│ │
│ 인증 방식: │
│ - 비밀번호 인증 │
│ - 공개키 인증 (권장) │
│ - 호스트 기반 인증 │
│ - 키보드 인터랙티브 │
│ │
└─────────────────────────────────────────────────────────────────┘
SSH 연결 과정¶
┌─────────────────────────────────────────────────────────────────┐
│ SSH 연결 과정 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ [클라이언트] [서버] │
│ │ │ │
│ │──(1) TCP 연결 (포트 22) ────────────▶ │ │
│ │ │ │
│ │◀─(2) 프로토콜 버전 교환 ──────────────│ │
│ │ SSH-2.0-OpenSSH_8.9 │ │
│ │ │ │
│ │◀──(3) 키 교환 알고리즘 협상 ─────────▶│ │
│ │ 암호화, MAC, 압축 알고리즘 │ │
│ │ │ │
│ │◀──(4) 키 교환 (DH/ECDH) ────────────▶│ │
│ │ 세션 키 생성 │ │
│ │ │ │
│ │◀════(5) 암호화된 통신 시작 ══════════▶│ │
│ │ │ │
│ │──(6) 사용자 인증 ─────────────────▶ │ │
│ │ (비밀번호 또는 공개키) │ │
│ │ │ │
│ │◀─(7) 인증 성공 ──────────────────────│ │
│ │ │ │
│ │◀════(8) 쉘 세션 시작 ════════════════▶│ │
│ │
└─────────────────────────────────────────────────────────────────┘
SSH 공개키 인증¶
┌─────────────────────────────────────────────────────────────────┐
│ SSH 공개키 인증 원리 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ [클라이언트] [서버] │
│ │
│ 개인키 (id_ed25519) 공개키 (authorized_keys) │
│ ┌──────────────────┐ ┌──────────────────┐ │
│ │ 절대 공개 금지 │ │ 클라이언트 │ │
│ │ 로컬에만 보관 │ │ 공개키 저장 │ │
│ └──────────────────┘ └──────────────────┘ │
│ │ │ │
│ │ │ │
│ 인증 과정: │
│ 1. 서버가 무작위 챌린지 전송 │
│ 2. 클라이언트가 개인키로 챌린지 서명 │
│ 3. 서버가 공개키로 서명 검증 │
│ 4. 검증 성공 시 인증 완료 │
│ │
└─────────────────────────────────────────────────────────────────┘
SSH 주요 명령어¶
# 기본 접속
ssh user@hostname
ssh -p 2222 user@hostname # 포트 지정
# 키 생성
ssh-keygen -t ed25519 -C "email@example.com"
ssh-keygen -t rsa -b 4096
# 공개키 복사
ssh-copy-id user@hostname
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@hostname
# 파일 전송 (SCP)
scp file.txt user@host:/path/
scp user@host:/path/file.txt ./
scp -r directory/ user@host:/path/
# SFTP
sftp user@hostname
SSH 터널링¶
# 로컬 포트 포워딩
# 로컬 8080 → 원격 서버 경유 → 대상 서버 80
ssh -L 8080:target.example.com:80 user@jump.example.com
# 원격 포트 포워딩
# 원격 서버 8080 → 로컬 머신 80
ssh -R 8080:localhost:80 user@remote.example.com
# 동적 포트 포워딩 (SOCKS 프록시)
ssh -D 1080 user@proxy.example.com
┌─────────────────────────────────────────────────────────────────┐
│ SSH 로컬 포트 포워딩 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ssh -L 8080:db.internal:3306 user@jump.example.com │
│ │
│ [로컬 PC] [점프 서버] [DB 서버] │
│ localhost:8080 jump.example.com db.internal:3306 │
│ │ │ │ │
│ │════ SSH 터널 ════▶│ │ │
│ │ │──────────────────▶│ │
│ │ │ │ │
│ │◀═══════════════════│◀──────────────────│ │
│ │
│ 사용: mysql -h 127.0.0.1 -P 8080 (로컬에서 DB 접속) │
│ │
└─────────────────────────────────────────────────────────────────┘
5. Telnet¶
Telnet 개요¶
Telnet은 원격 호스트에 터미널 접속을 제공하는 프로토콜입니다. 보안상 SSH 사용 권장.
┌─────────────────────────────────────────────────────────────────┐
│ Telnet 정보 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 포트: TCP 23 │
│ RFC: 854 │
│ │
│ 특징: │
│ - 평문 전송 (암호화 없음) │
│ - 비밀번호 노출 위험 │
│ - 스니핑에 취약 │
│ - 레거시 시스템에서만 사용 │
│ │
│ ⚠️ 보안 경고: │
│ - 인터넷에서 Telnet 사용 금지 │
│ - SSH로 대체 필요 │
│ - 내부망에서도 가급적 피할 것 │
│ │
└─────────────────────────────────────────────────────────────────┘
Telnet 활용 (테스트용)¶
Telnet은 보안상 원격 접속에는 부적합하지만, 포트 연결 테스트에 유용합니다.
# 포트 연결 테스트
telnet example.com 80
telnet example.com 443
# HTTP 테스트
telnet example.com 80
GET / HTTP/1.1
Host: example.com
(빈 줄)
# SMTP 테스트
telnet mail.example.com 25
EHLO test
QUIT
# 연결 확인만 (nc 권장)
nc -zv example.com 80
nc -zv example.com 22
Telnet vs SSH¶
| 특성 | Telnet | SSH |
|---|---|---|
| 포트 | 23 | 22 |
| 암호화 | 없음 (평문) | 있음 |
| 인증 | 평문 비밀번호 | 다양한 방식 |
| 보안 | 매우 취약 | 강함 |
| 파일 전송 | 없음 | SCP, SFTP |
| 터널링 | 없음 | 지원 |
| 사용 권장 | 테스트용만 | 항상 권장 |
6. WebSocket¶
WebSocket 개요¶
WebSocket은 클라이언트와 서버 간 양방향 실시간 통신을 제공하는 프로토콜입니다.
┌─────────────────────────────────────────────────────────────────┐
│ WebSocket 정보 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 포트: TCP 80 (ws://), TCP 443 (wss://) │
│ RFC: 6455 │
│ │
│ 특징: │
│ - HTTP 업그레이드로 시작 │
│ - 양방향 (Full-Duplex) 통신 │
│ - 지속 연결 (Persistent Connection) │
│ - 낮은 오버헤드 (헤더 최소화) │
│ - 실시간 데이터 전송 │
│ │
│ 활용 사례: │
│ - 실시간 채팅 │
│ - 온라인 게임 │
│ - 주식/가상화폐 시세 │
│ - 라이브 스트리밍 │
│ - 협업 도구 │
│ │
└─────────────────────────────────────────────────────────────────┘
HTTP vs WebSocket¶
┌─────────────────────────────────────────────────────────────────┐
│ HTTP vs WebSocket │
├─────────────────────────────────────────────────────────────────┤
│ │
│ HTTP (요청-응답) WebSocket (양방향) │
│ │
│ 클라이언트 서버 클라이언트 서버 │
│ │ │ │ │ │
│ │──요청1 ──▶│ │══연결══════│ │
│ │◀──응답1 ──│ │ │ │
│ │ │ │◀─ 메시지 ──│ │
│ │──요청2 ──▶│ │── 메시지 ─▶│ │
│ │◀──응답2 ──│ │◀─ 메시지 ──│ │
│ │ │ │── 메시지 ─▶│ │
│ │──요청3 ──▶│ │ │ │
│ │◀──응답3 ──│ │◀─ 메시지 ──│ │
│ │══연결 종료═│ │
│ │
│ 매번 연결 생성 한 번 연결, 지속 통신 │
│ 클라이언트만 요청 가능 양쪽 모두 전송 가능 │
│ 요청 헤더 오버헤드 최소 프레임 헤더 │
│ │
└─────────────────────────────────────────────────────────────────┘
WebSocket 핸드셰이크¶
┌─────────────────────────────────────────────────────────────────┐
│ WebSocket 핸드셰이크 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ [클라이언트 요청 - HTTP Upgrade] │
│ ───────────────────────────────── │
│ GET /chat HTTP/1.1 │
│ Host: server.example.com │
│ Upgrade: websocket │
│ Connection: Upgrade │
│ Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== │
│ Sec-WebSocket-Version: 13 │
│ │
│ [서버 응답 - 101 Switching Protocols] │
│ ────────────────────────────────────── │
│ HTTP/1.1 101 Switching Protocols │
│ Upgrade: websocket │
│ Connection: Upgrade │
│ Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= │
│ │
│ [이후 WebSocket 프레임으로 통신] │
│ │
└─────────────────────────────────────────────────────────────────┘
WebSocket 클라이언트 (JavaScript)¶
// WebSocket 연결
const socket = new WebSocket('wss://example.com/chat');
// 연결 성공
socket.onopen = function(event) {
console.log('WebSocket 연결됨');
socket.send('Hello Server!');
};
// 메시지 수신
socket.onmessage = function(event) {
console.log('메시지 수신:', event.data);
};
// 연결 종료
socket.onclose = function(event) {
console.log('연결 종료:', event.code, event.reason);
};
// 에러 처리
socket.onerror = function(error) {
console.error('WebSocket 에러:', error);
};
// 메시지 전송
socket.send(JSON.stringify({ type: 'chat', message: 'Hello!' }));
// 연결 종료
socket.close();
WebSocket 서버 (Node.js)¶
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });
wss.on('connection', function(ws) {
console.log('클라이언트 연결됨');
// 메시지 수신
ws.on('message', function(message) {
console.log('받은 메시지:', message);
// 에코 응답
ws.send('서버 응답: ' + message);
// 모든 클라이언트에게 브로드캐스트
wss.clients.forEach(function(client) {
if (client.readyState === WebSocket.OPEN) {
client.send(message);
}
});
});
ws.on('close', function() {
console.log('클라이언트 연결 종료');
});
});
7. 연습 문제¶
기초 문제¶
- DHCP
- DORA의 각 단계를 설명하세요.
-
DHCP 서버가 할당하는 정보를 모두 나열하세요.
-
FTP
- Active 모드와 Passive 모드의 차이는?
-
FTP의 보안 문제와 대안을 설명하세요.
-
이메일
- SMTP, POP3, IMAP의 역할을 각각 설명하세요.
- POP3와 IMAP의 차이점은?
중급 문제¶
- SSH
- SSH 공개키 인증의 장점은?
-
SSH 로컬 포트 포워딩을 사용하는 상황 예시를 제시하세요.
-
포트 번호
-
다음 프로토콜의 포트 번호를 쓰세요:
- DHCP (클라이언트/서버)
- FTP (제어/데이터)
- SMTP (기본/SSL)
- SSH
- POP3S
- IMAPS
-
실습 문제
# 다음 명령의 결과를 예측하세요
# 1. SSH 터널을 통해 원격 DB에 접속
ssh -L 3306:db.internal:3306 user@bastion.example.com
mysql -h 127.0.0.1 -P 3306 -u dbuser -p
# 2. SFTP로 파일 업로드
sftp user@server.example.com
put localfile.txt /home/user/
# 3. Telnet으로 HTTP 테스트
telnet example.com 80
GET / HTTP/1.1
Host: example.com
고급 문제¶
- WebSocket
- HTTP Polling과 WebSocket의 차이는?
-
WebSocket이 HTTP를 통해 핸드셰이크하는 이유는?
-
보안 비교
- Telnet, FTP, SMTP의 보안 문제점을 설명하세요.
- 각각의 보안 대안은 무엇인가요?
8. 다음 단계¶
15_Network_Security_Basics.md에서 방화벽, NAT, VPN 등 네트워크 보안 기초를 배워봅시다!
9. 참고 자료¶
RFC 문서¶
- RFC 2131 - DHCP
- RFC 959 - FTP
- RFC 5321 - SMTP
- RFC 1939 - POP3
- RFC 3501 - IMAP
- RFC 4251-4256 - SSH
- RFC 6455 - WebSocket
포트 번호 요약¶
| 프로토콜 | 평문 포트 | 보안 포트 |
|---|---|---|
| FTP | 21 (제어), 20 (데이터) | 990 (FTPS) |
| SSH/SFTP | 22 | - |
| Telnet | 23 | - |
| SMTP | 25, 587 | 465 |
| DNS | 53 | 853 (DoT) |
| DHCP | 67/68 | - |
| HTTP | 80 | 443 (HTTPS) |
| POP3 | 110 | 995 |
| IMAP | 143 | 993 |