머신러닝이 보안에 쓰인다는 말은 많이 들었는데, 실제로 어떤 구조가 어디에 쓰이는지는 잘 안 나온다. CNN과 RNN은 각각 잘하는 게 다르고, 네트워크 보안에서 역할도 다르다. 이 글은 그 차이와 실제 적용 방식을 정리한다.
먼저 두 구조의 차이
CNN(Convolutional Neural Network)은 공간적 패턴을 찾는다. 데이터의 "어떤 부분에 이런 특징이 있다"를 감지하는 데 강하다. 위치 정보가 중요한 데이터에 잘 맞는다.
RNN(Recurrent Neural Network)은 순서와 흐름을 기억한다. 이전 상태를 다음 연산에 넘기는 구조라 시계열, 시퀀스 데이터에 강하다. 시간 순서가 의미를 갖는 데이터에 잘 맞는다.
네트워크 트래픽은 이 두 성질을 동시에 갖는다. 패킷 하나의 구조(공간적)도 중요하고, 패킷들의 흐름(시간적)도 중요하다. 그래서 둘 다 쓰인다.
HTTPS 트래픽 분류 — 암호화돼도 패턴은 남는다
HTTPS는 내용을 암호화한다. 패킷을 열어봐도 뭔지 모른다. 근데 암호화해도 숨길 수 없는 정보가 있다.
- 패킷 크기
- 전송 간격(타이밍)
- 패킷 수
- 업로드 / 다운로드 비율
- TLS 핸드셰이크 파라미터
이 메타데이터만으로 "이 트래픽이 YouTube인지, Netflix인지, 악성 C2 통신인지" 구분할 수 있다. 이걸 암호화 트래픽 분류(Encrypted Traffic Classification)라고 한다.
CNN은 패킷 바이트 시퀀스를 2D 행렬로 변환해서 특징을 추출한다. 패킷 하나의 내부 구조에서 프로토콜 패턴을 잡아낸다.
RNN은 패킷 흐름, 즉 시간 순서에 따른 트래픽 변화를 추적한다. "처음엔 작은 패킷이 많이 오다가 갑자기 큰 패킷이 연속으로 온다"는 식의 시퀀스 패턴을 학습한다.
둘을 합치면 패킷 구조 + 흐름을 동시에 보는 모델이 된다.
패킷 시퀀스 입력
↓
[CNN] 각 패킷 내부 특징 추출
↓
[RNN/LSTM] 패킷 간 시계열 흐름 추적
↓
분류: 정상 HTTPS / 악성 C2 / 데이터 유출 의심
TLS 핸드셰이크 분석 — 연결 시작 단계에서 이상 탐지
HTTPS 연결은 TLS 핸드셰이크로 시작한다. 이 과정에서 클라이언트는 지원하는 암호화 방식 목록(cipher suite)을 서버에 보낸다. 이 목록이 일종의 지문(fingerprint)이 된다.
정상 브라우저, 악성코드, 봇, 스캐너는 각각 다른 cipher suite 조합을 사용한다. JA3라는 방식이 이걸 해시값으로 만들어서 클라이언트를 식별한다.
클라이언트 헬로 패킷
↓
TLS 버전 + Cipher Suite + Extension 추출
↓
JA3 해시 생성
↓
CNN으로 알려진 악성 도구 지문과 비교
RNN은 여기서 연결 시도 패턴을 본다. 정상 사용자는 사이트를 하나씩 열지만, 봇은 수백 개 IP에 짧은 시간 안에 TLS 핸드셰이크를 보낸다. 이 시퀀스를 LSTM이 잡아낸다.
프로토콜 이상 탐지 — 정상 프로토콜인데 이상하게 쓰인다
DNS, HTTP, SMTP 같은 표준 프로토콜도 공격에 악용된다. DNS 터널링이 대표적이다. DNS 쿼리 안에 데이터를 숨겨서 방화벽을 우회한다.
정상 DNS 쿼리: 짧고 일반적인 도메인명 DNS 터널링: 비정상적으로 긴 서브도메인, 랜덤한 문자열
a1b2c3d4e5f6.attacker.com
x9y8z7.data-exfil.io
CNN은 도메인 문자열 자체의 구조적 패턴을 본다. 랜덤 문자열의 엔트로피, 길이, 문자 분포.
RNN은 시간 흐름을 본다. 5초 안에 같은 도메인 서버로 100개 쿼리를 보내는 패턴, 야간에만 활성화되는 비콘 통신 주기.
실제 아키텍처 예시 — CNN + LSTM 결합
실무에서 많이 쓰는 구조는 CNN으로 특징 추출하고 LSTM으로 시퀀스를 처리하는 방식이다.
import torch
import torch.nn as nn
class TrafficClassifier(nn.Module):
def __init__(self, num_classes):
super().__init__()
# CNN: 패킷 내부 특징 추출
self.conv1 = nn.Conv1d(1, 64, kernel_size=5, padding=2)
self.conv2 = nn.Conv1d(64, 128, kernel_size=3, padding=1)
self.pool = nn.MaxPool1d(2)
# LSTM: 패킷 시퀀스 흐름 추적
self.lstm = nn.LSTM(
input_size=128,
hidden_size=256,
num_layers=2,
batch_first=True,
dropout=0.3
)
# 최종 분류
self.fc = nn.Linear(256, num_classes)
def forward(self, x):
# x shape: (batch, seq_len, packet_len)
batch, seq, length = x.shape
# CNN으로 각 패킷 특징 추출
x = x.view(batch * seq, 1, length)
x = torch.relu(self.conv1(x))
x = self.pool(torch.relu(self.conv2(x)))
x = x.mean(dim=-1) # (batch*seq, 128)
# LSTM으로 시퀀스 처리
x = x.view(batch, seq, -1)
_, (hidden, _) = self.lstm(x)
return self.fc(hidden[-1])
# 분류: 정상, DDoS, DNS터널링, C2통신, 데이터유출
model = TrafficClassifier(num_classes=5)
CNN vs RNN, 언제 어떤 걸 쓰나
상황 적합한 모델 이유
| 악성코드 파일 분류 | CNN | 바이트 배열의 공간적 패턴 |
| 실시간 트래픽 모니터링 | RNN / LSTM | 시간 흐름 추적 |
| TLS 핸드셰이크 분석 | CNN | 고정 길이 구조 패턴 |
| 봇 행동 탐지 | RNN | 반복 주기, 시퀀스 이상 |
| 암호화 트래픽 분류 | CNN + LSTM | 패킷 구조 + 흐름 동시 필요 |
| 로그 이상 탐지 | RNN | 시간 순서 기반 이벤트 흐름 |
한계도 알아야 한다
CNN과 RNN 기반 보안 시스템의 현실적 한계가 있다.
첫째, 오탐(False Positive)이다. 정상 트래픽을 공격으로 분류하면 서비스가 막힌다. 실무에서는 임계값을 보수적으로 잡고 규칙 기반과 병행한다.
둘째, 적대적 공격에 취약하다. 공격자가 모델을 알면 탐지를 우회하도록 트래픽을 조작할 수 있다. 이를 Adversarial Attack이라 한다.
셋째, 설명 가능성이 낮다. "왜 이게 공격입니까?"에 답하기 어렵다. 보안 감사나 규정 대응 시 문제가 된다.
그래서 현장에서는 단독으로 쓰지 않는다. Snort 같은 시그니처 기반 IDS 위에 ML 레이어를 얹는 하이브리드 구조가 표준이다.
마무리
CNN은 "이 데이터 안에 이런 패턴이 있다"를 찾고, RNN은 "이 데이터가 시간이 지나면서 이렇게 변했다"를 추적한다. 네트워크 보안은 이 두 가지 관점이 모두 필요한 영역이다.
HTTPS 트래픽이 암호화돼도, TLS 핸드셰이크가 표준을 따라도, 공격 패턴은 반드시 흔적을 남긴다. CNN과 RNN은 그 흔적을 잡는 도구다.
'AI 엔지니어준비' 카테고리의 다른 글
| 한때 썼던 Spring, 다시 처음부터 정리했다 (0) | 2026.04.14 |
|---|---|
| Claude Code 컨텍스트 구조를 갈아엎은 이유 (0) | 2026.04.13 |
| 뉴스 API 바꾸고, AI로 요약하고, 배포 플랫폼까지 변경했다. (0) | 2026.04.08 |
| Claude Code, 제대로 세팅하면 AI가 팀이 된다 (0) | 2026.04.07 |
| "신뢰감이 없어 보인다" — 피드백 하나로 Whalyx를 하루 만에 뜯어고쳤다 (0) | 2026.03.26 |