안전해 보이던 binding 을 노출된 것으로 바꿔놓는, 제 발등 찍는 함정 셋. 셋 다 조용해. 벌어져도 알려주는 게 없어.
Gotcha 1 — IPv6 쌍둥이
127.0.0.1 (IPv4 loopback) 으로 bind 했어. 안전하겠지? 아마도. 근데 IPv6 stack 은 자기만의 loopback (::1) 과 자기만의 "모든 interface" (::) 를 따로 갖고 있어. 일부 서버는 양쪽 stack 다 listen 이 기본. IPv6 binding 이 :: 인데 IPv4 는 127.0.0.1 이면 알아채지 못한 public IPv6 leak 있는 거.
Gotcha 2 — 라우터의 UPnP
Universal Plug and Play 를 켜두면 LAN 안의 디바이스가 라우터한테 "이 포트 좀 열어줘" 하고 자동으로 부탁할 수 있어. 대부분 컨슈머 라우터 기본 켜짐. 잘못 동작하는 앱, 토렌트 클라이언트, 게임이 조용히 public 포트 열 수 있어.
Gotcha 3 — "192.168.x.x bind" 거짓말
서비스한테 "192.168.1.42 만 bind 해" 가 0.0.0.0 보다 안전하게 느껴져. 맞긴 한데, 아주 조금만 그래.
- 나중에 public Wi-Fi 에 같은 DHCP IP 받으면 서비스가 여전히 응답 — 그 Wi-Fi 의 다른 사람한테.
- LAN 에 untrusted 디바이스 (손님, IoT, 룸메이트) 있으면 서비스 도달 가능.
- IP 가 바뀌면 (DHCP 갱신) 서비스가 listen 을 멈추고, 넌 "앱이 고장났다" 며 디버깅을 시작하지.
Gotcha 4 — 네 대신 0.0.0.0 으로 bind 하는 reverse proxy
앱이 127.0.0.1 로 bind 하게 설정. 그다음 nginx / Caddy 를 앞에 둠. nginx 가 뭐 bind 하는지 확인했어? 기본값이 0.0.0.0:80, 0.0.0.0:443 이야. 앱을 좁게 묶어놨는데 앞에 선 proxy 가 그걸 통째로 우회해버려. reverse proxy 에도 binding 을 따로 명시해야 해.