Skip to content

[프로젝트 설계] DDOS 대응 방안

MoonMinHyuk1 edited this page Apr 25, 2023 · 1 revision

서비스의 DDOS 공격을 대응하기 위해 Bucket4j 라이브러리를 도입

사용방법

하나의 Bucket에 토큰의 개수를 정할 수 있고, 한 번의 요청마다 한 개의 토큰이 사용됩니다.

intervally방식이나 greedy방식 중 하나를 사용해 토큰의 충전 방식을 선택할 수 있습니다.

  • intervally 방식은 설정한 시간마다 설정한 토큰을 한번에 충전합니다.
  • greedy 방식은 (설정한 시간 / 설정한 토큰의 수)초마다 토큰이 1개씩 충전합니다.
  • 저희 서비스에서는 greedy 방식을 선택했습니다.

진행과정

api 요청 시 요청 횟수 제한을 걸었는데, 두 분류로 나누어 적용했습니다.

  • 첫번째는, 외부 api를 사용하고 금전적 비용이 사용되는 SMS 전송 요청입니다.
  • 두번째는, SMS 전송 요청을 제외한 모든 요청입니다.

SMS 전송 요청

  • 버킷에 총 100개의 토큰을 설정했습니다. 60초 동안 100개의 토큰을 생성하는데, greedy형식을 사용하기 때문에 (60 / 100) = 0.6초 동안 1개의 토큰을 생성합니다.

그 외 요청

  • 버킷에 총 10000개의 토큰을 설정했습니다. 60초 동안 10000개의 토큰을 생성하는데, greedy형식을 사용하기 때문에 (60 / 10000) = 0.006초 동안 1개의 토큰을 생성합니다.

스프링 인터셉터에서 버킷의 토큰을 검증하고, 요청을 처리해주거나 예외를 던집니다.

만일 버킷에 토큰이 없을 때 요청하면, 예외가 호출되고 오류 메세지를 반환합니다.

이슈

해당 기능을 개발하고 pr을 생성했을 때, CI 중 build부분에서 오류가 발생했습니다.

스크린샷 2023-04-26 오전 3 28 11
  • 버킷을 관리하는 파일을 자바 언어 타입으로 생성하고, 스프링 인터셉터 파일은 코틀린 언어 타입으로 생성한 후, 인터셉터에서 자바 언어 타입의 파일을 주입받아서 사용했습니다.
  • 위의 클래스를 찾을 수 없다는 오류의 이유는 컴파일 시점에 자바 파일보다 코틀린 파일이 먼저 컴파일 되는데 있었습니다.
  • 자바 파일을 의존하는 코틀린 파일을 컴파일할 때 자바 파일을 찾을 수 없어 발생했던 오류였습니다.
  • 서비스를 코틀린 파일로 변경하고 build했더니 해결되었습니다.
Clone this wiki locally