Windows에서 포트 80을 점유하는 PID=4(System) 문제 해결 방법

Windows에서 개발을 하다 보면 예상치 못한 문제와 종종 마주하게 되죠. 특히 Tomcat 같은 웹 서버를 실행하려 할 때, 포트 80이 이미 사용 중이라며 서버가 실행되지 않는 경우가 있어요. 처음엔 단순한 충돌이겠거니 생각했는데, netstat -ano로 확인해보면 포트 80을 점유한 PID가 ‘4’번인 경우가 대부분이더라고요. 이게 바로 System 프로세스예요. 처음엔 이게 뭔가 싶었는데, 저도 꽤나 헤맸어요.

특히 포트 80을 쓰고 있는 게 ‘System’이라니… 이걸 꺼도 되는 건지, 뭐가 충돌나진 않을지 걱정이 앞서더라고요. 근데 걱정마세요. 해결책이 분명히 있어요. 제가 하나하나 짚어드릴게요.

아마도 이 문제, 저처럼 Tomcat 같은 서버를 로컬에서 테스트하려다 겪는 분들 많을 텐데요—포트 80은 HTTP의 기본 포트라 많이 사용되다 보니 충돌도 잦아요. 특히 Windows는 HTTP.sys라는 시스템 서비스가 포트 80을 먼저 잡고 있을 때가 많거든요.

그럼, 지금부터 차근차근 그 포트를 점유한 System 프로세스를 확인하고 해결하는 방법을 알려드릴게요.


1. 포트 80을 점유 중인 프로세스 확인하기

먼저 포트 80을 점유 중인 프로세스를 확인해야 해요. 명령 프롬프트(cmd)를 관리자 권한으로 실행하고 다음 명령어를 입력해보세요.

netstat -ano | findstr :80

이 명령어를 실행하면 포트 80을 사용 중인 프로세스의 PID가 나올 거예요. 대부분 PID=4가 뜰 텐데요, 이건 ‘System’이라는 Windows 핵심 프로세스가 해당 포트를 사용 중이라는 뜻이에요. 사용자 프로세스가 아니라서 단순 종료로 해결되진 않아요. 여기서 바로 무턱대고 프로세스를 종료하려고 하면 안 돼요—시스템이 불안정해질 수 있으니까요.


2. HTTP.sys 서비스 상태 확인하기

이제 포트 80을 사용하고 있는 HTTP.sys 관련 서비스를 확인해볼 차례예요. 다음 명령어를 입력해보세요.

netsh http show servicestate
netsh http show servicestate

여기서 출력되는 항목 중 Listening URLs에 포트 80이 잡혀 있는 URL이 보일 거예요. http://+:80/ 이나 http://localhost:80/ 같은 형태로 나올 텐데요, 이걸 잡고 있는 게 Windows의 HTTP.sys예요.

만약 여기서 ReportServer 같은 이름이 보이면 혼란스러울 수 있어요. 이건 SQL Server Reporting Services 같은 것이 백그라운드에서 포트를 점유하고 있는 경우예요. SQL Server가 설치된 환경에서는 종종 이런 충돌이 생기더라고요.


3. PID 4가 차지한 포트 80 해제하기

그럼 이제 어떻게 이걸 정리하냐고요? 간단해요. HTTP.sys가 포트 80을 듣고 있는 걸 해제해주면 돼요. 아래 명령어를 입력해보세요.

net stop http

하지만 이 명령어는 대부분 실패할 거예요. 왜냐하면 HTTP 서비스를 사용하는 다른 프로세스들이 많기 때문이죠. 그래서 직접 URL Reservation을 제거해줘야 해요. 이건 다음과 같이 합니다:

netsh http delete urlacl url=http://+:80/

이걸로도 안 되면 ReportServer 같은 서비스를 아예 중지하거나 자동 시작을 해제하는 방법도 있어요. services.msc 열어서 ‘SQL Server Reporting Services’를 찾아 수동으로 바꾸면 됩니다.


4. 작업 관리자에서 PID 4 확인하는 방법

사실 작업 관리자(Task Manager)에서도 PID를 확인할 수 있어요. Ctrl + Shift + Esc로 작업 관리자를 열고, [보기] → [열 선택]에 들어가서 ‘PID(프로세스 식별자)’ 항목을 체크하세요. 그러면 각 프로세스의 PID가 보이는데, 여기서 4번을 찾으면 ‘System’이라고 떠 있을 거예요.

이걸 강제 종료할 수는 없지만, 어떤 프로세스가 어떤 PID를 쓰는지 확인하는 데에는 유용해요.


5. 포트 80을 다른 포트로 변경하는 것도 방법

만약 포트 80을 꼭 써야 하는 게 아니라면, Tomcat이나 사용하는 웹 서버의 포트를 변경하는 것도 좋은 대안이에요. 보통 server.xml 파일에서 포트 설정을 바꾸면 되는데요, Tomcat의 경우는 다음 경로를 참고하세요:

