netstat -ano 를 쳐 본 사람은 안다. 화면을 가득 채우는 숫자 가운데 내가 연 기억이 있는 포트는 거의 없다. 이 연재에서 프로그램을 하나씩 열 때마다 "127.0.0.1 의 몇 번 포트를 열고 있었다"는 문장이 따라 나왔다. 이번에는 그 포트들을 한자리에 모아 보았다. 모아 놓고 보니 주소가 두 종류였다.

포트와 프로세스를 한 번에 잇기

netstat 은 프로세스 번호(PID)까지만 보여 준다. PowerShell 의 Get-NetTCPConnection 에 프로세스 이름을 붙이면 누가 어떤 포트를 열었는지 한 번에 읽힌다. 관리자 권한 없이도 된다.

$names = @{}
Get-Process | ForEach-Object { $names[$_.Id] = $_.ProcessName }

Get-NetTCPConnection -State Listen |
    Where-Object LocalAddress -in '127.0.0.1', '0.0.0.0' |
    Select-Object LocalAddress, LocalPort,
        @{ n = 'Process'; e = { $names[[int]$_.OwningProcess] } } |
    Sort-Object LocalPort

결과에는 Windows 자체 서비스와 개발 도구가 연 포트도 섞여 나온다. 그중 금융·공공 보안 프로그램의 것만 추린 것이 아래 표다. 편 번호가 없는 네 줄(SignKorea, KICA, CrossCert, ExEcm)은 본편에서 다루지 않은 인증서 프로그램으로, 22~25편 번외에서 따로 본다.

주소 포트 프로세스 프로그램
127.0.0.1 47317, 47337 raonk.exe RAON K (3편)
127.0.0.1 16106, 16116 veraport-x64.exe Veraport (4편)
127.0.0.1 16107, 16117 delfino.exe Delfino G3 (4편)
127.0.0.1 42235 MagicLine4NX.exe MagicLine4NX (12편)
127.0.0.1 10530, 10531 AnySign4PC.exe AnySign4PC (13편)
127.0.0.1 31026, 31027 AnySign4PCLauncher.exe AnySign4PC (13편)
127.0.0.1 34581 CrossEXService.exe CrossEX (14편)
127.0.0.1 14098 SKCertService.exe 코스콤 SignKorea
127.0.0.1 14315, 14319 kpmcnt.exe 한국정보인증(KICA) 폴더의 프로그램
0.0.0.0 55920 StSess.exe AhnLab Safe Transaction (1편)
0.0.0.0 14430, 14440 nosstarter.npe nProtect Online Security (10편)
0.0.0.0 21300 I3GProc.exe IPinside LWS Agent (11편)
0.0.0.0 15018 UniCRSLocalServer.exe 한국전자인증 CrossCert UniCRS
0.0.0.0 18181, 18281 ExECM.exe CoreB2B ExEcm

StSess.exe 의 55920 은 49152 이상의 동적 범위라 재부팅하면 번호가 바뀔 수 있다. 나머지는 프로그램마다 정해 둔 번호로 보인다. AnySign4PC 는 시작 프로그램 명령에 port=10530;port_s=10531 을 인수로 적어 둘 만큼 번호가 고정되어 있었다.

127.0.0.1 과 0.0.0.0 은 무엇이 다른가

127.0.0.1 은 자기 자신을 가리키는 주소다. 이 주소에서 기다리는 프로그램에는 같은 PC 안에서만 접속할 수 있다. 같은 공유기에 물린 다른 PC 나 휴대폰이 이 포트를 두드려도 닿지 않는다. 웹 페이지와 PC 프로그램을 잇기만 하면 되는 보안 프로그램이라면 이쪽이 자연스럽다.

0.0.0.0 에서 기다린다는 것은 "이 PC 의 모든 네트워크 주소에서 받겠다"는 뜻이다. 127.0.0.1 은 물론이고 공유기가 준 사설 주소, 회사망이나 카페 와이파이에서 받은 주소로 들어오는 연결도 받는다. 그 연결을 실제로 통과시킬지는 Windows 방화벽이 정한다.

그래서 0.0.0.0 쪽 다섯 프로그램은 방화벽 규칙을 따로 확인했다. 이 PC 의 방화벽은 도메인·개인·공용 프로필 모두 켜져 있고, 들어오는 연결의 기본 동작은 차단이다. 그런데 다섯 프로그램 모두에 "들어오는 연결 허용" 규칙이 있었다.

