<aside> 비로그인 상태로 메일 인증을 받으면 패스워드를 변경할수 있습니다. 이때 RateLimit를 통해서 횟수 제한을 걸지 않으면 테스트 전문 프로그램인 BurpSuite를 통해 성공할때까지 무작위 값을 돌려 패스워드를 탈취할수 있습니다. 또한 메일 발송을 AWS를 통해 하게 된다면 많은 비용이 발생됩니다.
</aside>
BurpSuite를 통해 악의적인 사용자가 직접 운영하고 있는 NFT 사이트에서 지속적인 요청으로 패스워드 인증을 성공하고 계정을 탈취하는 이슈를 유튜브에 올린 영상입니다.
https://youtu.be/LcWb7stBsLw?si=Zyj1I2294MrV5Tr-

악의적인 사용자에게 BurpSuite로 브루트 포스트 공격을 당하는 상황입니다. 해당 이미지는 GIF 이미지로 PDF시 정적인 이미지로 대체되며, 자세한 내용은 노션에서 확인 할수 있습니다.
로그인 상태에서 패스워드 변경 인증시 이메일을 키값으로 횟수를 카운팅하여 일정 횟수 이하로만 요청 할수 있지만 비로그인 상태에서 패스워드 변경 인증은 요청자의 IP를 통해 접근 제한을 해야 합니다. 특정 엔드포인트로 지속적으로 요청을 보낼때 비용이 발생하거나 중요한 비즈니스 로직 같은 경우에는 적절한 RateLimit 사용하는 것이 좋습니다.
먼저 Spring 코드를 살펴보고 다음으로 Laravel 코드를 알아보도록 하겠습니다.
모든 API에 RateLimit를 적용할 때는 filter를 사용되지만, 저는 비용 발생이 되는 부분만 RateLimit를 적용하기 위해 AOP를 사용하였습니다.
AOP로 핵심적인 기능(메일 전송)에서 부가적인 기능(횟수 제한)을 분리하면 되는데 분리한 부가기능을 에스펙트(Aspect)라는 모듈 형태로 만들었습니다.

RateLimit 적용이 필요한 서비스에 @RateLimit 애너테이션을 정의합니다. 그리고 키값, 초당 허용 횟수, 제한 주기를 작성합니다.

직접 만든 RateLimit 애너테이션은 DTO 역할과 유사한데 프록시 객체를 생성할 (AOP 프록시 객체가 적용되는 과정 ) 해당 값들을 RateLimit 애너테이션에 설정됩니다.
