안녕하세요 이번 시간에는 이전에 생성한 Chatbot 코드 내 IP 기반 요청 제한 코드를 추가하여 악의적인 사용자가 지속적인 질문을 하기 어렵게 하기 위해 요청 IP Address 기반으로 시간당 5회 질문이 가능하도록 구현한 코드를 기반으로 포스팅을 진행하겠습니다.
MongoDB를 이용한 요청 횟수 추적
MongoDB는 NoSQL DB로 데이터를 "Key:Value" 형태로 저장합니다.
이번 블로그 포스팅에서는 MongoDB를 이용해 Client IP Address 및 요청 시간을 각 요청 마다 MongoDB에 저장하여 들어오는 요청을 추적하는 방식을 사용하였습니다.
아래 코드를 살펴보며 구현된 로직에 대해 좀 더 자세하게 알아보겠습니다.
코드 구현
def mongo_find_ip(ip):
try:
last_1_hour = datetime.datetime.now(datetime.UTC) - datetime.timedelta(hours=1)
responses = mongo.db.responses.find({"client_ip": ip, "_time": {"$gte": last_1_hour}})
response_list = []
for response in responses:
response_list.append(response)
return len(response_list)
except Exception as e:
print(f"Mongodb에서 IP를 찾는 동안 오류가 발생했습니다. {e}") # MongoDB에서 응답을 찾는 동안 오류가 발생했습니다.
return None
if mongo_find_ip(client_ip) >= 5:
return jsonify({"response": "시간당 최대 5회 질문이 가능합니다. 잠시후 다시 시도 바랍니다."}), 429
작동 로직
- mongo_find_ip(ip) 함수
- last_1_hour 변수 내 현재 요청을 한 시간을 기준으로 1시간 전 시간을 계산하여 저장
- responses 변수 내 responses collection을 대상으로 client_ip, 1시간 이내 저장된 데이터를 조회하여 저장
- response_list 배열 내 현재 요청 기준으로 1시간 이내 저장된 데이터를 각각 저장
- response_list 배열 내 데이터 갯수를 return
- if mongo_find_ip(client_ip) >= 5: ........ 코드 블록
- mongo_find_ip 함수에 의해 반환된 요청 수가 5보다 크거나 같은지 확인하여, 5보다 클 경우 1시간 이내 5회 이상 요청을 전송했다는 것이기에 너무 많은 요청을 했음을 의미하는 429 응답 코드와 함께 JSON 응답을 반환하여 프론트 측에서 출력될 수 있도록 구현
'Project > resume' 카테고리의 다른 글
MongoDB, Flask, Next.js 를 활용한 동적 블로그 컴포넌트 구현 (0) | 2024.08.17 |
---|---|
AI Chatbot 추천 질문 시스템 구현 / OpenAI Assistant Intruction 을 활용한 AI 응답 지정 (0) | 2024.08.17 |
[Github Actions] CI/CD 파이프라인 구축 / Github Actions 사용법 / Snyk Application CI 파이프라인 통합 / EC2 배포 자동화 (0) | 2024.08.13 |
OpenAI API를 이용한 이력서 기반 AI ChatBot 백엔드 코드 구현 (0) | 2024.07.19 |
이력서 홈페이지 제작 프로젝트 (feat. 이력서 기반 AI챗봇) (0) | 2024.07.09 |