[ Core ] Redis 장애 시 rate limit 이 fail-open 하지 못하고 민감 경로 설정이 무효다 #87
Copy link
Copy link
Labels
Milestone
Description
💚 어떤 기능인가요?
전 구간 기본 rate limit 인 RateLimitInterceptor 에 두 가지 결함이 있다.
1. fail-open 이 절반만 적용된다
DataAccessException 을 잡는 try 블록이 increment 만 감싸고 있고,
redisTemplate.getExpire(key) 는 보호 밖에 있다.
Redis 장애가 그 경로에서 나면 그대로 500 이 되어, 카운터를 못 세는 것 때문에
서비스 전체가 멈춘다. DataAccessException 이 아닌 실패(opsForValue() 가 null 인 경우 등)도
마찬가지로 새어 나간다.
2. 민감 엔드포인트 등급이 한 번도 적용된 적이 없다
return path.startsWith("/api/v1/contact") || path.startsWith("/api/v1/auth/signup");이 애플리케이션에는 /api/v1 로 매핑된 컨트롤러가 하나도 없다.
BaseController 의 @RequestMapping("/api/v1") 은 하위 클래스가 전부 덮어쓴다.
즉 로그인·가입이 낮은 한도(30/분)가 아니라 일반 한도(120/분)로 처리돼 왔다.
3. 엔드포인트별 상한 부재
POST /chatbot/chat 은 요청 한 건이 곧 유료 LLM 호출인데 전역 300/분만 적용된다.
@RateLimit 어노테이션은 잘 구현돼 있으나 사용처가 /auth/login 한 곳뿐이다.
또 perUser=true 인데 키를 IP 로 만들어, NAT 뒤 사용자들이 한도를 나눠 쓰고
반대로 IP 를 바꾸면 우회된다.
✅ To Dos
- TTL 조회를 포함해 카운터 관련 런타임 실패 전체를 fail-open 처리
- 민감 엔드포인트 목록을 실제
/auth/*경로로 교체 - 챗봇·가입·인증코드 발송/검증에
@RateLimit부착 - AOP 키를 IP 대신 인증 principal 우선으로
- 운영 프로파일에서
RATE_LIMIT_TRUST_XFF검토 (프록시 뒤라 IP 집계가 무의미) - fail-open 회귀 테스트
Activity