본문 바로가기
Project/Error Management

[Error] ATM 이중인출 Error 발생 실제 사례

by 꾸압 2022. 5. 27.

 

<실제 문제 상황>

atm에서 어떤 사용자가 이중인출하여 갔다. 은행에서 항의가 들어와 문제를 찾아보니 서버, DB, OS, 네트워크, 하드웨어 등 시스템에 문제는 없었다.

문제 발생의 원인인 프로그램은 무슨 문제가 있었던 것인가?

8-90년대에 발생한 문제임을 감안하여 생각할 것(1금융권에서 발생)

 

* 전제 1 : ATM 사용자의 잔고는 1천만원 이었다. 사용자는 잔고가 부족함에도 2천만원을 인출하였으나 프로그램 및 시스템에 장애 발생은 없었다.

* 전제 2: 이중인출은 1천만원이 각각 다른 process에서 2번 발생한 것이다. 인출 + 인출과 같은 비정상적인 process가 아니다. 1천만원을 입력하였더니 2천만원이 나오는 error도 아닌 셈.

* 전제 3 : 현재 ATM 시스템은 모든 과정을 마쳐야만 카드를 뺄 수 있으나, 당시 과거엔 조회만 하는 경우 중간에 카드를 뺄 수 있었음

* 전제 4 : ATM 사용자는 일반적인 process를 따라 행동하였다. 즉, 뭔가 이상한걸 누르거나 조작, 위법을 행하여 이중인출이 발생하지 않았다.

 


 

<해설>

상무님 해설 이미지

 

[상무님 해설]

=> 프로그램 자체 문제다.

당시 추석-설날 등으로 서버에 traffic이 과하게 몰렸던 상황.

ATM 사용자가 최초 접속한 ATM기계가 잔고 조회 과정에서 서버 과부화로 다음 화면으로 넘어가지 않고 멈춤. 잔고는 1천만원으로 찍힌 상태.

사용자는 옆의 기계를 사용. 2번째로 사용한 기계는 서버 장애를 겪지 않았기에, 잔고 1천만원이 새로 조회된 상황에서 인출을 함. (1천만원 인출, 잔고 0)

사용가 2번째 ATM기계에서 인출을 마치고, 1번째 ATM기계를 보니 그 와중에 lag가 풀려 조회 다음 화면으로 넘어갔음. 잔고는 여전히 1천만원으로 찍힌 상태.

사용자는 궁금증에 1천만원 인출을 시도. 1번째 ATM은 서버와 통신하여 다시 잔고 조회를 하지 않고 바로 인출을 해줌.

사용자는 정상 process를 통해 2천만원을 이중이체함.

=> 상무님 피셜 : 이런 상황에 대비하여 process 중간중간에 확인 작업을 해둬야한다. 개발자가 잘못했다.

 

[이사님 해설]

=> 기계의 문제다.

기계가 서버와 통신을 정상적으로 이행했으면 발생하지 않았을 것. 프로그램 로직 자체에 문제는 없었다. 오류아닌 오류에 대한 확인 작업을 못했을 뿐.

사용자가 각각 다른 기기에서 등록 작업(인출)을 동시에 할 경우 발생할 수 있음.

요즘은 시스템에서 동시 등록을 막음. 과거엔 하나의 DB, 서버에 동시 post를 할 수 있었음

(한쪽이 post를 한다고 다른 모든 사용자에 lock을 걸 수 없기에. 상용 서비스 중인데 한쪽이 하루 종일 post하고 있으면 그만큼 lock을 건다?)

대안으로 한 사용자(개발자)가 수정-등록 중에는 flag를 찍음으로써, 다른 사용자는 해당 부분이 수정중인걸 인지 할 수 있음. (이중 등록 방지)

개발 과정에서는 SVN, GIT 등 형상관리 tool을 통해 이중 post를 막고, 서비스 중에는 요청 순서대로 처리한다.

 

** 이 문제와는 결이 다르지만 sql 작업 중 db를 덮어 씌워 기존 db가 날아가는 경우가 왕왕 발생한다고 한다.

여러 개발자가 있다. 한 개발자는 1~20, 다른 개발자는 21-40 등을 순서대로 db 작업하기로 했다.

말 그대로 순서대로 넣었으면 문제가 없으나, 21~40의 작업자가 db scale을 1~40으로 잡아놓고 21~40 db 작업을 하면 1~20까지 기존해 해둔 db는 날아간다. ^^

신입이 자주하는 실수라고 하니 주의해야지

 

[정리] traffic 과다로 이중 post되었으며, 그 과정을 중간에 확인하지 않아 발생한 문제.

 

 

댓글