나는 구태형을 만날 때마다 단호해질 거라고 생각했다.
하지만 직접 얼굴을 보니 그런 마음보다 먼저 피곤함이 밀려왔다. 그의 회색 셔츠에는 잘 다린 주름이 있었고, 회의실에는 차가운 물이 네 잔 놓여 있었다. 수천 건의 기억 장부와 실종 기록을 만든 시스템의 운영자가 이렇게 평범하게 앉아 있다는 사실이 어색했다.
"다시 만났군요, 차도겸 씨." 구태형이 말했다.
"이번에는 과거로 출근시켰다는 말 듣고 왔습니다."
"재미있는 표현이네요."
"재미없습니다."
남 형사와 담당 조사관이 적법한 절차에 따라 관련 자료 제출을 요청했다. 우리는 증거 보관과 질문을 분리하기로 했다. 내가 구태형에게 큰소리친다고 지난 기록이 복원되는 것은 아니었다.
구태형은 2011년 재개방 당시 자신이 유지보수 총괄 업무에 참여했다고 인정했다. 그러나 배전반 스위치를 누른 사람은 자신이 아니라고 했다.
"당신 이름이 기록에 있습니다." 서아가 말했다.
"제 이름으로 결재된 작업이 있었다는 것과 제가 직접 지하실에 들어갔다는 건 다른 이야기죠."
그 말 자체는 우리가 내내 주장해 온 원칙과 다르지 않았다. 그래서 더 불편했다. 옳은 구분을 잘못을 숨기는 데 쓸 수도 있다는 사실이.
"그럼 우회 스위치를 승인했습니까?" 내가 물었다.
"승인 요청을 받았고, 조건부로 검토했습니다. 당시 목적은 장치 오작동을 막는 것이었습니다."
"증인이 거절한 기록까지 귀환 요청으로 바꾼 건요?"
구태형이 물잔을 내려놓았다.
"후속 업체가 정산 모듈을 연결하면서 발생한 해석 차이입니다."
나는 웃음이 나올 뻔했다. 개발자에게 '해석 차이'라는 말은 배포 사고 뒤에 가장 자주 나타나는 단어였다. 물론 해석의 대상이 사람의 삶이라는 점만 빼면.
서아는 준비해 온 표를 보여 줬다. 우회 스위치 요청서, 2011년 접속 로그, 2026년 권한 변환 기록을 세 열로 나눈 표였다.
"이 세 가지 중 직접 알고 있는 건 어디까지입니까?"
구태형은 잠시 침묵했다.
"우회 요청서는 제가 봤습니다. 접속 로그는 기술팀 소관이었고, 2026년 변환은 운영사의 자동 복구 정책을 따랐습니다."
"자동 복구 정책에 차도겸의 이름을 넣은 건 누가 승인했습니까?"
그는 답하지 않았다.
"그러면 왜 아직도 대기자의 목소리가 정산 모듈로 흘러갑니까?"
"비정상 데이터를 보존하기 위해서입니다."
시우가 노트북을 돌렸다. 어젯밤 신호 A의 회신이 변환 모듈로 들어가려 한 기록이었다. 그러나 데이터는 저장에 실패했고, 대신 백업 중계기의 일련번호만 남아 있었다.
"이 중계기는 현재도 사용 중입니다. 누가 접근할 수 있습니까?"
구태형이 직원 명단을 띄웠다. 자신을 포함해 다섯 명이었다. 모두 이름과 권한이 있었지만 실제 사용자는 로그인 기록으로 별도 확인해야 했다. 적어도 그 역시 우리 앞에서 '내가 아니다'라는 말만으로 끝낼 수는 없었다.
우리는 서버 원본을 확인할 자료와 임의 삭제를 막을 조치를 요청했다. 조사관이 절차를 안내하자 구태형은 결국 백업 보존에 동의했다. 그렇다고 그가 갑자기 협조적인 사람이 된 것은 아니었다.
중간에 구태형은 자료를 확인하겠다며 자리에서 일어났다. 회의실 유리벽 너머 서버실 출입구가 보였다. 직원들은 평범하게 카드를 찍고 들어갔다. 카드가 승인되면 초록 불이 켜졌고, 승인되지 않으면 빨간 불이 켜졌다. 나는 이상하게 그 색이 싫었다. 이렇게 명료하게 사람의 출입을 판단하는 시스템이 실제 사람의 귀환을 판단할 때는 끝없이 흐릿한 문장을 내놓았기 때문이다.
"저 출입 기록은 남습니까?" 내가 물었다.
담당자가 고개를 끄덕였다.
"네. 다만 통제실에서 대신 열어 줄 수 있고, 비상 개방 기록은 별도 저장됩니다."
"그러면 카드 기록만으로 실제 들어간 사람을 확정할 수는 없겠네요."
그가 잠깐 놀란 표정을 지었다.
"맞습니다. CCTV와 현장 근무표도 봐야겠죠."
나는 남 형사를 바라봤다. 그는 나와 같은 생각을 한 듯 조용히 고개를 끄덕였다. 2011년과 지금, 같은 문제가 다른 형태로 계속 남아 있었다.
시우는 조사관 앞에서 자신이 확보한 전자 자료의 해시값을 읽었다. 누군가 기록을 삭제하거나 나중에 내용을 바꾸면 비교할 수 있게 하기 위해서였다. 우리는 원본을 바로 만지지 않았다. 구태형의 책임을 묻기 위해서도, 그에게 잘못 씌워진 책임을 벗기기 위해서도 자료가 그대로 남아 있어야 했다.
회의가 끝나기 직전 그가 내게 물었다.
"차도겸 씨. 당신은 정말로 모든 사람을 돌아오게 할 수 있다고 믿습니까?"
"모릅니다."
"그런데 왜 우리 시스템을 멈추려고 하죠?"
"모르기 때문에요. 누가 어디 있는지 모르면서 돌아왔다고 정산하고, 거절했는데 동의했다고 적는 건 멈춰야 합니다."
구태형이 웃음을 지웠다.
"그 시스템이 멈추면 내부 사람의 목소리도 함께 끊길 수 있어요."
나는 잠깐 말을 잃었다. 그는 우리가 가장 두려워하는 부분을 정확히 찔렀다.
그러나 서아가 대답했다.
"그래서 아무 전원이나 끄지 않는 겁니다. 원본 신호는 남기고, 동의 없는 자동 처리만 막을 방법을 찾고 있어요."
구태형은 서아를 오래 보았다.
"1998년에도 같은 말을 한 사람이 있었지요."
"누구였습니까?"
"차정수 씨. 그는 출구를 열라고 하지 않았습니다. 나올 사람이 직접 말할 때까지 기록을 보존하라고 했죠."
그 말은 우리가 들은 아버지의 행적과 맞아떨어졌다. 그러나 이제 구태형의 입에서도 같은 이야기가 나왔다는 사실이 오히려 의심스러웠다. 그는 진실을 말하면서 중요한 부분을 빼놓는 사람일 수 있었다.
서버실에서 돌아오는 길, 조사관에게서 연락이 왔다. 백업 중계기의 접근 기록 중 우리가 요청한 날짜에 해당하는 항목이 발견됐다고 했다.
`최근 관측일 05:59:58 / 사용자: GTH-ADMIN / 명령: 재전송 허용`
현재 관리자 계정이었다. 하지만 같은 시각 물리 출입 기록에 구태형의 이름은 없었다.
"또 계정과 사람이 다르군요." 내가 말했다.
시우가 로그를 다시 확인했다.
"네. 다만 이 명령은 2011년의 데이터를 현재 시각으로 재전송한 것이에요. 과거를 새로 만든 게 아니라, 과거 기록을 현재 장부에 덮으려 한 흔적입니다."
그날 시우는 원본 운영 로그를 별도 저장 장치에서 검증했다. 새로 발견된 명령이 일어났던 시각과 우리가 별관에서 첫 신호를 들은 시각 사이에는 아주 짧은 차이가 있었다. 몇 초 차이였지만, 그 안에 재전송과 인증 요청이 연달아 일어났다.
"이건 사람이 계속 버튼을 누른 것과 다릅니다." 그가 말했다. "한 번의 예약 작업이 여러 줄의 결과를 만들었어요."
"그럼 사용자 계정으로 실행됐어도 매번 누가 앉아 있었다는 뜻은 아니군요."
"맞습니다. 다만 그런 예약 작업을 누가 설정했는지는 확인할 수 있어요."
검증된 원본에는 예약 작업 이름만 남아 있었다. `RETURN_SYNC_RETRY`. 나는 이전의 17번 실패 기록을 떠올렸다. 오래 실패했던 동작을 자동으로 다시 실행하도록 만든 프로그램. 그런 코드는 개발자에게 낯설지 않았다. 네트워크가 잠시 끊겨도 데이터를 보내기 위해 반복 호출하는 건 흔한 방식이었다.
문제는 보내는 내용이었다. 전달에 실패한 사람의 말을 몇 번이고 다시 보내는 동안, 거절마저 요청으로 바뀌어 전달됐을 수 있었다. 누구도 그 결과를 확인하지 않고 자동 작업만 계속 돌린다면 문제는 절대 끝나지 않을 것이다.
나는 시우에게 그 예약 작업을 무턱대고 삭제하지 말자고 했다. 먼저 남겨야 할 원본 신호가 끊기지 않는 대체 경로부터 확보해야 했다.
서아가 내게 화면을 보여 줬다. 전송될 예정이었던 첫 줄은 우리 모두의 예상을 벗어났다.
`대상: 남도윤 / 귀환 의사: 확인 불가 / 표시 이름: 차도겸-07`
내 이름으로 가려졌던 것이 처음으로 다른 사람의 이름을 드러냈다.
남도윤.
그러나 바로 다음 줄에는 경고가 있었다.
`본 항목은 사람 식별정보가 아니라 회선 별칭일 수 있습니다.`
남기혁이 그 화면을 조용히 읽었다.
"알겠습니다. 형이라는 결론은 아직 내리지 않겠습니다. 대신 확인하겠습니다. 끝까지."
제128화 댓글 0
댓글·공감·신고는 로그인 후 이용할 수 있습니다. 이전 익명 댓글은 그대로 표시됩니다.
댓글을 불러오는 중입니다.