26화

외부 배송관리 서비스의 보존 기한은 열두 시간이었다

증거분석관은 빠진 말을 듣는다 · 2026. 10. 13.

조회수 0

외부 배송관리 서비스의 보존 기한은 열두 시간이었다. 04:03의 두 토큰과 승인 경로를 확인하지 못하면, 다음 날 새벽 서버가 자동으로 중계 기록을 지울 수 있었다. 회색실은 원본을 확보해야 했지만, 송주혁은 자신의 회사 계정에 직접 접근하는 것을 거부했다. 거부권은 인정됐고, 기한은 줄어들고 있었다.

민우는 회의실 화이트보드에 시간을 크게 썼다. 10:12 보존 요청, 14:00 법무 검토, 16:00 외부 검토자 지정. 그 뒤에는 삭제 예정 시각이 있었다. 그는 마지막 숫자에 줄을 두 번 그었다.

“이대로면 원본을 보기도 전에 사라집니다.”

서진은 접근권 표를 펼쳤다. 원본 보존은 즉시 가능하지만, 내용 열람은 이중 검토가 필요했다. 송주혁의 회사 계정에는 개인정보와 미등록 노동자의 흔적이 섞여 있을 수 있었고, 그 자료를 회색실이 통째로 복제하면 보호 대상이 드러날 위험이 있었다.

“원본을 보존하는 권한과 내용을 보는 권한을 나눠야 합니다.”

“나누는 동안 삭제되면요?”

“삭제되지 않게 하는 요청부터 먼저 넣습니다.”

여름은 플랫폼에 범위를 특정한 보존 명령을 보냈다. 04:02부터 04:05까지, 정상 완료 토큰과 취소 토큰, 승인 경로와 기기 식별자. 계정 전체와 다른 배송자의 기록은 제외했다. 민우는 범위를 넓히자고 했지만, 송주혁이 거부할 수 있는 자료라면 최소 범위가 먼저였다.

송주혁은 화면을 읽고 한 줄을 추가했다. ‘보존 대상에 보호기관이 지정한 비공개 식별자는 포함하지 않는다.’

“이걸 넣으면 서버가 요청을 거부할 수 있습니다.” 여름이 말했다.

“그럼 거부 이유와 대체 보존 방법을 받으세요.”

그는 자신의 회사 계정으로 직접 들어가지 않았다. 대신 외부 검토자에게 일회성 승인 코드를 보냈다. 회색실은 그 코드의 원문을 받지 않고, 사용 시각과 결과만 받기로 했다. 송주혁의 독자적인 목적은 수사를 돕는 것과 보호 대상을 감추는 것 사이에 있었고, 어느 한쪽으로만 설명되지 않았다.

오후 두 시, 플랫폼 법무팀에서 보존 요청의 범위를 줄여 달라는 답이 왔다. 계정 식별자와 배송기사 정보가 개인정보라는 이유였다. 민우가 즉시 전화를 걸려 하자 서진이 손을 들었다.

“전화보다 서면으로 답을 남기게 하세요. 누가 어떤 범위를 거부했는지 기록이 필요합니다.”

민우는 짧게 숨을 내쉬고, 두 번째 요청서를 작성했다. 기기 식별자는 해시로, 배송기사 이름은 가명으로, 승인 경로는 사건번호와 연결된 토큰으로 요청했다. 플랫폼은 그 범위를 받아들였지만, 원본 접근은 외부 보안실에서만 가능하다고 했다.

송주혁은 외부 보안실에 들어가기를 거부했다. 자신이 원본을 보는 순간, 보호 대상의 자료가 노출됐다는 의심이 생길 수 있다는 이유였다. 그는 해시와 승인 경로만 회색실에 전달하고, 내용 열람은 외부 검토자와 법률기관이 하도록 제안했다.

“당신이 거부하면 범행 자료도 같이 닫힐 수 있습니다.” 민우가 말했다.

“그래서 물리 기록은 제가 제공하겠습니다. 제 계정 안의 사람 자료만 열지 말아 주세요.”

서진은 그의 조건을 문장으로 옮겼다. 거부권의 대상과 만료 시각, 독립 자료를 대체할 방법. 송주혁은 ‘보호 대상의 신원은 공개하지 않되 배송 장비와 시간 기록에는 접근 가능’이라고 확인했다.

오후 네 시, 외부 검토자가 도착했다. 그는 서버 원본을 먼저 복제하지 않고, 보존된 해시와 중계 경로의 목록만 확인했다. 민우는 그 절차가 답답해 보였지만, 검토자는 이유를 설명했다.