[TOMCAT_HOME]/conf/server.xml

이 파일을 열어서 <Connector port="80" ...> 부분을 원하는 포트 번호(예: 8080)로 바꾸면 돼요. 변경 후에는 Tomcat을 재시작해주면 끝이에요. 포트 80이 막혀서 스트레스 받는 것보다, 이 방법이 훨씬 간단할 수도 있어요.

다만, 80번 포트를 꼭 써야 하는 상황이라면(예: 리버스 프록시 구성 등), 앞에서 말한 HTTP.sys 설정 해제가 반드시 필요해요.


6. 포트 점유 문제를 피하는 내 노하우

저만의 팁인데요… 개발 환경에서는 시스템을 좀 더 유연하게 유지하기 위해 80번 포트 사용을 최대한 피하려고 해요. 대신 8080이나 3000 같은 흔한 포트를 지정해두고, 필요하다면 로컬 프록시나 포트 포워딩으로 리다이렉트하는 방식을 써요.

그리고 netsh http show servicestate 명령은 정말 자주 써요. 시스템이 뭔가 이상하다 싶을 땐 꼭 한 번씩 돌려보거든요. 작업이 꼬였을 때 빠르게 원인을 파악하는 데에 최고예요.

마지막으로, 이런 문제가 반복된다면 HTTP.sys를 쓰는 시스템 서비스를 비활성화해두는 것도 하나의 방법이에요. 다만 신중하게 진행해야 하고, 잘 모르겠으면 시스템 관리자나 선배 개발자에게 한 번쯤 물어보는 것도 추천드려요.


Q&A 자주 묻는 질문

Q1. PID 4는 왜 종료가 안 되나요?
A1. PID 4는 Windows 운영체제의 핵심 프로세스인 ‘System’이 사용하는 고정 PID예요. 이건 커널 수준의 프로세스라서 강제로 종료할 수 없고, 종료하면 시스템이 다운될 수 있어요. 그래서 관련 포트를 해제하거나 우회하는 방법을 써야 합니다.


Q2. netsh 명령으로도 포트 해제가 안 돼요. 어떻게 해야 하죠?
A2. SQL Server Reporting Services나 Web Deploy 등 다른 서비스가 HTTP.sys를 사용하는 경우가 많아요. services.msc를 열어서 ‘SQL Server Reporting Services’, ‘Web Deployment Agent Service’ 등을 찾아서 중지해보세요. 그리고 다시 netsh http delete urlacl을 시도해보면 됩니다.


Q3. Windows 업데이트 후에 다시 포트 80이 점유돼요. 왜 그런가요?
A3. Windows 업데이트가 시스템 서비스를 재설정하면서 HTTP.sys 관련 설정도 초기화하는 경우가 있어요. 이럴 땐 다시 netsh http show servicestate로 확인하고, 불필요한 URL 예약을 삭제해줘야 합니다. 주기적으로 확인하는 습관이 필요해요.


Q4. Tomcat 포트를 바꾸면 웹 서비스 접속은 어떻게 하나요?
A4. 예를 들어 Tomcat의 포트를 8080으로 바꾸면, 접속 주소도 http://localhost:8080으로 바뀌어요. 만약 외부에서 접근하려면 방화벽이나 라우터 설정도 변경해야 할 수 있어요. 포트를 바꿨으면 그에 맞게 웹 브라우저 주소도 조정해야 해요.


Q5. HTTP.sys를 완전히 비활성화해도 괜찮을까요?
A5. 기본적으로는 권장하지 않아요. HTTP.sys는 Windows에서 여러 시스템 기능이 의존하는 핵심 구성요소라서, 비활성화하면 의외의 문제가 생길 수 있어요. 대신 URL Reservation만 조정해서 포트 충돌을 해소하는 방식이 더 안전합니다.


포트 80 충돌 문제는 윈도우에서 Tomcat이나 다른 서버 환경을 운영하는 분들이 자주 겪는 이슈예요. 저도 처음엔 이게 뭔가 싶었는데, 알고 보니 시스템의 HTTP.sys 서비스가 원인이더라고요. 겁먹을 필요는 없어요—차근차근 원인을 찾고 조치하면 깔끔하게 해결할 수 있거든요.

특히 netsh http show servicestate 명령을 활용하는 방법은 꼭 익혀두시면 좋아요. 실제로 이 명령어 하나로 어디서 포트를 점유하고 있는지 빠르게 파악할 수 있으니까요. 그리고 Tomcat 포트를 변경하거나 URL 예약을 삭제하는 방법까지 익히면, 나중에 어떤 환경에서도 문제없이 설정하실 수 있을 거예요.

이 글을 통해 도움을 받으셨다면, 직접 따라해보신 후 어떤 부분이 어려웠는지 댓글로 공유해주시면 더 좋은 팁으로 답변드릴게요! 다음엔 리눅스 환경에서 비슷한 포트 충돌 문제 해결하는 방법도 정리해볼게요—기대해 주세요!