
VPN: 카페 와이파이에서 내 통장을 지키는 법
넷플릭스 국가 뚫는 용도가 전부는 아닙니다. 해커들이 우글거리는 공용 네트워크에서 '나만의 안전 터널'을 뚫는 기술.

넷플릭스 국가 뚫는 용도가 전부는 아닙니다. 해커들이 우글거리는 공용 네트워크에서 '나만의 안전 터널'을 뚫는 기술.
내 서버는 왜 걸핏하면 뻗을까? OS가 한정된 메모리를 쪼개 쓰는 처절한 사투. 단편화(Fragmentation)와의 전쟁.

미로를 탈출하는 두 가지 방법. 넓게 퍼져나갈 것인가(BFS), 한 우물만 팔 것인가(DFS). 최단 경로는 누가 찾을까?

프론트엔드 개발자가 알아야 할 4가지 저장소의 차이점과 보안 이슈(XSS, CSRF), 그리고 언제 무엇을 써야 하는지에 대한 명확한 기준.

이름부터 빠릅니다. 피벗(Pivot)을 기준으로 나누고 또 나누는 분할 정복 알고리즘. 왜 최악엔 느린데도 가장 많이 쓰일까요?

카페에서 "FREE_WiFi"에 접속해서 로그인을 하거나 계좌 이체를 하시나요? 나는 오랫동안 "HTTPS만 쓰면 안전하지 않나?"라고 막연하게 생각했다. 자물쇠 아이콘만 보면 믿었던 시절이 있었다. 그러다가 한 보안 개발자 친구가 내게 충격적인 말을 했다.
"공용 와이파이에서는 HTTPS도 100% 안전하지 않아. SSL Stripping 공격이나 DNS 스푸핑으로 뚫을 수 있거든."
그 말이 너무 무서워서 파고들기 시작했다. 같은 와이파이를 쓰는 해커가 중간자 공격(Man-in-the-Middle)으로 당신이 주고받는 데이터를 엿볼 수 있다는 사실을 받아들였다. 그때 알게 된 해답이 VPN(Virtual Private Network)이었다.
처음엔 VPN이 "인터넷 주소 바꾸는 도구" 정도로만 알았다. 넷플릭스 미국 콘텐츠 보려고 쓰는 거, 중국에서 구글 접속하는 거. 맞긴 한데, 그게 전부가 아니었다. VPN의 본질은 암호화된 터널을 뚫는 기술이다.
내가 인터넷을 쓴다는 건 투명한 유리관 안으로 데이터를 흘려보내는 것과 같다. 누가 봐도 다 보인다. 하지만 VPN을 켜는 순간, 그 유리관 안에 불투명한 금속 파이프가 하나 더 생긴다. 그 파이프 안으로만 데이터가 흐른다. 밖에서는 아무것도 볼 수 없다.
이 비유가 와닿았다. VPN은 "가상의 사설망"이라는 번역보다, "내가 만든 비밀 통로"라고 이해하는 게 훨씬 직관적이었다.
VPN의 핵심 개념은 터널링(Tunneling)이다. 나는 처음에 이걸 "데이터를 암호화한다"는 뜻으로만 이해했는데, 실제로는 데이터 패킷을 한 번 더 포장하는 기술이다.
일반 인터넷 통신은 이렇게 생겼다:
[내 PC] → [데이터 패킷] → [공유기] → [인터넷] → [목적지 서버]
VPN을 쓰면 이렇게 바뀐다:
[내 PC] → [암호화된 VPN 패킷 (안에 원본 패킷 숨김)] → [VPN 서버] → [복호화] → [목적지 서버]
원본 패킷을 VPN 패킷 안에 캡슐화(Encapsulation)하는 거다. 마치 우편물을 다시 택배 박스에 넣는 것처럼. 해커가 공유기를 해킹해서 패킷을 가로채도, 겉포장만 보이고 안에 뭐가 들었는지는 알 수 없다.
내가 직접 패킷을 캡처해본 적이 있다. Wireshark로 VPN 없이 웹사이트 접속하면 HTTP 헤더가 다 보였다. 하지만 VPN을 켜고 똑같이 하니까, 패킷 내용이 전부 Encrypted Application Data로만 표시됐다. 이 순간 "아, 이게 터널링이구나" 하고 와닿았다.
VPN 프로토콜은 여러 종류가 있다. 나는 처음에 "다 똑같은 VPN 아닌가?" 했는데, 속도, 보안, 호환성이 천차만별이었다. 내가 정리한 방식은 이렇다.
Windows XP 시절부터 있던 고전 프로토콜. 설정이 쉽고 속도는 빠른데, 보안이 종이호일 수준이다. 128비트 암호화는 이미 수십 년 전에 뚫렸다. 지금은 아무도 안 쓴다. 만약 회사 VPN이 PPTP라면, IT 담당자에게 바로 따지는 게 맞다.
PPTP의 단점을 보완하려고 IPSec이라는 암호화 레이어를 덧붙인 방식이다. 보안은 괜찮은데, 패킷을 두 번 포장하다 보니 속도가 느리다. UDP 500, 4500 포트를 쓰는데, 방화벽이 막으면 연결이 안 된다. 나는 중국 출장 갔을 때 L2TP가 먹히지 않아서 포기한 경험이 있다.
오픈소스 VPN의 절대강자. SSL/TLS 암호화를 쓰고, TCP/UDP 둘 다 지원하고, 방화벽 우회도 잘된다. 설정 파일(.ovpn)을 받아서 연결하는 방식인데, 설정이 좀 복잡하다.
내가 처음 OpenVPN 서버를 직접 세웠을 때, 인증서(Certificate) 만드는 과정에서 삽질을 많이 했다. CA(Certificate Authority), 서버 인증서, 클라이언트 인증서를 각각 만들어야 했다.
# OpenVPN 설정 파일 예시
client
dev tun
proto udp
remote vpn.myserver.com 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client.crt
key client.key
cipher AES-256-CBC
auth SHA256
comp-lzo
verb 3
이 파일 하나로 모든 클라이언트가 VPN에 접속한다. 한 번 세팅하면 편한데, 처음에는 정말 어려웠다.
나는 WireGuard를 처음 써보고 "VPN이 이렇게 빠를 수도 있구나" 하고 충격받았다. 코드가 4,000줄밖에 안 된다. OpenVPN은 10만 줄이 넘는다. 코드가 적다는 건 보안 취약점도 적다는 뜻이다.
속도도 압도적이다. 내가 테스트했을 때, OpenVPN은 원래 인터넷 속도의 60% 정도 나왔는데, WireGuard는 90% 이상 나왔다. Kernel 레벨에서 동작하기 때문이다.
설정도 간단하다. 내가 실제로 쓴 WireGuard 서버 설정:
# /etc/wireguard/wg0.conf (서버)
[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = <서버_비밀키>
[Peer]
PublicKey = <클라이언트_공개키>
AllowedIPs = 10.0.0.2/32
클라이언트 설정도 비슷하게 심플하다:
# 클라이언트 설정
[Interface]
Address = 10.0.0.2/24
PrivateKey = <클라이언트_비밀키>
DNS = 1.1.1.1
[Peer]
PublicKey = <서버_공개키>
Endpoint = vpn.myserver.com:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
wg-quick up wg0 명령어 하나로 VPN이 올라간다. 연결 상태 확인도 wg show로 끝이다.
$ wg show
interface: wg0
public key: abcd1234...
private key: (hidden)
listening port: 51820
peer: efgh5678...
endpoint: 123.45.67.89:51820
allowed ips: 0.0.0.0/0
latest handshake: 45 seconds ago
transfer: 12.34 MiB received, 5.67 MiB sent
이 간결함이 너무 마음에 들었다. 요즘 내가 새로 VPN 세울 일이 있으면 무조건 WireGuard를 쓴다.
VPN을 쓰다 보면 "모든 트래픽을 VPN으로 보낼 거냐, 일부만 보낼 거냐" 선택이 필요하다. 이걸 Full Tunneling과 Split Tunneling이라고 부른다.
Full Tunneling은 내 모든 인터넷 트래픽이 VPN 서버를 거친다. 넷플릭스도, 유튜브도, 네이버도 전부. 보안은 최고지만, 속도가 느려지고 VPN 서버에 부하가 몰린다. 게다가 한국 사이트 접속할 때 미국 서버를 거쳐서 오히려 느려지는 웃픈 상황도 생긴다.
Split Tunneling은 특정 트래픽만 VPN으로 보낸다. 예를 들어, 회사 내부망(192.168.0.0/16)만 VPN으로 보내고, 나머지는 일반 인터넷으로 보내는 식이다.
나는 재택근무할 때 Split Tunneling을 쓴다. 회사 Admin 페이지, DB 접속은 VPN으로 하고, 유튜브나 넷플릭스는 일반 인터넷으로 본다. 설정은 WireGuard의 AllowedIPs에서 조절한다:
# Full Tunneling
AllowedIPs = 0.0.0.0/0
# Split Tunneling (회사망만)
AllowedIPs = 192.168.0.0/16, 10.0.0.0/8
이 차이 하나로 속도 체감이 완전히 달라진다.
VPN은 용도에 따라 두 가지로 나뉜다.
Remote Access VPN은 개인 기기(노트북, 스마트폰)가 회사망에 접속하는 방식이다. 재택근무자가 쓰는 전형적인 VPN이다. 나는 매일 아침 출근 대신 VPN 접속 버튼을 누른다. 이게 내 출근이다.
Site-to-Site VPN은 회사 본사와 지사를 연결하는 방식이다. 개인이 아니라 라우터끼리 VPN 터널을 만든다. 서울 본사와 부산 지사가 마치 같은 사무실처럼 네트워크를 공유한다. 예를 들어, 부산 지사 직원이 서울 본사 프린터로 출력할 수 있다. (물리적으로는 불가능하지만 네트워크상으로는 가능하다는 뜻)
나는 Site-to-Site VPN을 세팅해본 적이 있는데, 양쪽 라우터의 IP 대역이 겹치지 않게 설계하는 게 핵심이었다. 본사가 192.168.1.0/24를 쓰면, 지사는 192.168.2.0/24를 써야 한다. 안 그러면 라우팅 테이블이 꼬여서 난리가 난다.
클라우드로 인프라를 옮기면서 VPN도 클라우드 네이티브 방식으로 바뀌고 있다.
AWS VPC VPN은 내 온프레미스 서버(회사 사무실)와 AWS VPC(클라우드 네트워크)를 연결하는 서비스다. VPN Gateway를 만들고, Customer Gateway를 등록하고, VPN Connection을 생성하면 된다. IPSec 터널이 자동으로 생긴다.
내가 AWS VPN을 처음 세팅할 때 헷갈렸던 건, 두 개의 터널이 기본으로 생긴다는 점이었다. Tunnel 1, Tunnel 2. 이건 고가용성(High Availability)을 위한 거다. 하나가 죽어도 다른 하나가 살아있어서 서비스가 끊기지 않는다.
Azure VPN Gateway도 비슷하다. Point-to-Site(개인 접속), Site-to-Site(지사 연결) 둘 다 지원한다. 나는 Azure를 쓸 때, Basic SKU와 VpnGw1 SKU의 성능 차이에 놀랐다. Basic은 최대 10Mbps밖에 안 나오는데, VpnGw1은 650Mbps가 나온다. 가격은 몇 배 차이나지만, 프로덕션 환경에서는 Basic 쓰면 안 된다고 받아들였다.
VPN을 켜도 IP가 새는(Leak) 경우가 있다. 처음 알았을 때 "VPN 켰는데 소용없다고?" 하고 당황했다.
DNS Leak은 DNS 쿼리가 VPN 터널을 거치지 않고 ISP(인터넷 제공업체)로 바로 날아가는 현상이다. 예를 들어, 미국 VPN 서버에 접속했는데, DNS 요청은 한국 통신사로 가면, 내가 어떤 사이트를 방문했는지 통신사가 다 안다.
나는 dnsleaktest.com에서 테스트해봤다. VPN을 켰는데도 KT DNS 서버가 보였다. 충격이었다. 해결 방법은 VPN 설정에서 DNS 서버를 강제 지정하는 것이다.
# WireGuard DNS 설정
DNS = 1.1.1.1, 1.0.0.1
또는 시스템 DNS를 수동으로 Cloudflare(1.1.1.1)나 Google(8.8.8.8)로 바꿔도 된다.
WebRTC Leak은 더 교묘하다. 브라우저의 WebRTC 기능이 내 실제 로컬 IP를 노출시킨다. VPN으로 공인 IP는 숨겼는데, 192.168.x.x 같은 사설 IP가 새는 거다. 이것만으로도 내 위치를 추정할 수 있다.
나는 Chrome 확장 프로그램(WebRTC Leak Prevent)을 깔아서 막았다. Firefox는 about:config에서 media.peerconnection.enabled를 false로 바꾸면 된다.
"돈 안 내고 VPN 쓰면 안 될까?" 나도 처음엔 그랬다. 무료 VPN 앱을 깔아서 써봤다. 속도는 느렸지만, "공짜니까 참지 뭐" 했다.
그러다가 기사를 하나 봤다. 무료 VPN 앱 72%가 사용자 데이터를 추적한다는 연구 결과였다. VPN으로 데이터를 보호하려고 했는데, VPN 업체가 내 데이터를 팔아먹는다는 게 결국 이거였다.
무료 VPN의 수익 모델은 명확하다:
나는 지금 ExpressVPN 유료 요금제를 쓴다. 월 1만 원 정도 나가는데, 내 개인정보가 팔리는 것보다는 낫다고 받아들였다.
VPN을 쓰면 속도가 느려지는 건 어느 정도 당연하다. 암호화/복호화 오버헤드도 있고, VPN 서버를 한 번 더 거치니까. 하지만 MTU(Maximum Transmission Unit) 설정을 잘못하면 말도 안 되게 느려진다.
MTU는 한 번에 보낼 수 있는 패킷의 최대 크기다. 일반 이더넷은 1500바이트다. 그런데 VPN은 원본 패킷을 한 번 더 포장하니까, VPN 헤더 크기만큼 MTU를 줄여야 한다.
예를 들어, WireGuard는 헤더가 약 60바이트다. 그럼 MTU를 1440 정도로 설정해야 한다. 안 그러면 패킷이 중간에 쪼개지고(Fragmentation), 재조립하느라 속도가 떨어진다.
# WireGuard MTU 설정
[Interface]
MTU = 1420
나는 이걸 모르고 MTU 1500으로 VPN을 썼다가, 특정 사이트가 느린 이유를 한참 찾았다. MTU를 1420으로 낮추니까 바로 해결됐다. 이 경험이 와닿아서, 지금은 VPN 세팅할 때 MTU를 제일 먼저 확인한다.
요즘은 "VPN 없이 보안을 강화하는 방법"도 나오고 있다. 바로 ZTNA(Zero Trust Network Access)다.
전통적인 VPN은 "일단 VPN에 접속하면 모든 내부망에 접근 가능"이라는 방식이다. 성 안에 들어오면 모든 방을 돌아다닐 수 있는 것처럼. 하지만 ZTNA는 "아무도 믿지 않는다"는 철학이다. VPN에 접속했어도, 각 리소스마다 권한을 다시 확인한다.
예를 들어, 나는 회사 DB에 접속할 권한이 있지만, HR 시스템에는 권한이 없다. ZTNA는 내가 DB에 접속하려고 할 때마다 "진짜 이 사람 맞아?"를 다시 물어본다. 기기 인증, 위치 확인, 행동 패턴 분석까지 한다.
나는 ZTNA를 "VPN의 진화형"이라고 받아들였다. Cloudflare Zero Trust, Zscaler 같은 서비스가 대표적이다. 설정은 VPN보다 복잡하지만, 보안 수준은 훨씬 높다.
이론만 알고 실천 안 하면 의미가 없다. 나는 지금 이렇게 VPN을 쓰고 있다:
자가 호스팅 WireGuard 서버는 한 달에 5달러짜리 EC2로 충분하다. 설치도 간단하다:
# Ubuntu 22.04 기준
sudo apt update
sudo apt install wireguard
# 키 생성
wg genkey | tee privatekey | wg pubkey > publickey
# 설정 파일 작성 (위에 예시 참고)
sudo nano /etc/wireguard/wg0.conf
# 방화벽 오픈
sudo ufw allow 51820/udp
# VPN 시작
sudo wg-quick up wg0
# 부팅 시 자동 시작
sudo systemctl enable wg-quick@wg0
이렇게 세팅하면, 내 스마트폰에서도 WireGuard 앱으로 접속할 수 있다. 공항 와이파이든, 호텔 와이파이든 안심하고 쓴다.
다시 처음 질문으로 돌아가자. "스타벅스 와이파이는 안전할까?"
답은 "아니다"다. 공용 와이파이는 투명한 버스다. 누가 봐도 다 보인다. HTTPS가 있어도, DNS 스푸핑, SSL Stripping, Rogue AP(가짜 공유기) 같은 공격에는 취약하다.
VPN은 그 투명한 버스 안에 썬팅된 방탄차를 하나 더 넣는 거다. 밖에서는 안이 안 보이고, 총을 쏴도 뚫리지 않는다. 완벽한 건 아니지만, 최소한의 방어막은 된다.
나는 지금 카페에서 일할 때, VPN을 켜지 않으면 불안하다. 은행 앱을 열거나, AWS 콘솔에 로그인하거나, 회사 어드민 페이지를 들어갈 때는 무조건 VPN을 켠다. 이게 습관이 됐다.
VPN은 단순히 넷플릭스 국가 우회나 중국 방화벽 뚫는 도구가 아니다. 공용 네트워크에서 나를 지키는 최소한의 방탄조끼다.
내가 받아들인 핵심은:
결국, VPN은 "돈 아까워서 안 쓴다"가 아니라 "보안 비용으로 투자한다"고 생각을 바꿔야 한다. 내 통장이 털리는 것보다는 월 1만 원이 훨씬 싸다.