본문 바로가기

개발일지/TIL

[240121] 어뷰징 관련 내부&외부 허가 IP 적용

어뷰징 로직을 적용하고 간과한 것

💬 어뷰징 로직을 적용을 하고 생각지 못한 문제가 발생했다. 외부와 내부에서 허용을 해줘야 하는 IP도 벤을 걸리는 현상이 발견되었고 그로 인해 서비스 운영이 일시적으로 문제가 되었다.

 

✔ 내부 IP 벤 문제 발생

💬 회사 내부에서는 공통적으로 적용되는 로직은 별도의 프로젝트로 만들어 의존성을 부여를 했다. 어뷰징도 그런 로직 중 하나였고 외부 통신하는 프로젝트에만 의존성 업데이트를 했었기에 문제가 되지 않았다. 하지만 내부 통신하는 쪽 코드에 어뷰징이 담긴 모듈의 의존성을 업데이트해야 하는 상황이 발생했고 그로 인해 내부 IP에도 어뷰징 관련 로직이 적용이 되어 벤이 되는 현상이 나타난 것이다.

 

✔ 내부 IP 벤 대응 방안

💬 서버의 IP는 서버가 꺼졌다가 켜지거나, 증설이 되었다가 줄어들 수 있기에 변동성이 컸다. 그래서 IP를 등록을 해서 벤을 제외시키기에는 어렵다는 판단이 들었다. 그리고 내부 프로젝트이기에 이것보다 더 좋은 방안은 어뷰징 로직을 해당 프로젝트에서 동작하지 않도록 하는 것이었다. 그래서 Import Selector라는 것을 적용을 하여 어뷰징 로직 클래스가 내부 프로젝트에 동작을 하지 않도록 설정을 했다.

 

✔ 적용하기

1. ImportSelector를 상속받은 클래스를 생성하고 selectImports 메서드 오버라이딩
    ➡ 어뷰징 로직이 있는 클래스 명을 반환하도록 구현 
2. Annotation을 통하여 ImportSelector가 적용될 수 있도록 Custom Annotation 생성
3. 생성한 Custom Annotation을 적용하고자 하는 Project에만 삽입  

 

✔ 외부 IP 벤 문제 발생

💬 앱에서 광고를 통해서 제품을 구매를 하면, 제품 구매를 제공하는 플랫폼에서 우리 보상 API를 호출을 하고 보상을 제공해 주는 방식으로 구성이 되어 있던 것이었다. 일반적으로 유저가 몰리지 않은 상황에서는 문제가 되지 않았지만 이벤트로 인해 유저가 몰리자 어뷰징 로직으로 인해 외부 IP가 벤이 걸려 정상적으로 보상이 지급이 되지 않은 문제가 발생했다.

 

✔ 외부 IP 벤 대응 방안

💬 외부에서 회사 API를 호출하기에 내부 IP 벤을 해결한 방식으로는 해결하기는 어려웠다. 거기에 외부 IP는 고정이 되어있다는 점을 고려하여 제외 IP 리스트를 생성하고 등록하여 해결하기로 했다.

 

✔ 적용하기

1. Redis에 제외시킬 IP를 저장
2. 어뷰징 로직에 해당 IP가 요청할 경우 동작하지 않도록 설정

 

✔ 생각

💬 이번에 생긴 문제를 해결하고 발생한 보상 문제 등을 대처하는 것이 시간적인 소모가 엄청 크다는 것을 알았다. 그러다보니 이러한 문제를 최대한 예방을 하는 것도 시간적 자원의 소모를 줄이는 데에 큰 기여를 한다는 것을 알게 되었다. 내부적인 버그 이외에 외부적으로 이 코드로 인해서 생길 수 있는 예외 사항을 항상 고려하도록 노력해 보자.