포트 스캔은 누구나 “정찰”이라고 부르는 법을 처음 배우는 대상이다. nmap을 IP에 겨누고, 열린 포트 목록을 얻으면, 그걸로 타깃을 매핑했다고 친다. 모든 튜토리얼, 모든 CTF 라이트업, 모든 모의해킹 체크리스트의 첫 수다.
불편한 지점은 여기다. 2026년에 전형적인 프로덕션 타깃을 풀 스캔하면 결과는 보통 이렇게 읽힌다: 443 열림, 나머지는 침묵. 이 호스트가 HTTPS를 말하고 방화벽 뒤에 있다는 걸 알아냈다. 스캔 시작 전에 이미 둘 다 알던 사실이다. 진짜 정찰은 완전히 다른 데서 일어났고, 타깃에 패킷 한 개도 보내지 않았다.
SYN 스캔이 실제로 묻는 것
고전적인 스캔이 뭘 하는지부터 보자. 현대의 무용함이 숨어 있는 곳이 바로 이 동작 원리다.
TCP SYN 스캔 — nmap의 -sS, “half-open” 스캔 — 은 포트에 SYN 패킷 하나만 보내고 응답을 지켜본다. RFC 793에 정의된 TCP 상태 머신이 답을 세 가지로 준다. SYN/ACK가 오면 뭔가 듣고 있다는 뜻: 포트는 open이고, nmap은 핸드셰이크를 완성하기 전에 RST로 연결을 끊는다(그래서 “half-open”). RST가 오면 아무도 없다는 뜻: 포트는 closed지만 호스트는 살아 있고 그 스택이 정직하게 그렇다고 말해준다. 그리고 세 번째 답은 답이 아예 없는 것 — 침묵이다.
그 침묵이 현대 스캔의 전부다. nmap이 아무것도 못 받으면 포트는 filtered다: 방화벽, ACL, 또는 클라우드 security group이 프로브를 먹어치우고 아무 말도 안 한 것이다. nmap은 그 필터 뒤에서 뭔가 듣고 있는지 알려줄 수 없다. 필터의 임무 자체가 바깥에서 볼 때 open과 closed를 똑같이 보이게 만드는 거니까.
nmap이 실제로 인식하는 상태는 여섯 가지다 — open, closed, filtered, unfiltered, 그리고 얼버무리는 두 상태 open|filtered와 closed|filtered. 이 얼버무림이 존재한다는 게 힌트다. 현대 인터넷에서 정직한 RST가 사라지고 있기 때문에 생긴 상태들이다. 잘 설정된 호스트는 예전엔 closed 포트로의 연결을 *거부(reject)*했다. 이제는 버린다(drop). 일부러 열지 않은 모든 포트가, 일부러 열지 않은 다른 모든 포트와 정확히 똑같아 보인다: 침묵. 65,535개 포트를 스캔하고, 이미 DNS에 광고돼 있던 그 하나를 알게 된다.
클라우드가 “호스트”를 삼켰다
더 깊은 문제는, 당신이 스캔하는 대상이 더 이상 머신이 아니라는 것이다.
포트 스캔이 명성을 얻던 시절엔 IP가 곧 서버였다. 스캔하면 그 상자의 실제 리스닝 서비스가 보였다 — 22번의 SSH, 5432번의 데이터베이스, 8080번의 잊힌 관리자 패널. 포트 목록은 머신 하나의 공격 표면을 진짜로 담은 재고 목록이었다.
이제 현대 웹 자산 뒤의 IP에 스캐너를 겨누면, 당신이 때리는 건 로드밸런서, CDN 엣지 노드, 또는 서로 무관한 수천 개 테넌트를 앞단에서 받는 클라우드 ingress다. 443이 열린 건 엣지가 443에서 TLS를 종료하기 때문이다 — 모두를 위해. 뒤에 뭐가 있는지는 전혀 알려주지 않는다. 뒤에 뭐가 있는지는 포트가 아니라 TLS 핸드셰이크의 SNI 필드와 HTTP 요청의 Host 헤더가 고르니까. 같은 IP가 어떤 호스트명을 묻느냐에 따라 서로 다른 오리진 천 개를 서비스한다. 포트는 주소가 아니라 로비다.
그러니 포트 스캔이 드러내는 “공격 표면”은 CDN의 표면이고, 그건 수백만 사이트가 공유하며, 하드닝이 사업 전부인 회사가 단단히 막아놓은 것이다. 데이터베이스는 이제 스캔 가능한 포트에 없다. 공개 IP가 아예 없는 사설 서브넷에, 당신의 SYN 패킷이 결코 들어갈 수 없는 VPC 안에서만 닿을 수 있는 곳에 있다. 포트 스캔은 흥미로운 서비스가 공개 IP에 살던 세상을 위해 만들어졌다. 그 세상은 대체로 사라졌다.
스캔은 무한히 빨라졌고, 그게 무가치하게 만들었다
이상한 반전: 스캔이 덜 유용해진 바로 그 순간에 스캔 기술은 극적으로 좋아졌다.
2013년 ZMap이라는 도구는 공개 IPv4 주소 공간 전체 — 라우팅되는 약 37억 개 주소 — 를 머신 한 대로 한 시간 안에, 10기가비트 링크로는 몇 분 안에 스캔할 수 있음을 보였다. masscan은 자체 비동기 엔진으로 초당 수백만 패킷을 쏘며 같은 주장을 했다. 인터넷 전체, 포트 하나, 커피 한 잔 시간.
이러면 스캔이 더 강력해질 것 같지만, 정반대다. 인터넷 전체를 상시 스캔할 수 있게 되는 순간, 당신이 그걸 스캔하는 데는 정찰 가치가 없다. Shodan(2009)과 Censys(2015, ZMap 연구진이 만듦) 같은 서비스가 이미 하고 있다 — 모든 주소, 모든 흔한 포트를 훑고, 배너를 잡고, TLS 지문을 뜨고, 결과를 24시간 갱신되는 검색 가능한 데이터베이스로 색인한다. 타깃에 뭐가 노출됐는지 알고 싶으면, 스캔해서 스스로를 광고하지 않는다. 어젯밤에 (다른 모든 것과 함께) 그걸 스캔해 둔 데이터베이스에 쿼리한다. 정찰이 능동 프로브에서 조회로 옮겨갔고, 그 조회는 손으로 돌리는 무엇보다 빠르고, 조용하고, 완전하다.
IPv6는 스윕을 통째로 부순다
클라우드가 포트 스캔을 강등했다면, IPv6는 그 발견 기능 절반을 조용히 죽이고 있다.
발견 수단으로서의 스캔이 깔고 있는 핵심 가정은 주소 범위를 열거할 수 있다는 것이다. IPv4에선 감당된다 — /24는 256개 호스트, 인터넷 전체가 40억 미만. IPv6는 /64를 표준 서브넷 크기로 나눠준다. 2^64 주소 — 약 1,800경 개 — 가 서브넷 하나에 들어 있다. /64는 ping 스윕이 불가능하다. 초당 10억 개 주소를 스캔해도 서브넷 하나에 500년이 넘게 걸린다. 무작위 IPv6 주소를 가진 머신은 방화벽 뒤에 숨은 게 아니라 산수 뒤에 숨은 것이다.
즉 IPv6 세상에선 스캔으로 호스트를 찾는 게 근본적으로 불가능하다. 어디 있는지 누가 알려줘야 한다. 그리고 인터넷은 기꺼이 알려준다 — DNS 레코드로, 인증서가 발급되는 순간 모든 호스트명을 공개하는 Certificate Transparency 로그로, 서비스가 존재함으로써 흘리는 메타데이터로. 정찰의 발견 계층은 이미 그 수동적 소스들로 옮겨갔다. 주소 공간이 감당 안 될 때 규모를 감당하는 건 그것뿐이니까.
그럼 아직 쓸모는 뭔가
nmap을 지우라는 얘기는 아니다. 포트 스캔은 죽지 않았다. 발견에서 확인으로 강등됐을 뿐이고, 그건 진짜 역할이다.
특정 호스트를 이미 알고 있고 그게 실제로 뭘 노출하는지 확인하고 싶을 때 — 그건 돌릴 가치가 있는 스캔이다. 내 공격 표면을 감사하는 것, 실수로 열어둔 포트, 프로덕션에 딸려간 디버그 서비스, 내부용이어야 했던 관리 인터페이스를 찾는 것 — 이게 오늘날 스캐너의 최선의 용도다. 내가 소유한 인프라를 겨누고 정확한 질문을 던지는 거니까. 범위 전체의 RST-대-침묵 패턴에서 방화벽 규칙을 추론하는 것도 여전히 된다. 방금 잠근 게 정말 잠겼는지 검증하는 것도 여전히 된다.
안 되는 건 포트 스캔을 타깃을 발견하는 방법으로 취급하는 것이다. 그 지도는 이미 그려져 있다 — 인터넷 전체를 상시 스캔하는 서비스들이, 그리고 호스트가 온라인에 올라오는 순간 공짜로 모두를 광고하는 DNS와 인증서가. 2026년 정찰의 첫 단계는 nmap이 아니다. 쿼리다. nmap은 어디를 겨눌지 이미 알고 난 뒤에 집어드는 도구다.