본문 바로가기
지니와 매일 AI와 함께하기 지니와 매일 AI와 함께하기

FastAPI 개인정보 마스킹: AI API 전송 전에 처리하는 실무 방법

읽는 시간 약 6분

FastAPI 개인정보 마스킹은 생성형 AI API와 백엔드 서비스를 연결할 때 적용하기 좋은 개인정보 보호 방법입니다.

외부 AI 서비스에 데이터를 보내기 전에 이름, 전화번호, 이메일 등 AI 처리에 필요하지 않은 정보를 제거하면 개인정보가 불필요하게 외부로 전달되는 것을 줄일 수 있습니다.

예를 들어 다음 요청을 생각해보겠습니다.

{
  "name": "홍길동",
  "email": "hong@example.com",
  "phone": "010-1234-5678",
  "message": "배송이 아직 도착하지 않았습니다."
}

AI의 목적이 고객 문의를 배송, 교환, 환불로 분류하는 것이라면 실제 필요한 데이터는 message 하나일 수 있습니다.

Pydantic 모델을 분리한다

사용자가 보내는 요청 모델과 AI API에 전달하는 모델을 따로 정의할 수 있습니다.

from pydantic import BaseModel

class CustomerRequest(BaseModel):
    name: str
    email: str
    phone: str
    message: str

class AIRequest(BaseModel):
    message: str

AI 호출 직전에는 다음처럼 필요한 필드만 선택합니다.

def build_ai_request(data: CustomerRequest) -> AIRequest:
    return AIRequest(message=data.message)

이 방법은 단순하지만 장점이 큽니다.

코드를 보는 개발자가 AI API에 어떤 데이터가 전달되는지 바로 확인할 수 있기 때문입니다.

이메일 마스킹 함수

업무상 이메일 일부가 필요하다면 전체 주소를 제거하지 않고 일부만 가릴 수 있습니다.

def mask_email(email: str) -> str:
local, domain = email.split(“@”, 1)

if len(local) <= 2:
    return f"**@{domain}"

return f"{local[:2]}***@{domain}"

예를 들어:

hong@example.com

은:

ho***@example.com

으로 변경됩니다.

전화번호 마스킹

  def mask_phone(phone: str) -> str:
    parts = phone.split("-")

    if len(parts) != 3:
        return "****"

    return f"{parts[0]}-****-{parts[2]}"

010-1234-5678

은:

010-****-5678

형태가 됩니다.

개인정보 처리 로직을 서비스 계층으로 분리한다

라우터마다 마스킹 코드를 작성하는 것보다 개인정보 전처리를 별도 계층으로 구성하는 것이 좋습니다.

Router
 ↓
Privacy Filter
 ↓
AI Service
 ↓
External AI API

예를 들어:

class PrivacyService:

    def build_safe_payload(self, data: CustomerRequest) -> dict:
        return {
            "message": data.message
        }

AI 기능이 늘어나더라도 동일한 개인정보 처리 규칙을 재사용할 수 있습니다.

로그에도 동일한 기준을 적용한다

외부 AI 요청에서 개인정보를 제거하고 로그에는 그대로 남긴다면 개인정보 보호 효과가 줄어듭니다.

예를 들어:

logger.info(
    "customer email=%s phone=%s",
    mask_email(data.email),
    mask_phone(data.phone),
)

처럼 동일한 마스킹 함수를 재사용할 수 있습니다.

하지만 가장 좋은 방식은 애초에 개인정보를 로그에 기록하지 않는 것입니다.

logger.info(
    "request_id=%s category=%s",
    request_id,
    category,
)

처럼 문제 해결에 필요한 기술 정보 중심으로 기록하는 것이 좋습니다.

자유 텍스트도 주의해야 한다

구조화된 필드만 제거한다고 모든 개인정보가 사라지는 것은 아닙니다.

사용자가 문의 내용에 직접 전화번호를 적을 수도 있습니다.

제 전화번호는 010-1234-5678인데 배송 확인 부탁드립니다.

따라서 자유 텍스트를 외부 AI에 전달하는 서비스라면 전화번호, 이메일 등 주요 개인정보 패턴을 검사하는 별도 과정도 고려할 수 있습니다.

FastAPI 개인정보 마스킹 체크리스트

  • AI용 요청 객체가 따로 있는가?
  • 전체 데이터베이스 객체를 그대로 AI에 보내고 있지 않은가?
  • 이름이 실제 AI 업무에 필요한가?
  • 이메일을 제거하거나 마스킹할 수 있는가?
  • 전화번호를 제거할 수 있는가?
  • 로그에도 개인정보가 남지 않는가?
  • 자유 입력 텍스트에 개인정보가 포함될 수 있는가?

마무리

FastAPI 개인정보 마스킹의 핵심은 복잡한 보안 라이브러리를 사용하는 것이 아닙니다.

외부 AI로 데이터를 보내기 전에 AI가 실제로 필요한 정보만 별도로 구성하는 것이 가장 중요한 첫 단계입니다.

사용자 요청 모델과 AI 요청 모델을 분리하는 것만으로도 데이터 흐름이 명확해지고 향후 개인정보 정책을 변경하기도 쉬워집니다.

jinii
함께 보면 좋은 글

댓글 0

첫 댓글을 남겨보세요.