Skip to content

[ Core ] Redis 장애 시 rate limit 이 fail-open 하지 못하고 민감 경로 설정이 무효다 #87

Description

@RosieOh

💚 어떤 기능인가요?

전 구간 기본 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

  • TTL 조회를 포함해 카운터 관련 런타임 실패 전체를 fail-open 처리
  • 민감 엔드포인트 목록을 실제 /auth/* 경로로 교체
  • 챗봇·가입·인증코드 발송/검증에 @RateLimit 부착
  • AOP 키를 IP 대신 인증 principal 우선으로
  • 운영 프로파일에서 RATE_LIMIT_TRUST_XFF 검토 (프록시 뒤라 IP 집계가 무의미)
  • fail-open 회귀 테스트

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions