2019년 가을, 저는 캘리포니아 치노에 있는 120,000평방피트 규모의 3PL 창고에서 시스템 지원을 하고 있었습니다. 추수감사절 피크가 막 끝나가고, 새 고객이 입주를 시작했는데, 창고 관리자가 먼저 순회 실사를 돌려 달라고 했습니다. 사흘째 되는 날, 시스템과 실물 재고가 맞지 않았습니다. 40개가 넘는 카톤이 사라졌고, 금액으로는 수십만 달러어치였습니다. 더 나쁜 것은, 누군가 시스템의 출고 기록을 건드렸다는 점이었습니다. 기록이 있어야 할 자리에 문서 번호가 비어 있었습니다. 누가 언제 삭제한 걸까요? 로그는 아무것도 알려주지 못했습니다.
꼬박 일주일 동안 그 건물에 있는 열댓 명이 한 명씩 조사를 받았습니다. 결국 용의자 범위를 좁히는 데는 성공했지만, 실제로 삭제 버튼을 누른 사람을 특정할 증거는 없었습니다. 고객은 이 일로 계약을 거의 철회할 뻔했습니다. 그 사건은 지금도 잊히지 않는 교훈을 남겼습니다. 대부분의 창고에서 WMS 권한은 "너무 복잡해서"가 아니라, 처음부터 제대로 설정된 적이 없었던 것입니다.
평상시에는 아무도 권한을 생각하지 않습니다. 오픈 당일, 구축 컨설턴트는 손쉬운 길을 택해 모두에게 거의 같은 권한을 주었습니다. 그 후 사람이 들고 나면서, 권한은 늘어나기만 하고 줄어든 적이 없습니다. 결국 문제가 터지자 화면의 모든 계정이 용의자로 보였습니다.
누가 문서를 삭제할 수 있을까?
제 입장은 간단합니다. 하나의 창고에서 문서를 삭제할 수 있는 사람은 한 명, 창고 관리자뿐이어야 합니다.
사건 후 가장 먼저 한 일은 모든 계정의 권한을 시스템에서 내보낸 것입니다. 결과는 참담했습니다. 일곱, 여덟 개 계정이 삭제 권한을 가지고 있었습니다. 관리자나 슈퍼바이저는 물론, 고객 응대 담당자나 파견 직원 두 명까지 입고 및 조정 문서를 삭제할 수 있었습니다. 고객 응대 담당자에게는 지극히 합당한 변명이 있었습니다. 고객이 주문을 잘못 입력했다고 전화가 와서, 삭제하고 다시 입력했다는 것입니다. 시스템에는 아무 흔적도 남지 않았습니다.

