에이전틱스
도메인 7. 보안과 안전

7.2가드레일과 안전한 배포

예상 학습 시간 25

가드레일은 한 겹으로 세우는 것이 아니라 여러 층으로 쌓는 것입니다. 이 수업에서는 입력과 출력 양쪽에 두는 방어와, 최소 권한 원칙을 코드에 적용하는 법을 다룹니다.

층으로 쌓기

가드레일은 한 지점에 몰아 두면 그 지점이 뚫릴 때 전부 무너집니다. 여러 층에 나눠 둡니다.

  • 입력 단계 — 처리하지 않을 요청을 미리 거릅니다. 길이 제한, 형식 검증, 명백히 범위 밖인 요청 차단.
  • 프롬프트 단계 — 역할과 범위를 명시하고 자료의 경계를 표시합니다.
  • 도구 단계 — 쓸 수 있는 도구를 제한하고 위험한 것에 승인을 겁니다.
  • 출력 단계 — 나가는 내용을 검사합니다. 민감정보, 형식 위반, 범위를 벗어난 답변.

각 층은 다른 종류의 실패를 잡습니다. 프롬프트 단계는 대부분의 정상적인 오용을 막고, 도구 단계는 그것이 뚫렸을 때 피해를 제한하며, 출력 단계는 새어 나가는 것을 마지막에 잡습니다.

출력 검사를 빠뜨리는 경우가 많습니다. 입력만 막으면 되리라 생각하기 쉽지만, 모델이 학습 내용에서 부적절한 것을 꺼내거나 시스템 프롬프트의 내부 정보를 인용하는 경로는 입력 검사로 잡히지 않습니다.

최소 권한

가장 효과가 큰 원칙입니다. 필요하지 않은 능력은 주지 않습니다.

적용은 여러 수준에서 이뤄집니다.

# 작업 종류에 따라 도구 묶음을 다르게 준다
TOOLSETS = {
    "qa":      [search_docs],                       # 조회만
    "triage":  [search_docs, create_ticket],        # 생성까지
    "admin":   [search_docs, create_ticket, close_ticket],
}

def run(task_type: str, user_input: str, actor: User):
    tools = TOOLSETS[task_type]
    ...
  • 도구 수준 — 그 작업에 필요한 도구만 노출합니다.
  • 데이터 수준 — 도구가 접근할 수 있는 범위를 호출자 권한으로 좁힙니다.
  • 동작 수준 — 조회는 자유롭게, 생성은 제한적으로, 삭제는 승인 후에.

여기서 자주 하는 실수는 개발 편의로 넓게 열어 두고 나중에 좁히려는 것입니다. 대개 좁혀지지 않습니다. 처음부터 좁게 시작해 필요할 때 넓히는 편이 안전하고, 무엇이 왜 필요한지도 분명해집니다.

시험에서는 "위험한 도구는 목록에서 빼면 된다"와 "권한을 프롬프트로 제한한다"가 함께 오답으로 나옵니다. 전자는 기능을 없애고 후자는 강제되지 않습니다. 목록에는 두되 실행 시점에 검사하는 것이 답입니다.

배포할 때

안전 장치는 코드에만 있는 것이 아니라 배포 방식에도 있습니다.

점진적 노출 — 전체에 한 번에 내보내지 않고 일부에게 먼저 열어 관찰합니다. 문제가 있으면 영향 범위가 작습니다.

되돌릴 수 있는 상태 유지 — 모델 버전, 프롬프트 버전, 설정을 되돌릴 수 있게 관리합니다. 되돌릴 수 없는 배포는 그 자체가 위험입니다.

차단 스위치 — 문제가 발견됐을 때 기능을 즉시 끌 수 있어야 합니다. 코드 배포를 기다려야 끌 수 있으면 늦습니다.

if not feature_enabled("ai_summary"):
    return fallback_summary(doc)     # 모델 없이도 동작하는 경로

대체 경로가 있으면 차단이 쉬워집니다. 기능이 완전히 사라지는 것보다 품질이 낮더라도 동작하는 편이 낫고, 그러면 문제 발견 시 주저 없이 끌 수 있습니다.

배포 후 관찰 항목도 정해 둡니다. 거절 비율, 형식 위반 비율, 출력 검사에 걸린 건수 같은 것들이 갑자기 변하면 신호입니다.

무엇을 자동화하지 않을 것인가

기술적으로 가능해도 하지 않는 편이 나은 것들이 있습니다.

  • 되돌릴 수 없고 영향이 큰 동작 — 대량 삭제, 외부 발송, 금전 이동.
  • 책임 소재가 사람에게 있어야 하는 판단 — 채용, 징계, 신용 평가.
  • 법적 효력이 있는 산출물 — 계약서 확정, 공식 통지.

이런 영역에서는 모델을 보조 도구로 쓰는 형태가 맞습니다. 초안을 만들고, 검토할 항목을 표시하고, 근거를 모아 주되 최종 결정은 사람이 합니다.

경계를 정할 때 유용한 질문이 있습니다. "틀렸을 때 누가 책임지는가" 입니다. 답이 사람이라면 그 사람이 판단할 수 있는 형태로 정보를 주어야 하고, 모델이 대신 결정해서는 안 됩니다.

이 판단은 코드가 아니라 제품과 정책의 영역이지만, 개발자가 구조로 뒷받침해야 합니다. 승인 단계가 없는 자동 실행 경로를 만들어 두면 정책과 무관하게 그 경로로 흐르게 됩니다.

시험 함정

  • 입력 검사만으로 충분하다는 선택지 — 출력에서 새어 나가는 경로는 입력 검사로 잡히지 않습니다.
  • 가드레일을 한 지점에 몰아 두는 설계 — 그 지점이 뚫리면 전부 무너집니다.
  • 권한을 넓게 열어 두고 나중에 좁히겠다는 접근 — 대개 좁혀지지 않습니다.
  • 위험한 도구를 목록에서 제거하는 것이 유일한 답이라는 선택지 — 기능을 없애는 대신 실행 시점에 검사합니다.
  • 차단 스위치 없이 코드 배포로만 기능을 끌 수 있는 구성 — 문제 발견 시 대응이 늦습니다.
  • 기술적으로 가능하면 자동화해도 된다는 서술 — 책임 소재가 사람인 판단은 보조에 그쳐야 합니다.

실습 시나리오

실제 시험과 같은 형식의 시나리오 문제입니다.

고객 응대 초안을 만드는 기능을 배포하려 합니다. 안전 장치로 가장 우선해 갖춰야 할 것은 무엇입니까?

빌드 연습 · 층별 가드레일과 차단 스위치 붙이기

30
  1. 1.층 설계

    입력·프롬프트·도구·출력 네 층에 각각 무엇을 둘지 적습니다.

    기대 결과 · 층마다 잡으려는 실패 유형이 다릅니다.

  2. 2.도구 묶음 분리

    작업 종류별로 노출할 도구를 나눕니다.

    기대 결과 · 조회 전용 경로가 만들어집니다.

  3. 3.출력 검사

    민감정보 패턴과 형식 위반을 검사하는 단계를 넣습니다.

    기대 결과 · 걸린 건수가 로그로 남습니다.

  4. 4.차단 스위치

    기능을 즉시 끌 수 있는 플래그와 대체 경로를 만듭니다.

    기대 결과 · 플래그를 끄면 모델 없이도 동작합니다.

  5. 5.관찰 항목

    거절 비율과 출력 검사 적발 건수를 지표로 남깁니다.

    기대 결과 · 배포 후 변화를 추적할 수 있습니다.

출처 및 더 읽기