편집복원내용 검수 완료2025년 정보보안기사 4회 필기 · 애플리케이션 보안 · 경쟁 조건 · 50번
잔액 확인과 차감이 분리되어 동시에 두 요청이 성공한다. 해결책은?
처리 흐름: 잔액 조회 후 별도 UPDATE
동시성 조건: 같은 계정에 두 요청이 동시에 도착
1
각 애플리케이션 인스턴스에서만 프로세스 로컬 뮤텍스를 건다.
오답 이유프로세스 로컬 뮤텍스는 같은 인스턴스 안에서만 작동하므로 여러 서버 인스턴스의 동시 갱신을 직렬화하지 못한다.
2
원자적 조건부 갱신이나 적절한 트랜잭션 잠금을 사용한다.
정답 근거조건 검사와 차감을 원자화하거나 행 잠금으로 직렬화하면 두 요청이 같은 이전 잔액을 기준으로 성공하는 경쟁 조건을 막을 수 있다.
3
잔액을 조회한 뒤 READ COMMITTED 트랜잭션에서 조건 없이 차감 값을 갱신한다.
오답 이유조회와 무조건 갱신이 분리되어 있으면 READ COMMITTED에서도 다른 요청의 변경을 덮어쓰거나 잔액 조건을 우회할 수 있다.
4
요청마다 멱등성 키를 기록하지만 잔액 조건 검사와 차감은 계속 분리한다.
오답 이유멱등성 키는 같은 요청의 재전송을 줄이지만 서로 다른 두 요청이 동시에 잔액을 차감하는 경쟁 자체는 해결하지 않는다.
정답·상세해설
정답 2번
여러 요청이 같은 잔액을 읽은 뒤 각각 차감하면 검사 시점과 갱신 시점 사이에 경쟁 조건이 생깁니다. `UPDATE account SET balance = balance - :amount WHERE id = :id AND balance >= :amount`처럼 조건 검사와 차감을 하나의 원자적 갱신으로 묶고 영향 행 수를 확인하거나, 동일 행을 트랜잭션 잠금으로 직렬화해야 합니다. 프로세스 로컬 잠금은 다중 인스턴스를 막지 못하고 멱등성 키만으로는 서로 다른 동시 요청의 잔액 경쟁을 해결하지 못합니다.