삭제와 무효화는 다른 것입니다. 그 구분이 중요합니다. 무효화는 문서의 상태를 취소로 바꾸는 것이며, 기록은 남아 감사를 받을 수 있습니다. 삭제는 기록을 완전히 지워버립니다. 누구도 복구할 수 없습니다. 정상 운영에서는 무효화로 항상 충분합니다. 삭제 기능은 1년에 몇 번 쓰일까 말까 합니다. 제 방식은 이렇습니다. 일반 역할의 삭제 권한은 모두 끄고 무효화만 남깁니다. 삭제는 창고 관리자에게만 주고, 사용할 때마다 사유를 필수로 입력하게 하며, 그 사유를 로그에 기록합니다.
사람들이 놓치는 디테일이 하나 더 있습니다. 많은 WMS 제품에서 삭제 로그와 업무 로그가 분리되어 있고, 삭제 로그는 기본적으로 꺼져 있습니다. 오픈 검수 때 직접 테스트해 보세요. 테스트 문서를 만들어 삭제한 뒤, 누가, 언제, 어떤 문서를 삭제했는지 로그에 나오는지 확인하십시오. 나오지 않는다면 검수는 끝난 게 아닙니다.
왜 입고 담당자가 재고를 조정할 수 있을까?
두 번째 함정은 직무 분리의 실패입니다. 입고 수량을 확정하는 사람이 재고 조정을 등록할 수도 있다면, 선수와 심판을 겸하는 셈입니다.
제가 본 가장 전형적인 사례입니다. 입고 담당자가 Zebra 휴대용 단말기로 입고를 스캔했는데, 송장과 수량이 맞지 않았습니다. 열두 박스 남짓이 모자랐습니다. 보고하는 대신 스스로 재고 조정을 등록해 장부를 맞췄습니다. 3개월 후 고객이 실사에서 부족을 발견했지만, 공급사 클레임 기한은 한참 전에 지났고, 창고가 손실을 떠안았습니다. 입고 담당자는 훔친 게 아닙니다. 귀찮음과 꾸지람을 피하고 싶었을 뿐입니다. 작은 문제를 내버려 두면 큰 문제가 됩니다.
원칙은 간단합니다. 입고 담당자의 일은 충실히 기록하는 것이고, 조정할 권한은 다른 사람의 것입니다. 표준 관행은 2단계 조정입니다. 신청자가 차이 사유를 적고, 슈퍼바이저 이상이 검토·승인하며, 시스템이 두 사람의 이름을 두 개의 액션에 각각 기록합니다. 금액이 큰 조정, 예를 들어 상품 가치 1,000~2,000달러를 넘는 것에는 승인 단계를 하나 더 추가합니다. 기준치는 자사 창고의 평균 주문 금액에 맞춰 정하십시오. 남의 숫자를 베끼지 마십시오.
또, 실사 조정과 일상 조정은 다르게 다뤄야 합니다. 실물 실사는 차이를 찾기 위해 하는 것이므로, 차이 문서는 정상 프로세스를 따르면 됩니다. 하지만 실사 시간 외에 수동으로 하는 조정은, 한 건 한 건 잘 살펴볼 만합니다. 저는 시스템이 매일의 수동 조정 목록을 관리자에게 이메일로 보내게 하는 방식을 좋아합니다. 몇 줄보다 길면 관리자가 클릭해서 들여다봅니다. 이 습관을 유지하면 대부분의 작은 장난은 커지기 전에 막힙니다.
퇴사자의 계정은 누가 닫을까?
세 번째 함정은 가장 지루하고 가장 흔한 것입니다. 사람은 떠났는데 계정은 살아 있습니다.
3PL에 있는 사람은 누구나 알지만, 현장 이직률은 높습니다. 피크 시즌용으로 파견을 대량 채용했다가 한가해지면 보냅니다. 여러 창고를 점검해 봤는데, 직원이 떠난 지 3개월이 지나도 유효한 계정이 거의 모든 창고에 있었습니다. 그 계정은 누구 손에 있을까요? 떠난 본인인 경우도 있고, 현직 직원이 "빌려" 쓰는 경우도 있습니다. "그 사람 계정은 풀 권한이니까, 신청할 필요 없이 그냥 쓴다." 여러 사람이 하나의 계정을 공유하면, 문제가 터져도 제대로 물어볼 수조차 없습니다.
해결책은 복잡하지 않습니다. 지키는 게 어렵습니다. 철칙 두 가지입니다. 첫째, 계정은 직원의 마지막 날 퇴근 전에 비활성화합니다. 이것은 인사부의 퇴직 통지 절차의 일부이지, "언젠가" 하는 업무가 아닙니다. 둘째, 인사부 인력 명단과 시스템 계정을 한 달에 한 번 대조합니다. 맞지 않는 것은 일단 비활성화하고 나서 질문합니다. 피크 시즌용 임시 계정은 처음부터 만료일을 넣어 자동으로 죽게 합니다. 아무도 기억할 필요가 없습니다.
한 가지 시나리오가 더 있습니다. 창고 안에서 역할이 바뀌는 경우입니다. 피커에서 체커로, 야간에서 주간 리드로. 역할이 바뀌었으니 권한도 바뀌어야 하고, 예전 권한은 반납입니다. 대부분의 창고는 권한을 더하기만 하고 빼지 않아서, 3년 차 베테랑은 가져선 안 될 권한을 한가득 안게 됩니다. 제 제안은 이렇습니다. 역할이 바뀔 때마다 권한을 리셋하십시오. 먼저 0으로 만들고 새 역할에 맞게 다시 부여합니다. 10분의 수고로 묻혀 있던 지뢰 하나를 없앱니다.
권한이 건강한지 측정하는 간단한 테스트가 있습니다. 내일 아침 카톤 하나가 사라졌다고 할 때, 1시간 안에 시스템 로그에서 누가 언제 그 카톤을 건드렸는지 찾을 수 있을까요? 할 수 있다면 권한과 로그가 살아 있는 것입니다. 할 수 없다면 2019년의 저희처럼 알몸인 셈입니다.
내일 당장 할 수 있는 일이 세 가지 있습니다. 첫째, 모든 계정과 권한을 내보내고, 문서 삭제, 수동 조정, 마스터 데이터 내보내기라는 고위험 권한 세 가지를 회수해 창고 관리자에게만 남깁니다. 둘째, 퇴사자의 계정을 찾아 당일 비활성화하고, 임시 계정에는 만료일을 넣습니다. 셋째, 운영 로그를 켜고 생성·편집·삭제 테스트를 직접 돌려 모든 단계에 흔적이 남는지 확인합니다. 이 세 가지를 하면 내부 통제가 이미 대부분의 창고보다 앞서 있습니다.
마지막으로 한 마디. 권한은 처음에 빡빡하게, 나중에 풀어야 합니다. 반대는 절대 안 됩니다. 빡빡하면 불평이 나오고, 느슨하면 문제가 터졌을 때 진짜 돈이 사라집니다.
영어판 번역본입니다. 내용이 다를 경우 영어판을 우선합니다.











