2025년 May 7일
  1. 개발 히스토리
  2. [Backend] API 키 마스크

[Backend] API 키 마스크

현재 META LLM MSP 화면에서는 API 키를 그대로 공개하고 있습니다.

그러나 이러한 방식은 보안상의 위험이 있기 때문에, 사용자 화면에서도 API키 내용을 가릴 필요가 있습니다.

API 키 마스크 함수

def mask_api_key(api_key: str) -> str:
    if not isinstance(api_key, str):
        raise ValueError("API 키는 문자열이어야 합니다.")

    if not api_key.startswith("sk-"):
        return "*" * len(api_key)

    prefix = "sk-"
    key_body = api_key[len(prefix):]

    if len(key_body) <= 4:
        masked = "*" * len(key_body)
        return prefix + masked

    num_visible = 4
    masked_body = "*" * (len(key_body) - num_visible) + key_body[-num_visible:]
    return prefix + masked_body

API 키가 입력되면 sk-와 마지막 4자리를 제외한 API 키 내용을 전부 *로 바꿔서 반환하는 함수입니다.
이 함수를 Core의 tools.py에 추가합니다.

API 키 반환

def get_api_keys(db: Session, email: str):
    user = db.execute(select(User).where(User.email == email)).scalar_one_or_none()
    if not user:
        return {"api_keys": [],"message":"please enter your apikey"}

    keys = db.execute(
        select(ApiKey).where(ApiKey.user_id == user.id)
    ).scalars().all()

    return {
        "api_keys": [
            {
                "id": k.id,
                "provider_id": k.provider_id,
                "provider_name": k.provider_name,
                "user_id": k.user_id,
                "api_key": mask_api_key(k.api_key),
                "status": k.status,
                "create_at": k.create_at,
                "usage_limit": k.usage_limit,
                "usage_count": k.usage_count
            } for k in keys
        ]
    }

해당 코드는 요청이 들어오면 API 키 관련 정보를 전부 리스트로 만들어 반환하는 함수였습니다.
이 함수에서 api_key를 반환할 때, DB에 있는 API 키를 바로 반환하지 않고 mask_api_key를 한 번 거치도록 합니다.

반영 결과

이제 API 키가 표시될 때 *로 가려져서 표시됩니다.

Leave a Reply

Your email address will not be published. Required fields are marked *

연관 글
BCT NEWS
인기 글
BCT AI Chatbot
인공지능 대화형 플랫폼 BAP
BCT AI Chatbot
클라우드
BCT AI Chatbot