“열세 건이면 열세 명입니까?”
회의실 스피커에서 내 목소리가 조금 크게 울렸다. 나는 수치를 듣자마자 사람 수부터 세려는 습관을 고치지 못하고 있었다.
“열세 개 수신 경로야.” 강문석이 답했다. “한 사람이 두 번호를 등록했을 수도 있고, 이미 해지된 회선도 있어.”
“그럼 피해가 몇 명인지 아직 모르는 거네요.”
“맞아.”
남기혁 형사는 그 대화를 기록했다. 서류에 적힌 숫자를 곧바로 실종자 수로 발표할 수 없다는 사실을 누구보다 잘 아는 사람이었다. 그는 공적인 수사 권한과 우리가 우연히 확보한 자료를 분리하기 위해 별도 보존 절차를 진행 중이었다.
그 사이 열세 건 가운데 한 회선에서 실제 응답이 나왔다. 시 외곽의 야간 경비실 전화였다. 관리인은 돌아가신 아내의 목소리를 들었다고 주장했다. 목소리는 오래전 집 비밀번호를 정확하게 말했다. 전화를 받은 남자는 너무 놀라서 건물 출입문까지 열 뻔했다고 했다.
“비밀번호를 어떻게 알았을까요?” 서아가 물었다.
유나가 씁쓸하게 대답했다.
“그 집 전화번호와 이름을 등록한 사람이 예전에 남겨 둔 녹음에 들어 있었을 수도 있죠. 비밀번호를 알고 있다는 것만으로 그 사람이 그 사람이라는 뜻은 아니니까.”
경비실의 남자는 아직 충격에서 벗어나지 못했다. 남 형사는 직접 연락하기보다 기존 신고 접수 담당자를 통해 필요한 도움을 전달했다. 우리는 그에게 이상한 목소리를 들었다는 이유로 어떤 서류에도 서명할 필요가 없다는 안내를 남겼다.
그날 오후, 나는 문제를 코드로 생각하기 시작했다.
C-07은 과거 음성 자료에서 문장을 잘라내어 보낸다. 그러면 본인이 기억하는 목소리처럼 들릴 수 있다. 목소리를 듣고 버튼을 누르면 '귀환 확인'으로 처리하는 것이다. 이 시스템의 첫 번째 버그는 음성 합성이 아니었다. 상대방이 놀란 틈에 내린 행동을 사실관계에 대한 증명으로 간주한다는 점이었다.
“확인 절차를 두 단계로 바꾸면요?” 내가 물었다.
“구체적으로.” 강문석이 말했다.
“전화는 받더라도 아무 기록이 바뀌지 않게 해요. 사람의 의사 확인은 별도의 창구에서, 새로운 대화를 한 다음 하도록. 기존 기록은 증거로 보존하고요.”
“중앙망 설정만 바꾸면 다른 경로로 우회할 거야.”
“그래서 C-07의 발신 큐를 끊고, 수신 쪽에서는 자동 확인 처리를 막아야 하죠.”
“비상 권한이 필요해.”
우리는 합법적인 보존 요청과 긴급 피해 예방에 관한 절차를 검토했다. 장비를 해킹하거나 신원을 위조해 관리자로 들어갈 수는 없었다. 무엇보다 원격으로 무작정 전원을 끊으면 안쪽 통신에 의존하는 사람이 피해를 볼 수 있었다.
그전에 나는 회사로 돌아가야 했다. 서버 장애가 났기 때문이었다. 물론 보관국의 대형 사고를 추적하고 있는 인간에게 로그인 페이지 오류 따위가 중요한가 싶었지만, 정상적인 세상이 굴러간다는 사실을 확인할 곳이 필요했다.
팀장은 나를 보자 안도의 한숨을 쉬었다.
“도겸 씨! 지금 어디 있어요?”
“여기 있죠.”
“연락을 해도 안 받길래.”
“시간이 잠깐 안 갔습니다.”
“또 그런 농담. 이번 장애는 진짜 큰일이에요. 사용자들이 저장 버튼을 누르면 저장이 안 됩니다.”
나는 서버 로그를 보다가 기묘한 유사성을 발견했다. 저장 버튼은 눌려 있었고 요청도 정상적으로 들어왔다. 하지만 백엔드가 결과를 확인하기도 전에 프런트 화면이 '저장 완료'라고 표시하고 있었다.
“팀장님. 저장했다는 메시지랑 실제 저장이 같은 게 아니에요.”
“알죠. 지금 고치자는 거죠.”
“아니, 그냥… 요즘 제가 그 차이를 자주 보는 것 같아서요.”
우리는 잘못된 완료 메시지를 수정하고 실패한 요청을 복구했다. 야근은 길어졌지만, 적어도 이번에는 오류를 고친 뒤 모든 데이터가 안전한지 확인했다. 팀장은 퇴근하며 내게 캔커피 하나를 건넸다.
“고생했어요. 오늘은 진짜 퇴근합시다.”
그 말이 조금 이상하게 들렸다. 회사에서는 끝나지 않은 일을 다음 날 다시 시작할 수 있다. 하지만 보관국은 마감 시각을 놓치면 다른 사람의 삶을 빼앗아도 된다고 선언했다. 두 시스템은 비슷하게 생겼지만 책임의 무게가 달랐다.
주차장으로 내려가는 길에 경비실로부터 전화가 왔다. 우리 회사의 다른 직원에게도 이상한 전화가 왔다는 것이다. 목소리는 돌아가신 할머니와 비슷했고, 자꾸 '오늘 퇴근 확인을 누르라'고 했다고 한다. 전화를 받은 직원은 신원을 확인하려고 반문하다 겁을 먹고 끊었다.
나는 그에게 추측을 사실처럼 설명하지 않았다. 다만 자동 확인 버튼을 누르지 말고 통화 기록을 보존하라고 말했다. 통화 내용이 불안하다면 관리 부서에 신고할 수 있는 경로도 안내했다.
그날 회사에서 나는 한 가지를 분명하게 보았다. 귀환문은 낡은 병원 안에만 있는 것이 아니었다. 휴대전화 알림 하나로 누구에게나 다가갈 수 있었다.
밤 열한 시, 유나가 1998년 시험 장치 도면을 펼쳤다. 사람을 들이고 내보내는 귀환문과 음성을 조립하는 C-07은 같은 장비가 아니었다. 전원도 달랐다. 그러나 2011년 교체 공사에서 두 장치의 확인 신호가 같은 중계 장치를 지나도록 바뀌어 있었다.
“봐.” 유나가 도면의 붉은 선을 짚었다. “둘을 한꺼번에 차단하면 통화도 막힐 수 있지만, 출력 신호만 막으면 상대가 직접 말하는 통로는 남아.”
“방송과 마이크를 분리한다?”
“정확히는 자동 서명을 거는 경로와 실제 음성을 운반하는 경로를 분리하는 거지.”
그 말은 단순하면서도 어려웠다. 나에게도 할 수 있는 일이 생겼지만, 그것만으로 안전하다고 선언할 수는 없었다. 서아는 당사자와 상담한 뒤에도 임시 조치가 언제까지 유지되는지 확인해야 한다고 말했다.
다음 날 아침, 외부 통신 업체의 담당자가 현장 입회에 동의했다. 장비 내역과 운영 로그를 보존하는 조건이었다. 남 형사는 수사 담당자와 피해 신고 접수 경로를 연결했다.
장비를 점검하던 현장 담당자는 우리에게 계약서 사본 한 장을 보여 주었다. 외부 통신 업체의 정비 약관이었다. 정비 중 오류를 발견하면 자동 확인 절차를 멈출 수 있다는 조항이 있었다. 그러나 그 아래에는 '장비 이용자의 승인 지연은 책임 사유로 보지 않는다'는 문장도 있었다.
“이러니까 아무도 안 고쳤군요.” 내가 말했다.
“그런 건 아닙니다. 문제가 있는 줄 몰랐던 사람도 있어요.” 담당자가 대답했다.
그의 말이 맞았다. 나도 회사에서 오래된 함수를 보며 누가 이렇게 만들어 놨냐고 욕하다가, 코드 작성자가 내 이름인 걸 발견한 적이 있다. 의도적으로 나쁜 일을 한 사람과 모른 채 방치한 사람, 알고도 절차가 복잡하다며 외면한 사람의 책임은 달라야 했다.
“그래도 지금은 확인됐잖아요.”
“맞습니다.” 담당자가 말했다. “그래서 멈추는 겁니다.”
그는 자신의 이름을 걸고 정비 기록에 서명했다. 장비가 문제없다는 서류가 아니라, 문제가 있으므로 출력을 제한했다는 서류였다. 누군가는 이런 기록을 남기기 싫어하겠지만 오늘은 달랐다.
“평가에 불이익이 생길 수도 있는데 괜찮아요?” 내가 물었다.
그가 웃었다.
“이름이 적힌 서류가 전부 책임 떠넘기기는 아니잖아요. 제가 한 일은 제가 했다고 적어야죠.”
우리는 여러 사람이 지켜보는 가운데 시험을 시작했다.
C-07은 첫 번째 시험에서 정상적으로 음성을 보냈다. 하지만 수신자가 누르지 않은 확인 버튼도 눌린 것으로 표시했다.
“자동 확인이 켜져 있네.” 내가 말했다.
두 번째 시험에서는 자동 확인 출력만 끊었다. 녹음된 목소리는 재생됐지만, 수신 장부에 새로운 동의 기록이 생기지 않았다.
“됐다!”
유나는 내 어깨를 밀었다.
“아직. 세 번째 문 통신이 살아 있는지 확인해야지.”
외부 수신기에서 아주 약한 소리가 났다. 나무를 두드리는 것 같은 소리였다.
딱. 딱.
그리고 긴 간격.
딱.
강문석이 놀란 표정으로 스피커를 껐다가 다시 켰다. 소리는 녹음 파일에서 온 것이 아니었다. 우리가 제3 귀환문의 직접 회선이라고 표시한 경로에서 들어오고 있었다.
“누가 문을 두드리고 있어.” 서아가 말했다.
나는 숨을 멈췄다.
시간을 빼앗기는 일을 막으려던 우리가 처음으로 발견한 것은, 계약서가 아니라 사람의 노크였다.
제153화 댓글 0
댓글·공감·신고는 로그인 후 이용할 수 있습니다. 이전 익명 댓글은 그대로 표시됩니다.
댓글을 불러오는 중입니다.