Get-NetFirewallApplicationFilter |
    Where-Object Program -match 'INCA|IPinside|AhnLab|CoreB2b|Crosscert' |
    Get-NetFirewallRule |
    Where-Object Direction -eq Inbound |
    Select-Object DisplayName, Action, Enabled, Profile

nProtect Online Security Starter, Interezen Process, AhnLab Safe Transaction 세 규칙은 프로필이 Any, 포트와 원격 주소도 제한이 없었다. UniCRSLocalServer 와 ExECM 은 개인·공용 프로필에 TCP·UDP 규칙이 하나씩 있었다. 뒤의 둘은 처음 실행할 때 뜨는 "방화벽 액세스 허용" 창에서 허용을 눌렀을 때 생기는 모양과 같아 보인다. 어느 쪽이든 설정만 보면 같은 네트워크의 다른 기기가 이 포트에 연결할 수 있는 상태다.

여기서 확인하지 못한 것도 분명히 적어 둔다. 다른 기기에서 실제로 이 포트에 접속해 보지는 않았고, 접속했을 때 프로그램이 무엇에 응답하는지도 모른다. 프로그램이 외부 연결을 스스로 걸러 낼 수도 있다. 다만 집 밖의 공용 와이파이에서 노트북을 쓰는 사람이라면, 쓰지 않는 프로그램이 모든 주소에서 문을 열고 있고 방화벽이 그 문을 열어 두었다는 사실은 알고 있는 편이 좋다.

웹 페이지가 로컬 프로그램을 부르는 방식

포트를 여는 이유는 대부분 같다. 은행이나 공공기관 페이지의 스크립트가 브라우저 안에서 할 수 없는 일, 예를 들어 공동인증서 파일을 읽어 서명하거나 키보드 입력을 보호하거나 PC 의 네트워크 정보를 읽는 일을 PC 프로그램에 맡기기 위해서다. 페이지는 https://127.0.0.1:16107 같은 주소로 요청을 보내거나 웹소켓을 열고, 프로그램이 답을 돌려준다.

페이지가 https 이므로 로컬 프로그램도 https 로 답해야 브라우저가 막지 않는다. 그래서 앞 편에서 본 루트 인증서가 필요하다. 16106 번 포트에 TLS 로 붙었을 때 Veraport-CA 가 발급한 CN=127.0.0.1 인증서가 돌아온 것이 그 예다. SignKorea 의 14098 과 ExEcm 의 18281 에서도 같은 방식으로 CN=127.0.0.1 인증서가 돌아왔다(22·25편). 나머지 포트는 단순한 TLS 접속으로는 인증서를 받아 내지 못했다. 웹소켓 경로나 정해진 첫 요청을 보내야 응답하는 방식으로 보인다.

프로그램이 꺼져 있을 때는 다른 길을 쓴다. 4편의 위즈베라처럼 wizvera-delfino-pc:// 같은 전용 주소 형식을 등록해 두면, 페이지가 이 주소를 여는 것만으로 PC 프로그램을 깨울 수 있다. 브라우저가 "이 앱을 여시겠습니까" 하고 묻는 창이 그것이다. 깨어난 프로그램이 포트를 열면 그다음부터는 위의 방식으로 대화한다.

최근 브라우저들은 공용 인터넷의 페이지가 사설 주소나 127.0.0.1 로 요청하는 것을 더 엄격하게 다루는 쪽으로 바뀌고 있는 것으로 알려져 있다. 이런 프로그램들이 앞으로 어떤 방식으로 바뀔지는 지켜볼 일이다.

포트를 보고 할 수 있는 일

이 표는 정리할 때 쓸모가 있다. 설치된 앱 목록에서 프로그램을 지운 뒤 위 PowerShell 을 다시 돌려, 그 프로그램의 포트가 사라졌는지 보면 제거가 제대로 됐는지 알 수 있다. 포트가 남아 있다면 서비스나 시작 프로그램이 아직 프로세스를 띄우고 있다는 뜻이다. 반대로 모르는 프로세스가 포트를 열고 있다면 Get-Process -Id <PID> | Select-Object Path 로 파일 위치부터 확인한다. 보호된 프로세스는 경로가 비어 나올 수 있는데, 그때는 서비스 목록이나 시작 프로그램 명령에서 같은 이름을 찾으면 된다.

이 프로세스들은 PC 가 켜질 때마다 저절로 뜬다. 다음 편에서는 그렇게 늘 떠 있게 만드는 네 가지 방법, 서비스·Run 키·예약 작업·커널 드라이버를 지도로 그려 본다.