프린터 설정을 열어 보면 생각보다 프린터가 많다. 내 PC 의 "프린터 및 스캐너" 목록에는 여섯 개가 있었는데, 종이가 나오는 진짜 프린터는 공유기에 물려 있는 네트워크 프린터 한 대뿐이었다. 나머지 다섯은 PDF 로 저장하거나 OneNote 로 보내는 가상 프린터다. 이 여섯 개를 모두 관리하는 것이 작업 관리자에 늘 떠 있는 spoolsv.exe 다. 인쇄를 한 달에 한 번 할까 말까 해도 이 프로세스는 부팅부터 계속 돌고 있다.
spoolsv.exe 는 서비스 하나짜리 프로세스다
먼저 정체부터 확인했다.
Get-CimInstance Win32_Service -Filter "Name='Spooler'" |
Select-Object Name, DisplayName, State, StartMode, StartName, ProcessId, PathName
서비스 이름은 Spooler, 표시 이름은 Print Spooler, 시작 유형은 자동, 실행 계정은 LocalSystem 이었다. 경로는 C:\Windows\System32\spoolsv.exe 이고 부모는 services.exe, 시작 시각은 부팅 직후였다. 많은 Windows 서비스가 svchost.exe 안에 함께 들어가는 것과 달리, 인쇄 스풀러는 자기 실행 파일을 따로 가진 몇 안 되는 서비스다. 그래서 작업 관리자에 svchost 가 아니라 spoolsv.exe 라는 이름으로 보인다.
파일은 991,232바이트, 설명 "Spooler SubSystem App", 버전 10.0.26100.9949, Microsoft Windows 서명이 유효했다. 일반 권한으로는 Get-Process 의 CPU 시간이 비어 나와서 성능 카운터로 봤다. 확인한 시점에 부팅 후 약 64시간째였고, CPU 는 0%, 작업 집합 약 9.7MB, 개인 바이트 약 7.1MB, 스레드 16개, 핸들 529개였다. 인쇄를 안 하는 동안에는 거의 아무 일도 하지 않는다.
가짜 구별은 다른 편과 같다. 경로가 System32 이고, 서명이 Microsoft Windows 이며, 하나만 떠 있어야 한다.
Get-AuthenticodeSignature C:\Windows\System32\spoolsv.exe |
Select-Object Status, @{n='Signer'; e={$_.SignerCertificate.Subject}}
프린터 여섯 개, 포트 모니터 아홉 개
스풀러가 하는 일은 이름 그대로 "모아 두었다가 내보내기"다. 앱이 인쇄를 누르면 문서는 프린터로 바로 가지 않고 먼저 스풀 파일로 C:\Windows\System32\spool\PRINTERS 폴더에 쌓인다. 스풀러는 이 파일을 프린터 드라이버로 프린터 언어에 맞게 바꾸고, 포트 모니터를 통해 USB·네트워크·파일 같은 출구로 내보낸다.
중요한 점은 이 과정의 상당 부분이 스풀러 프로세스 안에서 돈다는 것이다. 프린터를 설치하면 제조사가 만든 DLL 이 spoolsv.exe 안에 올라온다. 이 PC 의 레지스트리(HKLM\SYSTEM\CurrentControlSet\Control\Print\Monitors)를 읽어 보니 포트 모니터가 아홉 개였다.
| 구분 | 이 PC 에서 확인한 것 |
|---|---|
| Windows 기본 모니터 | Local Port, Standard TCP/IP Port, USB Monitor, WSD Port, Virtual Port Monitor, Appmon |
| 프린터 제조사 | 삼성 프린터 드라이버의 언어 모니터 1개 |
| PDF 변환 앱 | 상용 PDF 프로그램 두 개가 설치한 포트 모니터 |
드라이버는 11개가 등록되어 있었고, 그중 Microsoft 것이 아닌 것이 삼성 C48x 시리즈 드라이버와 PDF 프로그램 두 개의 드라이버였다. spool\drivers\x64\3 폴더에는 하위 폴더까지 369개 파일, 77.7MB 가 쌓여 있었다. 한 번 설치한 프린터 드라이버는 프린터를 지워도 이 폴더에 남는 경우가 많다.
관리자 권한으로 spoolsv.exe 가 올린 모듈 목록을 보면 이런 제조사 DLL 이 Windows 의 것과 섞여 있는 것이 보인다. 이것이 스풀러 문제의 대부분을 설명한다. CPU 가 튀거나 스풀러가 죽는 일의 원인은 spoolsv.exe 자체보다 그 안에 올라온 드라이버인 경우가 많고, 보안 문제도 같은 자리에서 생긴다.
CPU 가 높거나 인쇄가 멈출 때
spoolsv.exe 가 인쇄도 안 하는데 CPU 를 계속 쓰고 있다면 대개 둘 중 하나다. 대기열에 처리하지 못하는 문서가 걸려 있거나, 드라이버나 포트 모니터 하나가 연결이 끊긴 프린터를 계속 찾고 있는 경우다. 오래전에 쓰던 네트워크 프린터가 목록에 남아 있으면 스풀러가 그 프린터의 상태를 묻느라 헛도는 일이 생길 수 있다.
먼저 대기열을 본다. 설정의 Bluetooth 및 장치 → 프린터 및 스캐너에서 프린터를 눌러 "인쇄 대기열 열기"를 하거나 PowerShell 로 한꺼번에 본다.
Get-Printer | ForEach-Object { Get-PrintJob -PrinterName $_.Name }
이 PC 에서는 여섯 프린터 모두 대기 중인 작업이 0개였다. 걸린 작업이 있으면 대기열에서 취소한다. 취소가 안 먹고 계속 "삭제 중"으로 남으면 흔히 쓰는 방법은 관리자 권한으로 스풀러 서비스를 멈추고, spool\PRINTERS 폴더의 스풀 파일을 지운 뒤, 서비스를 다시 시작하는 것이다. 이 폴더는 일반 권한으로는 열리지도 않았다. 그만큼 아무나 손댈 곳은 아니니 대기열 취소로 안 될 때만 쓴다.
이벤트 로그도 단서가 된다. 이벤트 뷰어의 응용 프로그램 및 서비스 로그 → Microsoft → Windows → PrintService 아래에 Admin 과 Operational 이 있다. 이 PC 의 Admin 로그에는 기본 프린터가 바뀌었다는 기록 2건뿐이었고, Operational 로그는 기본값대로 꺼져 있었다. Operational 은 켜 두면 문서마다 어느 프린터로 어떤 드라이버를 거쳐 나갔는지가 남는 것으로 알려져 있어서, 인쇄가 반복해서 멈추는 PC 라면 잠시 켜 두고 볼 만하다.
원인이 특정 프린터로 좁혀지면 그 프린터를 지우고 제조사 최신 드라이버로 다시 설치하는 것이 가장 확실하다.
PrintNightmare 이후, 그리고 꺼도 되는가
2021년 여름 "PrintNightmare"라고 불린 취약점이 크게 알려졌다. 스풀러가 SYSTEM 권한으로 돌면서 원격에서 프린터 드라이버를 설치받을 수 있다는 점을 노린 것이었다. 앞에서 본 구조 그대로, 드라이버 DLL 이 스풀러 안에 올라오면 그 코드도 SYSTEM 권한으로 돈다.
그 뒤로 여러 차례 보안 업데이트가 나왔다. 일반 사용자 입장에서 체감되는 변화는 네트워크 공유 프린터의 드라이버를 설치할 때 관리자 권한을 요구하게 된 것이다(Point and Print 제한). 이 PC 에는 이 동작을 바꾸는 정책 값이 따로 없어서 기본값대로 동작하고 있었다. 최근 Windows 11 에는 제조사 드라이버 없이 Windows 기본 IPP 드라이버만 쓰게 하는 "Windows 보호 인쇄 모드"도 들어간 것으로 알려져 있다. 제조사 드라이버를 스풀러에서 빼내는 방향으로 가고 있는 것으로 보인다. 이 PC 의 네트워크 프린터도 IPP 주소로 연결되어 있었지만 드라이버는 제조사 것이었다.
그렇다면 프린터를 안 쓰는 PC 에서는 스풀러를 꺼도 되는가. 장단점이 분명하다. 끄면 공격받을 수 있는 서비스 하나가 줄고, 메모리 몇 MB 가 돌아온다. 대신 종이 프린터만 안 되는 게 아니라 "Microsoft Print to PDF" 같은 가상 프린터도 같이 사라진다. 앱에서 PDF 로 저장하기, OneNote 로 보내기, 일부 앱의 인쇄 미리 보기가 안 될 수 있다. Microsoft 는 프린터가 필요 없는 서버, 특히 도메인 컨트롤러에서는 스풀러를 끄라고 권하는 것으로 알려져 있지만, 일반 PC 는 업데이트를 제때 받는 것이 우선이다. 몇 MB 를 아끼려고 끌 만한 서비스는 아니고, 끄더라도 무엇이 같이 안 되는지 알고 결정하는 편이 낫다.
정리할 수 있는 건 따로 있다. 안 쓰는 프린터와 오래된 PDF 프로그램을 지우면 스풀러 안에 올라오는 남의 코드가 그만큼 줄어든다. CPU 문제와 보안 문제를 같이 줄이는 방법이다.
다음 편은 절전 모드에 들어가려는 PC 를 깨우거나 붙잡는다고 의심받는 MoUsoCoreWorker.exe, Windows 업데이트 오케스트레이터다.