16강 / 20강

세상에 내보내기 — NAT · CDN · 터널

사무실 구석의 서버를 전 세계에 여는 법

세상에 내보내기 — NAT · CDN · 터널
공유기 뒤의 서버 한 대를 전 세계가 볼 수 있게 만드는 세 가지 방법.

우리 서버는 192.168.10.10, 사설 IP입니다(3강). 인터넷에서는 이 주소로 찾아올 수 없어요. 그런데 어떻게 손님이 들어올까요?

NAT — 공유기의 주소 바꿔치기

공유기는 공인 IP를 하나 가지고 있습니다. 안쪽 장비들이 밖으로 나갈 때 공유기가 출발지 주소를 자기 것으로 바꿔치기 하고, 답장이 오면 원래 장비에게 돌려줍니다. 이것이 NAT예요.

192.168.10.10:51422
▶ 공유기 ▶
203.0.113.7:40001
▶
인터넷

여기서 문제가 생깁니다. 나가는 것은 되는데 들어오는 것은 안 됩니다. 바깥에서 203.0.113.7:80 을 두드리면 공유기는 "이걸 안쪽 누구에게 줘야 하지?" 를 알 수 없어요.

해결 ① 포트포워딩

공유기에게 미리 알려 두면 됩니다. "80번으로 오는 것은 192.168.10.10 에게 줘." 이것이 포트포워딩입니다.

배포 실험실 — DNS·NAT·프록시·SSL 조합을 바꿔 가며 손님이 되어 보세요
불러오는 중…

해결 ② 터널 — 안에서 밖으로 먼저 연결하기

NAT의 성질을 거꾸로 이용하는 방법입니다. 나가는 연결은 언제나 허용되니까, 우리 서버가 먼저 밖으로 연결을 걸어 그 통로를 계속 붙잡고 있으면 됩니다.

cloudflared tunnel --url http://localhost:80

그러면 Cloudflare가 손님의 요청을 그 통로로 밀어 넣어 줍니다. 열린 포트도, 공인 IP도, 공유기 설정도 필요 없어요. CGNAT에서도 동작합니다.

해결 ③ CDN — 전 세계에 복사본 두기

부산 손님이 서울 서버의 상품 사진을 받는 데 30ms가 걸린다면, 도쿄 손님은 100ms, 뉴욕 손님은 250ms가 걸립니다. 빛의 속도는 못 이깁니다.

CDN은 전 세계 수백 곳에 복사본을 미리 뿌려 둡니다. 뉴욕 손님은 뉴욕 서버에서 사진을 받아요. 우리 서버까지 오지 않습니다.

정적 파일이미지·CSS·JSCDN이 캐시 ○
상품 목록자주 안 바뀜짧게 캐시 △
장바구니·결제사람마다 다름캐시 절대 ×

쇼핑몰에서 CDN을 켤 때 가장 위험한 실수가 이겁니다. 장바구니 페이지를 캐시하면 다른 손님의 장바구니가 보입니다. 로그인 상태 페이지는 반드시 Cache-Control: private, no-store 를 붙이세요.

위젯에서 프록시를 켠 뒤 결과가 어떻게 바뀌는지 보세요.
💻 손님 노트북 브라우저 안에서 실행 (계산용)

Cloudflare SSL 모드 네 가지

모드손님↔CFCF↔우리 서버평가
Off평문평문쇼핑몰에서는 불가
Flexible🔒 암호화평문손님은 자물쇠를 보지만 뒷구간은 노출
Full🔒🔒 (인증서 검증 안 함)낫지만 중간자 공격에 취약
Full (strict)🔒🔒 (검증함)✔ 정답

Flexible 이 특히 위험합니다. 손님 브라우저에는 자물쇠가 보여서 안전하다고 착각하게 만들거든요. 실제로는 Cloudflare에서 우리 서버까지가 평문입니다.

🤔 확인 문제
공유기 WAN IP가 100.64.3.11 입니다. 포트포워딩을 해도 외부 접속이 안 되는 이유는?
🤔 확인 문제
Cloudflare SSL 모드를 Flexible 로 두면 무엇이 문제인가요?