E사 프로젝트 이력
목차
- 광고 데이터 플랫폼 운영 개선 및 성능·보안 고도화
- 프로젝트 개요
- 핵심 성과 및 의사결정 이력
- 1. 대용량 데이터 수집 배치의 메모리 부족 문제 분석 및 개선
- 2. Selenium 기반 데이터 수집 구조를 HTTP API 방식으로 전환
- 3. SQL Injection 취약점 분석 및 파라미터 바인딩 적용
- 4. Django Custom Test Runner를 활용한 테스트 결과 출력 개선
광고 데이터 플랫폼 운영 개선 및 성능·보안 고도화
프로젝트 개요
| 항목 | 내용 |
|---|
| 기간 | 2024.12 ~ 2025.06 (7개월) |
| 업무/프로젝트 | 사내 광고 플랫폼 운영 및 배치 안정화, API 기반 데이터 수집 전환, 서버 보안 취약점 진단 |
| 기술 스택 | Python, Django, Django REST Framework (DRF), Selenium, Keycloak, PyMySQL, AWS(Lambda, EC2, ECR, ECS, EventBridge, API Gateway, Code Commit, Parameter Store, CloudWatch, S3), BitBucket |
핵심 성과 및 의사결정 이력
1. 대용량 데이터 수집 배치의 메모리 부족 문제 분석 및 개선
- 문제
- 타 부서와 리소스를 공유하는 2GB RAM 환경에서 대용량 광고 데이터를 수집하고 병합하는 배치가 종종
MemoryError(OOM)로 중단되는 문제가 발생함 - 인프라 제약으로 인해 인스턴스 사양을 바로 올리기(Scale-up) 어려운 상황이었음
- 해결
- 원인 분석 및 환경 개선: 데이터 처리 과정에서 메모리 고갈이 발생하는 지점을 확인하고, 이를 완화하기 위해 OS 레벨의 Swap 공간을 1GB에서 4GB로 확장함
- 코드 수준의 메모리 관리: Pandas 데이터 처리 중 불필요한 복사본이 생성되지 않도록 인플레이스(in-place) 연산을 도입하고, 메모리 사용량이 급증하는 구간 직후에 가비지 컬렉터를 호출함
- 성과
- 인프라 증설 없이 OS 설정과 애플리케이션 코드 수정을 통해 메모리 부족 현상을 해결하여, 배치 작업이 중간에 비정상 종료되는 문제를 개선함
2. Selenium 기반 데이터 수집 구조를 HTTP API 방식으로 전환
- 문제
- 기존에는 브라우저를 직접 제어하는 Selenium 방식으로 데이터를 수집하고 있어 실행 시간(3~5분)이 길고 CPU/메모리 부하가 컸음
- 대상 웹사이트의 UI가 조금만 변경되어도 수집 로직이 실패하는 유지보수 문제가 반복됨
- 해결
- 동작 방식 분석: 기존 브라우저 자동화 과정에서 발생하는 로그인 및 데이터 요청 패킷을 분석함
- 인증 및 수집 방식 변경: 분석한 결과를 바탕으로 Keycloak 기반 OAuth2 인증 로직을 구현하여, 브라우저 렌더링 없이 순수 HTTP API 요청만으로 데이터를 수집하도록 코드를 재작성함
- 성과
- 불필요한 렌더링 오버헤드를 제거하여 수집 시간을 3~5분에서 30~45초로 약 80% 단축했으며, 웹사이트 UI 변경에 영향을 받지 않는 안정적인 데이터 수집이 가능해짐
3. SQL Injection 취약점 분석 및 파라미터 바인딩 적용
- 문제
- AWS Lambda 기반 조회 API를 점검하는 과정에서 사용자 입력값이 문자열 포맷팅(f-string)을 통해 SQL 쿼리에 직접 결합되는 코드를 확인
- 해당 구현 방식이 SQL Injection으로 이어질 가능성을 확인하고, 실제 공격 가능성과 영향 범위를 안전한 환경에서 검증할 필요가 있었음
- 해결
- 취약점 검증: 운영 환경에 영향을 주지 않도록 격리된 스테이징 RDS 환경에서 Time-based SQL Injection 시나리오를 구성하여 사용자 입력값을 통한 SQL 실행 가능성을 검증
- 시큐어 코딩 적용: 취약한 쿼리 작성 방식을 pymysql의 파라미터 바인딩 방식으로 변경하여 사용자 입력값이 SQL 구문으로 해석되지 않도록 개선
- 개발 보안 기준 정리: 취약점 발생 원인과 개선 방법을 정리하고, 안전한 SQL 작성 방식과 파라미터 바인딩 적용 예시를 포함한 사내 개발 보안 가이드 작성
- 성과
- 취약점 사전 제거: 운영 배포 전에 SQL Injection 발생 가능성을 발견하고 안전한 쿼리 작성 방식으로 개선
- 시큐어 코딩 내재화: 특정 코드의 취약점 수정에 그치지 않고 SQL 작성 시 사용자 입력값을 직접 쿼리에 결합하지 않는 개발 기준을 정리하여 팀 내 공유
- 개발 관점의 보안 인식 강화: 기능 구현 이후 별도의 보안 점검에 의존하기보다 개발 단계에서 입력값 처리와 SQL 실행 구조를 함께 검토하는 시큐어 코딩 관점 확립
4. Django Custom Test Runner를 활용한 테스트 결과 출력 개선
- 문제
- 작성된 테스트 케이스가 늘어나면서 실패한 테스트를 확인할 때 영문 함수명만 출력되어 디버깅에 시간이 소요됨
- 해결
- Django의 기본
DiscoverRunner를 상속받아, 테스트 실행 시 메서드에 작성된 한글 docstring(설명문)을 함께 출력하도록 확장함
- 성과
- 테스트 결과의 가독성을 높여 기능 수정 시 실패 원인을 빠르게 파악할 수 있도록 개발 환경을 개선함