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