기업용 서비스에 ‘승인’ 버튼을 붙이는 것은 어렵지 않습니다. 어려운 것은 승인자가 휴가 중일 때 누가 대신 결정하는지, 승인 후 금액이 바뀌면 이전 승인이 유효한지, 두 명이 동시에 결재할 때 어느 결과가 맞는지입니다. 이 질문을 나중으로 미루면 승인 기능은 곧 메신저와 엑셀로 우회됩니다.
승인은 사람·대상·버전·시점·결정의 조합입니다. 누가 어떤 내용에 대해 어느 권한으로 판단했는지 재구성할 수 있어야 실무와 감사 모두에 쓸 수 있습니다.
문서 상태와 결재 상태를 나누자
신청서는 작성 중, 제출, 승인 완료, 반려, 취소처럼 상태가 변합니다. 결재 요청은 대기, 지정, 결정, 만료처럼 별도 수명주기를 가집니다. 둘을 하나의 status 필드에 몰아넣으면 ‘신청서가 승인됐지만 한 명의 결재 요청은 아직 대기’ 같은 모순을 만들기 쉽습니다. 신청서 버전과 결재 라운드 ID를 별도로 두어 같은 문서를 재상신해도 이전 결정과 혼동되지 않게 합니다.
승인 조건도 명확히 씁니다. 전원 동의가 필요한가, 순차 결재인가, 한 명만 승인하면 되는가? 반려가 나오면 즉시 종료하는가? 특정 금액을 넘으면 추가 승인자가 필요한가? 이 규칙은 UI 안내와 서버 검증이 동일해야 합니다. 화면에서 버튼을 숨기는 것만으로 권한이 보장되지는 않습니다.

대결은 계정 공유가 아니다
승인자가 자리를 비웠다고 아이디와 비밀번호를 동료에게 전달하는 방식은 누가 실제 결정을 내렸는지 지웁니다. 대결은 원 승인자, 대결자, 대상 업무·조직·금액 범위, 시작과 만료 시각을 가진 별도 위임 기록이어야 합니다. 결정 이력에는 ‘원래 승인 경로’와 ‘실제 결정자’를 모두 남깁니다. 관리자가 위임을 해제하거나 원 승인자가 복귀했을 때 진행 중인 요청을 어떻게 처리할지도 규칙으로 정합니다.
권한은 요청을 조회할 때뿐 아니라 승인 버튼을 누르는 순간 서버에서 다시 검사해야 합니다. 대결 기한이 끝났거나 조직 이동으로 권한이 바뀌었다면 이전 화면을 열어 두었다고 승인할 수 없어야 합니다. OWASP 권한 검증 가이드의 최소 권한과 매 요청 검사 원칙이 여기에 그대로 적용됩니다.
승인된 내용이 바뀌면 무엇을 무효화할까
승인 후 문구 하나가 바뀌는 경우와 결제 금액이 바뀌는 경우를 동일하게 취급할 수는 없습니다. 문서의 중요한 필드를 ‘승인 범위’로 정의하고 그 스냅샷이나 해시를 결정 기록에 묶습니다. 승인 범위 안의 값이 수정되면 재승인을 요구하고, 단순 메모처럼 의사결정에 영향 없는 항목은 별도 수정 이력만 남길 수 있습니다. 핵심은 어떤 변경이 재승인을 유발하는지 사용자에게 미리 알려주는 것입니다.
승인 후 신청서 원본을 조용히 덮어쓰지 말고 새 버전을 만듭니다. 이전 승인 기록은 삭제하지 않되 ‘어느 버전에 대한 승인인지’를 보여줍니다. 이미 실행된 발주나 지급은 문서 상태만 되돌리는 것으로 복구되지 않으므로 별도 취소·보상 절차가 필요합니다.

중복 클릭과 동시 결정도 업무 규칙이다
두 승인자가 거의 동시에 눌렀을 때는 데이터베이스 트랜잭션과 버전 조건으로 한 번만 상태가 이동하게 합니다. 클라이언트가 네트워크 오류로 요청을 재전송해도 같은 결정이 두 번 기록되지 않도록 요청 ID를 사용할 수 있습니다. 처리 결과와 알림 발송을 분리해 알림 실패가 승인 결과를 뒤집지 않게 합니다.
운영에서는 결재 대기 시간, 만료 건수, 대결 사용률, 재상신 횟수, 단계별 병목을 봅니다. ‘결재가 느리다’는 불만이 실제로는 승인자 부재인지, 규칙에 맞지 않아 계속 반려되는 것인지 분리해야 개선할 수 있습니다.
출시 전 체크리스트
- 상태와 결재 라운드, 대상 문서 버전을 구분한다.
- 순차·병렬·전원 동의·반려 종료 규칙을 문서화한다.
- 대결의 범위와 만료, 실제 결정자 기록을 설계한다.
- 중요 필드 수정 시 재승인 기준을 정의한다.
- 동시 승인·재시도·승인 후 취소를 테스트한다.
좋은 승인 시스템은 버튼을 빠르게 누르게 하는 시스템이 아닙니다. 결정이 어떤 내용에 대해, 누구의 권한으로, 언제 유효했는지 나중에도 설명할 수 있는 시스템입니다.
#승인워크플로 #전자결재 #대결 #재승인 #업무자동화 #권한설계 #B2BSaaS #감사추적 #결재시스템 #시스템설계