세상에 내보내기 — NAT · CDN · 터널
사무실 구석의 서버를 전 세계에 여는 법
우리 서버는 192.168.10.10, 사설 IP입니다(3강).
인터넷에서는 이 주소로 찾아올 수 없어요. 그런데 어떻게 손님이 들어올까요?
NAT — 공유기의 주소 바꿔치기
공유기는 공인 IP를 하나 가지고 있습니다. 안쪽 장비들이 밖으로 나갈 때 공유기가 출발지 주소를 자기 것으로 바꿔치기 하고, 답장이 오면 원래 장비에게 돌려줍니다. 이것이 NAT예요.
여기서 문제가 생깁니다. 나가는 것은 되는데 들어오는 것은 안 됩니다.
바깥에서 203.0.113.7:80 을 두드리면 공유기는
"이걸 안쪽 누구에게 줘야 하지?" 를 알 수 없어요.
해결 ① 포트포워딩
공유기에게 미리 알려 두면 됩니다. "80번으로 오는 것은 192.168.10.10 에게 줘." 이것이 포트포워딩입니다.
해결 ② 터널 — 안에서 밖으로 먼저 연결하기
NAT의 성질을 거꾸로 이용하는 방법입니다. 나가는 연결은 언제나 허용되니까, 우리 서버가 먼저 밖으로 연결을 걸어 그 통로를 계속 붙잡고 있으면 됩니다.
cloudflared tunnel --url http://localhost:80
그러면 Cloudflare가 손님의 요청을 그 통로로 밀어 넣어 줍니다. 열린 포트도, 공인 IP도, 공유기 설정도 필요 없어요. CGNAT에서도 동작합니다.
해결 ③ CDN — 전 세계에 복사본 두기
부산 손님이 서울 서버의 상품 사진을 받는 데 30ms가 걸린다면, 도쿄 손님은 100ms, 뉴욕 손님은 250ms가 걸립니다. 빛의 속도는 못 이깁니다.
CDN은 전 세계 수백 곳에 복사본을 미리 뿌려 둡니다. 뉴욕 손님은 뉴욕 서버에서 사진을 받아요. 우리 서버까지 오지 않습니다.
쇼핑몰에서 CDN을 켤 때 가장 위험한 실수가 이겁니다.
장바구니 페이지를 캐시하면 다른 손님의 장바구니가 보입니다.
로그인 상태 페이지는 반드시 Cache-Control: private, no-store 를 붙이세요.
Cloudflare SSL 모드 네 가지
| 모드 | 손님↔CF | CF↔우리 서버 | 평가 |
|---|---|---|---|
| Off | 평문 | 평문 | 쇼핑몰에서는 불가 |
| Flexible | 🔒 암호화 | 평문 | 손님은 자물쇠를 보지만 뒷구간은 노출 |
| Full | 🔒 | 🔒 (인증서 검증 안 함) | 낫지만 중간자 공격에 취약 |
| Full (strict) | 🔒 | 🔒 (검증함) | ✔ 정답 |
Flexible 이 특히 위험합니다. 손님 브라우저에는 자물쇠가 보여서 안전하다고 착각하게 만들거든요. 실제로는 Cloudflare에서 우리 서버까지가 평문입니다.
100.64.3.11 입니다. 포트포워딩을 해도 외부 접속이 안 되는 이유는?100.64.0.0/10 은 통신사가 CGNAT에 쓰는 대역입니다. 공유기 자체가 공인 IP를 못 받았으니 열어 줄 문이 없어요. cloudflared 같은 터널이 유일한 해법입니다.