“원본을 보는 순간, 보는 사람이 새로운 자료의 소유자가 됩니다. 지금은 누가 봐도 되는지부터 확정해야 합니다.”

검토자는 서진의 능력 기록도 요청했다. 서진은 ‘빈집’ 출력과 비용 기록을 제출했지만, 그것을 증거 목록에 넣지 말라고 했다. 외부 검토자는 그 단어가 사건표의 첫 가설에 사용됐다가 폐기된 과정을 확인하고, 오독 경고를 추가했다.

민우는 불만을 표했지만, 서진이 먼저 말했다. “이 경고가 있어야 제가 다음 원본을 들을 때도 같은 실수를 피합니다.”

보존 시한까지 두 시간이 남았을 때, 서버에서 첫 로그가 나왔다. 정상 토큰은 배송기기에서 직접 발급됐고, 취소 토큰은 외부 승인 경로에서 재발급됐다. 그러나 승인 경로의 서비스 계정은 두 개였고, 어느 계정이 먼저 요청했는지는 원본 열람 권한이 없으면 확인할 수 없었다.

송주혁은 그 결과를 보고도 자신의 계정에 대한 열람을 허용하지 않았다. 대신 회사 물류장비의 전력과 접속 기록을 추가로 넘겼다. 그 기록에는 04:01에 냉장 구역의 전력이 상승하고, 04:03에 운영실 테스트폰이 깨어난 것이 남아 있었다. 사람의 이름은 없었지만, 장비가 움직인 순서는 확인됐다.

서진은 사건표에 두 갈래를 그렸다. 첫째, 송주혁이 자신의 차량과 회사 장비를 사용해 배송을 대신했을 가능성. 둘째, 다른 사람이 운영실 테스트폰과 외부 승인 경로를 이용해 사진과 토큰을 만들었을 가능성. 둘은 일부 시간대가 겹치지만, 하나의 범행으로 합치지 않았다.

민우가 말했다. “두 번째 사람이 있다면 송주혁이 숨긴 사람과 같을 수도 있습니다.”

“가능성은 있습니다. 하지만 이름을 알아내기 위해 거부권을 무시할 수는 없습니다.”

“그럼 어떻게 좁힙니까?”

“장비가 먼저 말하게 합니다.”

민우는 그 말을 듣고 운영실 테스트폰의 전력 기록과 냉장 구역 센서의 시각을 맞췄다. 두 장치의 시계가 0.7초 어긋났지만, 깨어난 순서는 같았다. 취소 토큰은 사진 생성 뒤가 아니라 사진 생성과 거의 동시에 발급됐다. 누군가 사진을 만든 뒤 나중에 토큰을 취소한 것이 아니라, 두 이벤트를 하나의 서비스 흐름에서 만들었을 가능성이 생겼다.

보존 시한 삼십 분 전, 플랫폼은 원본을 봉인했다. 외부 검토자는 봉인 해시를 확인하고, 회색실에는 요약본만 넘겼다. 송주혁은 보호 정보가 포함된 원본을 보지 않았고, 회색실도 그가 가진 회사 계정의 전체 내역을 열지 않았다.

민우는 서류를 접으며 말했다. “이렇게까지 분리하면 서로 아무것도 모르게 됩니다.”

여름이 답했다. “아무것도 모르는 게 아니라, 알아도 되는 것만 아는 겁니다.”

서진은 자신의 접근권한 표에 새 조건을 추가했다. 원본을 열람할 때에는 민우와 외부 검토자가 함께 확인하고, 능력 사용을 선택할 경우 출력과 비용을 즉시 기록한다. 송주혁이 거부한 자료는 다른 물리 기록으로 대체하고, 거부 자체를 범행 증거로 쓰지 않는다.

밤이 되자 송주혁은 자신의 승인 코드가 외부 서비스에서 사용된 시각을 확인했다. 그는 그 코드가 누구에게 전달됐는지 말하지 않았지만, 코드가 사용된 뒤 곧바로 폐기됐다는 사실은 공개했다. 보호를 위해 입을 다문 행동이 한편으로는 증거 하나를 닫았고, 다른 한편으로는 서버 원본 하나를 살렸다.

서진은 그 모순을 정리해 기록했다.

‘송주혁의 거부는 수사를 지연시켰으나, 최소 범위 보존을 가능하게 했다. 거부를 선의 또는 은폐로 단정하지 않는다. 다음 단계는 승인 경로와 장비 순서를 독립 검증하는 것이다.’

