-
API Key와 JWT 기반 이중 인증 처리
- Redis 또는 DB에서 API Key 유효성 확인
- JWT 서명(HMAC-SHA256) 및 본문 SHA-256 해시값 검증
- Redis 캐시가 존재할 경우 해시 검증 생략하여 속도 최적화
-
요청 대상(chat / community)에 따라 Flask AI 서버로 비동기 요청 포워딩
- FastAPI → httpx 기반 비동기 호출
- AI 서버에서 KoBERT 기반 분석 수행
-
분석 결과 후처리
- fasttext 기반 욕설 단어 추출
- KoBERT 기반 최종 판단(
final_decision: 0=정상, 1=욕설) result.rewritten_text에 정제된 문장 포함
-
Redis Pub/Sub 로그 발행 (필터링 통계용)
filter-log: 필터링 요청/결과 기록badword-log: 탐지된 욕설 단어 리스트abuse-log: 욕설 판정 시 API Key 발행revoke-log: REVOKED 키에 대한 캐시 삭제 알림
-
log_consumer.py를 통한 Redis 로그 수신 및 후처리- 욕설 단어 카운트 DB 반영 (
badwords) - abuse 횟수 누적 (
abuse_count) revoke-log수신 시 Redis 캐시 즉시 삭제
- 욕설 단어 카운트 DB 반영 (
-
API Key 자동 정리 기능
- 30일 이상 경과 또는 7일 이상 미사용 시 DB에서 자동 제거
| 분류 | 사용 기술 | 설명 |
|---|---|---|
| API 프레임워크 | FastAPI | 비동기 처리에 최적화된 Python 기반 REST API 프레임워크 |
| 인증 처리 | JWT (pyjwt) + API Key | API Key와 HMAC-SHA256 기반 JWT 서명을 함께 검증하는 이중 인증 구조 |
| 데이터베이스 | MySQL + SQLAlchemy + pymysql | 욕설 탐지 기록 및 abuse 카운트 통계를 저장하는 관계형 DB 및 ORM |
| HTTP 클라이언트 | httpx | Flask AI 서버로 비속어 분석 요청을 비동기로 전송 |
| 캐시/메시징 | Redis + Pub/Sub (redis-py) |
인증 캐시 관리 및 로그 이벤트(filter-log, abuse-log 등) 실시간 발행 |
| 작업 스케줄링 | fastapi-utils (@repeat_every) |
미사용 API Key를 정기적으로 정리하는 스케줄러 구성 |
| 환경 변수 관리 | python-dotenv | .env 파일 기반으로 환경 설정 및 민감 정보 외부화 |
| 언어 및 버전 | Python 3.10 | 전체 시스템 구현 및 라이브러리 호환 기준 버전 |
# 의존성 설치
pip install -r requirements.txtrequirements.txt 기준 주요 패키지:
-
fastapi
-
uvicorn
-
pyjwt
-
httpx
-
redis
-
python-dotenv
-
sqlalchemy
-
pymysql
-
fastapi-utils
uvicorn fastapi_gateway.main:app --port 8001 --host 0.0.0.0 --http h11
python -m fastapi_gateway.Log_consumer
curl -X POST http://외부 서버 주소:8001/proxy/analyze/target{community,chat 중 택 1} \
-H "Authorization: Bearer {API_KEY}" \
-H "X-Auth-Token: {JWT}" \
-H "Content-Type: application/json" \
-d '{"text": "비속어"}'
{
"result": {
"original_text": "원본",
"rewritten_text": "대체 문장"
},
"final_decision": 0,1 ( 욕설 여부 )
}
┌────────────┐
│ 클라이언트 │
└────┬───────┘
↓
Authorization: Bearer <API_KEY>
X-Auth-Token: <JWT>
↓
FastAPI 프록시 서버
① API_KEY 추출
② JWT 추출
③ Redis 캐시 조회
- 있음 → JWT 서명만 검증 (해시 생략)
- 없음 → DB 조회 + 해시 검증
- status가 ACTIVE인지 확인
- JWT 서명 + 본문 SHA256 해시 검증
- Redis에 시크릿 키 캐시 (TTL = 5분)
↓
Flask AI 서버로 요청 포워딩 (httpx 비동기)
↓
AI 응답 수신
↓
결과 후처리
- result 반환
- Redis Pub/Sub 로그 발행
- filter-log
- abuse-log (final_decision=1일 경우)
- badword-log (fasttext 감지 단어)
- revoke-log (DB에서 상태 변경 감지 시)
fastapi_gateway/
├── main.py
├── routes/
│ ├── key_issuer.py
│ ├── stats_router.py
├── services/
│ ├── analyze_service.py
│ ├── auth_service.py
├── utils/
│ ├── jwt_utils.py
│ ├── log_publisher.py
├── middlewares/
│ ├── auth_middleware.py
├── database.py
├── Log_consumer.py
├── cleanup_task.py
├── .env
├── requirements.txt