## 문제 설명 `removeWaiting` 메서드에서 사용자별 웨이팅 제한 카운트를 감소시킬 때 반환값을 검증하지 않아, 카운트가 음수로 내려가는 문제가 발생합니다. ### 발생 가능한 시나리오 1. 키가 존재하지 않거나 만료된 상태에서 `removeWaiting` 호출 → 카운트가 -1로 설정됨 2. 중복 취소 요청 시 카운트가 -2, -3 등으로 계속 감소 3. `incrementAndCheckWaitingLimit`에서 `current > maxLimit`만 검증하므로, 음수 값은 3L보다 작아 검증을 통과 4. 사용자가 최대 3회 대기 제한을 우회할 수 있는 취약점 발생 ### 추가 문제점 - `userWaitingLimitCountKey`에 TTL이 설정되지 않아 일일 한도 리셋 메커니즘이 작동하지 않음 ## 관련 파일 - `nowait-domain/domain-redis/src/main/java/com/nowait/domaincoreredis/reservation/repository/WaitingRedisRepository.java` - 해당 메서드: `removeWaiting(Long storeId, Long userId)` (Line 148-167) ## 관련 링크 - Pull Request: https://github.com/GTable/NoWait_BE_MultiModule/pull/349 - 리뷰 코멘트: https://github.com/GTable/NoWait_BE_MultiModule/pull/349#discussion_r2751174990 ## 제안된 해결 방안 1. `decrement` 후 반환값을 검증하여 0 미만이면 0으로 설정 2. `WaitingPermitLuaRepository`의 Lua 스크립트 패턴을 활용하여 원자적 연산으로 처리 3. `userWaitingLimitCountKey`에 TTL 설정 추가 (일일 리셋 메커니즘) --- _이 이슈는 @Jjiggu의 요청으로 생성되었습니다._
Activity