보존 서버의 시계가 04:03을 가리켰다. 원본은 남아 있었고, 열람 권한은 아직 나뉘어 있었다. 회색실은 사건을 빨리 아는 대신, 누가 무엇을 알게 되는지 기록하는 쪽을 선택했다. 다음 날 아침, 민우는 전날 확보한 물류 기록을 다시 펼쳤다. 그는 송주혁이 빈집 앞까지 갔다는 사실과, 운영실 테스트폰이 사진을 만든 사실을 하나의 동선으로 묶으려 했다. 서진은 그 표에 두 번째 시간을 넣었다. 송주혁의 차량 도어가 열린 시각과 테스트폰이 깨어난 시각은 가까웠지만 같지 않았다.

“가까운 시간이 같은 행동이라는 뜻은 아니죠.”

“그럼 따로 놓으면 사건이 둘로 갈립니다.”

“처음부터 둘일 수 있습니다.”

민우는 잠시 생각하다가, 자신의 보고서에서 ‘송주혁의 배송 조작’이라는 제목을 지웠다. 대신 ‘배송 대행과 사진·토큰 생성의 관계’라고 적었다. 제목 하나가 용의자의 책임을 앞당기지 않도록 하는 수정이었다.

송주혁은 외부 검토자가 작성한 요약본을 읽고도 자신의 회사 계정에 대한 거부를 철회하지 않았다. 그는 대신 물류창고의 전력 계측기 원본과 운영실 문 개폐 기록을 추가로 제공했다. 그 자료에는 아딜의 신원이 없고, 송주혁이 말하지 않은 사람의 흔적도 직접 드러나지 않았다.

서진은 그 자료를 보관하며 송주혁에게 말했다. “이 정도면 충분히 도움을 주고 있습니다.”

“도움이 아니라 거래입니다.”

“조건을 지키는 것과 거래하는 것은 다릅니다.”

“저는 아직 당신들을 믿지 않습니다.”

“저희도 당신의 말만으로 결론을 내리지는 않습니다.”

그 대화는 관계가 좋아졌다는 신호가 아니었다. 서로의 한계를 말할 수 있다는 신호였다. 서진은 관계표에 ‘조건부 협력, 독자 목적 유지’라고 적었다.

저녁 무렵 외부 서비스가 승인 계정 중 하나의 기기 지역만 공개했다. 지역은 물류창고와 같은 구역이었지만, 정확한 위치는 비공개였다. 서진은 그 정보로 송주혁을 다시 의심하지 않았다. 같은 지역에는 운영실, 배송차량, 외부 서비스의 중계기가 모두 있었다.

민우는 보존된 원본을 열람하기 위해 외부 검토자와 함께 들어갔다. 서진은 옆자리에서 화면을 보았지만, 능력 사용은 선택하지 않았다. 원본에는 목소리가 없었고, 영상의 센서 결함이 사진의 일부 색을 번지게 만들었다. 카메라 결함은 누군가 사진을 복제했다는 가설을 약하게도, 강하게도 만들 수 있었다.

“사진이 테스트폰에서 만들어졌다는 건 확정입니다.” 민우가 말했다.

“만든 사람이 누구인지는 아닙니다.”

외부 검토자는 동의했다. 그는 영상 원본의 프레임 해시와 서버 토큰의 요청 해시를 비교했다. 두 해시는 같은 장치에서 나온 것이 아니라, 운영실 테스트폰의 사진을 외부 서비스가 별도 요청으로 넘겨받은 구조를 보였다. 사진 생성과 토큰 발급은 연결됐지만, 사람의 이름은 연결되지 않았다.

서진은 그 제한을 보고서에 남겼다. 사건이 좁혀졌다는 말은 범인이 좁혀졌다는 말과 달랐다. 물리 기록은 서비스 경계를 보여 주었고, 그 경계 밖의 사람은 아직 보이지 않았다.

밤 열한 시, 송주혁은 회색실을 나서며 한 번 멈췄다. “아딜이 연락하지 않으면, 이름을 알아내려고 하지 마십시오.”

서진은 고개를 끄덕였다. “대신 온도와 전력, 토큰의 흐름으로 사건을 세우겠습니다.”

“그게 가능합니까?”

“가능한 만큼만요.”

송주혁은 그 대답을 듣고 돌아섰다. 서진은 그가 안심했는지 알 수 없었다. 다만 다음 보존 요청의 범위가 누구의 이름을 필요로 하지 않도록 설계되어야 한다는 것은 분명했다.

이번 화가 재미있었나요?

좋아요와 평점은 언제든 변경할 수 있습니다.

독자 평점 아직 없음

댓글

댓글을 작성하려면 로그인해 주세요.