세상에는 불을 끄면 해결되는 문제가 있다.
방을 나갈 때 켜 둔 형광등, 잘못 연결된 멀티탭, 밤새 울리는 사무실 모니터. 그러나 사람의 이름과 시간이 들어간 기계를 끌 때는 전원 버튼을 누르기 전에 확인할 것이 많았다.
나는 언제나 그 사실을 너무 늦게 배웠다.
가정용 근태 앱에 퇴근망이 연결된다는 문서를 발견한 뒤, 남기혁 형사는 관계 업체와 관할 기관에 위험 사실을 알렸다. 확인되지 않은 전체 피해 규모를 단정하지는 않았다. 실제 문제를 확인한 현장부터 가동 중단과 증거 보존을 요청했다.
한시우는 자사 명의로 계약된 장치에 관해 정식 공급 중지 통지를 보냈다. 문제는 계약 상대방마다 중간 업체가 달랐고, 가정용 앱을 담당하는 업체는 자신들이 단순한 알림 서비스라고 주장했다는 점이었다.
“우리는 시간을 저장하는 장비를 만든 적 없습니다.”
업체 담당자의 말이었다.
“그럼 왜 사람들의 기억 잔액이 앱 로그에 찍힙니까?” 내가 물었다.
“그건 외부 서비스가 보내는 상태 코드일 뿐입니다.”
“상태 코드가 사람의 오늘을 가져가는군요.”
말이 통하지 않았다. 그렇다고 화만 낸다고 증거가 생기는 것도 아니었다. 우리는 앱이 실제로 어떤 권한을 요청하는지, 어떤 알림이 표시되는지 사용자 동의를 받아 확인했다. 여러 사람의 휴대전화를 몰래 조사하거나 계정을 열어 보지 않았다.
그 과정에서 뜻밖의 사실이 나왔다.
앱은 퇴근 확인을 직접 처리하지 않았다. 사용자가 퇴근 알림을 누르면 회사 단말기가 남긴 토큰을 전달했다. 서버는 그 토큰을 보고 현재 누가 ‘퇴근 가능한 상태’인지 판단했다. 토큰이 잘못 발급되면 앱에는 아무 문제 없는 버튼이 보여도 보관국 장부에는 다른 사람의 이름이 기록됐다.
“분산돼 있군요.” 내가 말했다.
강문석이 고개를 끄덕였다.
“단말기 한 대를 꺼도 서버에 남은 대리 정산 예약은 사라지지 않아요. 반대로 서버 연결을 갑자기 끊으면 이미 정지 상태에 들어간 사람의 귀환 확인이 누락될 수도 있습니다.”
“그럼 끌 수도 없습니까?”
“안전하게 끄는 순서를 찾아야 합니다. 먼저 누가 안에 있는지 확인하고, 대리 계약을 멈추고, 그다음에 통로를 닫아야 해요.”
그는 종이 세 장을 꺼냈다. 예전에 한시우의 어린 기록을 밖으로 내보낼 때 사용했던 상자 실험을 기억하는 내게는 낯익은 방식이었다.
첫 번째 종이에는 ‘사람’, 두 번째에는 ‘기록’, 세 번째에는 ‘장비’라고 썼다.
“흔히 장비부터 끕니다. 하지만 장비가 사람의 현재 상태를 알려 주는 유일한 창이라면, 창문을 닫은 뒤 사람을 찾겠다는 뜻이 됩니다.”
그 설명은 개발자인 내게 아프게 들렸다. 오류가 나면 서버부터 재시작하던 습관이 떠올랐기 때문이다. 서버가 돌아왔다는 메시지를 성공이라고 부르면서, 그 사이 누가 무슨 일을 잃었는지 세어 본 적이 얼마나 있었던가.
우리는 시험 장치에 연결된 사람 없는 모의 계정으로 안전 종료 순서를 확인했다. 첫 번째 단계는 모든 자동 청구를 보류하는 것, 두 번째는 대기 중인 당사자의 상태를 확인하는 것, 세 번째는 근무 기록을 별도 저장하는 것이었다. 마지막에야 장치가 외부로 새 요청을 보내지 못하게 했다.
모의 계정에서는 성공했다.
하지만 실제 전국망에는 어떤 사람이 어디에 묶여 있는지 모른다는 문제가 남았다.
첫 시험에서는 ‘안전 종료 완료’라는 초록색 알림이 나왔다. 나는 잠시 안도했다가 강문석이 웃지 않는 것을 봤다.
“알림만으로는 부족해요.”
그가 모의 계정의 최종 상태를 열었다. 화면에는 종료됐다고 적혀 있었지만 기록 반환 대기 시간이 0초가 아니라 ‘확인 전’으로 남아 있었다. 종료 버튼은 성공했는데 확인은 실패한 셈이었다.
“이 상태에서 실제 사람이 안에 있다면 어떻게 되죠?” 내가 물었다.
“다시 연결할 때까지 자기 시간이 돌아왔는지 확인하지 못할 수 있습니다.”
나는 속이 서늘해졌다. 예전에 개발자로 일하면서 성공 알림 하나만 확인하고 화면을 닫았던 적이 있었다. 그때 누가 어려움을 겪었는지 이제 와서 다 알 수는 없다. 그렇지만 오늘은 적어도 같은 실수를 하지 않을 수 있었다.
우리는 종료 성공 조건을 다시 적었다. 기계가 멈춘 것이 성공이 아니다. 대상자가 안전하게 돌아왔고, 당사자에게 알렸으며, 본인의 근무 기록이 유지되고, 타인에게 대리 청구가 발생하지 않았다는 사실이 각각 확인돼야 한다. 확신할 수 없는 항목은 ‘완료’가 아니라 ‘추가 확인’으로 남겼다.
모의 장치에서 마지막 항목까지 확인된 건 오후 한 시가 넘어서였다. 누구는 너무 느리다고 하겠지만 한 번의 빠른 재시작보다 그 느린 검사가 더 필요한 날이었다.
오후 두 시, 권수진이 다시 연락했다.
“센터에서 단말기를 바꾸려고 한다는데, 사라진 근무 기록은 아직 복구 안 됐어요.”
“기존 장비는 보존하고 있나요?”
“안전관리자가 따로 보관한대요. 그런데 직원들은 자꾸 빨리 새 장비를 쓰라고 하네요.”
“사람들이 얼마나 기다릴 수 있을지 고민이겠네요.”
“기다리는 동안 월급이 줄어요. 그걸 이해해 주면 좋겠어요.”
나는 말을 멈췄다. 멋진 원칙을 말하는 사람은 많다. 하지만 오늘 일한 시간이 내일 급여에 반영되지 않으면 누군가는 당장 생활비가 부족해진다. 기록이 중요한 이유는 추상적인 정의가 아니라 생계였다.
우리는 담당자들이 원본 자료를 보존하면서 별도의 수기 근무 확인 절차를 운영하도록 제안했다. 그 방법이 모든 사업장에 맞는 것은 아니지만, 적어도 현주와 동료들이 일한 시간을 확인할 통로가 하나 더 생겼다.
저녁 무렵 남 형사가 말했다.
“단말기 공급사에서 계약 중단 통지를 접수했습니다. 하지만 구태형이 운영하는 별도 관제 서버는 아직 살아 있습니다. 실제 계약 당사자가 누구인지 확인하고 있어요.”
나는 웃었다.
“세상 모든 사고 뒤에는 늘 다른 업체가 있네요.”
“책임도 따라갑니다. 서둘러 누가 최종 승인했는지 확인해야죠.”
한시우는 회사 쪽에 협조를 요청할 때마다 더 조심스러워졌다. 그는 이 문제를 일으킨 범인을 찾는 사람이기도 했지만, 자신의 회사 이름 아래에서 누군가 다쳤을 수 있다는 사실을 받아들이는 사람이기도 했다.
“회사에 들어오고 나서 처음으로 계약서가 무서워졌습니다.” 그가 말했다.
“저는 예전부터 무서웠는데요.” 내가 대답했다. “특히 자동 갱신하고 해지가 어려운 구독 서비스가요.”
그가 힘없이 웃었다.
“제가 할 수 있는 일은 기존 계약을 마음대로 없애는 게 아니라, 누가 무엇을 승인했는지 공개 가능한 범위를 확인하는 거겠죠.”
“그게 먼저입니다. 누군가 진짜로 동의했다면 그 동의도 함부로 지우면 안 되니까요.”
유나가 조용히 말했다.
“그리고 거절한 사람의 기록도.”
그는 고개를 끄덕였다. 오늘 회의에서는 서로의 선의를 증명하기 위한 말보다, 앞으로 무엇을 확인하겠다는 약속이 많았다. 그 약속은 모두 문서로 남았다.
한시우는 우리에게 직접 시우데이터의 내부 보관소를 보여 줬다. 수사와 증거 보존 범위를 합의한 뒤 열람 가능한 자료만 확인했다. 그곳에는 전국망 시험을 위한 노드 목록이 있었고, 각 노드마다 담당 회사와 초기화 키가 적혀 있었다.
노드 목록을 읽어 내려가던 나는 시우에게 오래된 장비 사진을 부탁했다. 회사 서버에는 오래전 폐기한 병원용 단말기의 외관 사진이 보존돼 있었다. 회색 철제 상자 위에 작은 녹색 표시등 하나, 그 아래 ‘사용 후 반드시 기록 확인’이라는 문장이 적혀 있었다.
“아버지가 이런 기계를 만드셨을까요?” 내가 물었다.
“설계 이력에 차정수라는 이름은 있습니다. 하지만 실제 설치에 참여했는지는 서류가 불완전합니다.”
나는 사진을 확대했다. 철제 상자 모서리에 아주 작은 삼각형 두 개가 마주 보고 있었다. 얼마 전 0번 보관실 문 아래에 내가 그려 둔 표시와 같은 모양이었다.
“이 모양이 뭘 뜻하는지 알아요?” 유나가 물었다.
“모르겠어요. 문 앞에서 아이의 이야기를 듣겠다고 적을 때 그렸어요. 그냥 떠올랐던 건데.”
누군가 어린 시절의 내 손에 이 표시를 그려 줬을지도 몰랐다. 그러나 기억이 없다는 이유로 그런 과거가 반드시 있었다고 말할 수는 없었다. 나는 사진의 출처와 촬영 날짜부터 확인했다. 알 수 없는 것을 추억인 것처럼 꾸미지 않으려고 했다.
그런데 가장 오래된 노드 하나의 생성 시각이 1998년이었다.
“그때 인터넷으로 이런 전국 장치를 운영할 수 있었나요?” 내가 물었다.
“지금 형태의 서비스는 아니었겠죠.” 한시우가 말했다. “이건 과거 기록을 새 서버로 옮기면서 생성 시각까지 가져온 것 같습니다.”
“기록의 생성 시각과 기계의 설치 시각은 다르다.” 강문석이 되뇌었다.
그 문장이 중요했다. 과거의 아이가 있다고 해서 오늘의 회사가 자동으로 존재했던 것은 아니다. 원본을 추적할 때도 시간의 층위를 구분해야 했다.
우리는 가장 오래된 노드의 이름을 확인했다.
‘영병원 0호 연결실.’
한시우는 화면을 바라보다 낮게 말했다.
“제 어린 시절이 여기서 다시 물건처럼 팔리고 있었군요.”
“아직 확실한 건 연결 기록입니다.” 내가 답했다. “누가 어떤 권한을 가지고 뭘 했는지는 더 봐야 합니다.”
그가 고개를 끄덕였다.
그때 서버 화면에 안내 문구가 나타났다.
[안전 종료 요청을 접수했습니다.]
[대기 주체 조회 중.]
우리가 모의 시험 장치에 보낸 종료 요청이 중앙 목록까지 전파된 것이다. 장치는 실험 환경과 운영 환경을 완전히 구분하지 못하고 있었다. 다행히 실제 가동을 중단하는 신호는 전송되지 않았지만, 우리는 즉시 시험을 멈췄다.
잠시 후 응답이 돌아왔다.
[현재 대기 중인 주체: 14]
[기록상 등록 주체: 13]
숫자를 보고 나는 부산에서 만난 민현주의 얼굴과 대전의 박도윤 목소리를 떠올렸다. 두 사람은 정식 기록에 있는 이름이었는데도 언제든 지워질 수 있었다. 그런데 애초에 이름이 없는 사람은 어떻게 자기 존재를 증명할까.
강문석은 서둘러 ‘중복 제거’ 버튼을 누르지 않았다. 그 대신 미확인 한 명을 별도로 표시한 뒤 원본 상태를 보존했다. 우리는 누락된 사람을 찾을 때까지 안전 종료를 완료했다고 선언하지 않기로 했다.
나는 숫자를 다시 보았다.
사람이 한 명 더 있었다.
그 한 명은 누구의 이름으로도 기록되지 않았다.
제56화 댓글 0
댓글·공감·신고는 로그인 후 이용할 수 있습니다. 이전 익명 댓글은 그대로 표시됩니다.
댓글을 불러오는 중입니다.