Say Please (if only as a reminder)
부탁이라고 말하세요 — 보안 경계는 코드에 두세요
프롬프트는 모델에게 하는 요청이지 강제 규칙이 아니므로, 민감한 데이터와 도구 권한은 코드로 제한해야 합니다. 글은 프롬프트, 가드레일, 프로그램 수준의 결정적 제어를 박물관의 안내판·경비원·방탄유리에 비유합니다.
- 주제
AI 요약
저자는 모델에게 “고객 계정 번호를 공개하지 마세요”라고 지시하는 일을 박물관의 “작품에 손대지 마세요” 안내판에 비유합니다. 대부분은 안내를 따르지만, 안내판만으로 모든 방문객을 막지는 못합니다. 프롬프트도 마찬가지입니다. “절대 공개하지 마”라고 강하게 써도 모델이 읽는 텍스트라는 점은 달라지지 않습니다.
안내판: 시스템 프롬프트
시스템 프롬프트는 모델에 우선적으로 반영되도록 설계됐지만, 여전히 텍스트를 확률적으로 해석합니다. 저자는 45년 동안 코드를 작성하며 프로그램이 지시대로 작동한다고 여겼지만, 그 공은 컴파일러에 더 많이 돌아가야 했다고 말합니다. 컴파일러는 작성자의 의도를 추측하거나 친절하게 도우려 하지 않습니다. 반면 LLM은 대화 상대가 협조적이라고 가정하고, 사용자가 실제로 원하는 바를 파악하려 합니다. 이 특성 덕분에 유용하지만, 그럴듯한 이야기를 내세우는 사용자가 프롬프트의 제한을 넘어서게 만들 수도 있습니다.
모호함을 줄이려고 규칙과 예외를 계속 추가하면, 모델이 오해하거나 공격자가 악용할 텍스트도 늘어납니다. 저자는 이를 ‘모호성 벡터’라고 부릅니다. 안내판을 길게 쓴다고 더 강한 통제가 되는 건 아닙니다. 공격 표면만 커질 수 있습니다.
경비원: 가드레일
Amazon Bedrock Guardrails, 입력·출력 분류기, 모더레이션 단계는 모델 바깥에서 입력과 출력을 검사합니다. 대화에 참여하지 않으므로 사용자의 사연에 설득될 가능성이 낮다는 장점이 있습니다. 다만 많은 가드레일은 콘텐츠 필터나 금지 주제 탐지 같은 분류기이며, 첫 번째 모델을 감시하는 두 번째 모델인 경우도 있습니다. 주민등록번호처럼 정해진 패턴을 찾는 결정적 검사도 있으니, 제품을 도입할 때 각 요소가 분류기인지 코드 기반 검사인지 구분해야 합니다. 확률적인 방어층을 두 개 쌓으면 위험은 줄지만, 완전히 사라지지는 않습니다.
방탄유리: 프로그램 수준의 결정적 제어
모델이 받지 않은 데이터는 유출할 수 없습니다. 자격 증명이 없는 API는 호출할 수 없고, 읽기 권한만 있는 IAM 역할로 테이블을 삭제할 수도 없습니다. 이런 제어는 모델의 상태나 공격 문구에 좌우되지 않습니다.
실무에서는 요청자의 권한에 맞춰 데이터를 컨텍스트 창에 넣기 전에 걸러야 합니다. 에이전트에는 꼭 필요한 도구만 제공하고, 도구별 최소 권한 자격 증명을 쓰며, 인자를 코드로 검증해야 합니다. 파괴적인 작업 앞에는 사람의 승인이나 확정적인 검사를 둬야 합니다. 저자는 모델이 모든 지시를 무시한다고 가정했을 때 최악의 피해가 무엇인지 물어보라고 제안합니다. 그 답이 실제 보안 수준입니다. 그보다 위에 둔 대책은 결국 부탁에 가깝습니다.
프롬프트는 평범하고 선의인 요청에서 모델의 어조와 행동을 조정하는 데 여전히 유용합니다. 다만 프롬프트에는 행동 지침을 맡기고, 가드레일은 놓친 위험을 잡게 하며, 직장을 잃을 만한 작업은 코드로 막아야 합니다. 모델에게 부탁하는 말은 보안 경계가 프롬프트가 아니라는 점을 사람에게 상기시키는 용도로 씁니다.
dev.to 반응
- @francistrdev — LLM에게 무언가를 하지 말라고 부탁하는 것과 대문자로 소리치듯 쓰는 것에는 어떤 차이가 있나요? 저는 “이런 건 절대 추가하지 마”라고 말하면 꽤 효과가 있더라고요. 결과에 차이가 있나요? 글은 정말 좋았습니다!
- @rudratosh — 같은 요점을 저는 이렇게 표현합니다. 프롬프트는 요청이지 제약이 아닙니다. “키를 공개하지 마세요”라는 말은 공격자가 작성하는 텍스트와 같은 통로에 있으므로, 더 많은 텍스트가 들어오면 언제든 덮일 수 있습니다. 실제 안전성은 모델이 논쟁으로 바꿀 수 없는 곳에 둬야 합니다. 정중한 의도가 아니라 실제 행동을 검사하는, 컨텍스트 창 바깥의 관문이어야 합니다. 프롬프트 수준의 안전성은 유용한 유도 장치지만, 보안 기반으로 삼으면 치명적입니다. “부탁하세요”라는 표현이 실제로 보안을 강화한다고 보시나요, 아니면 프롬프트가 애초에 보안 경계가 아니었다는 점을 상기시키는 말에 가깝나요?
- @btarbox — 그저 상기시키려는 말입니다. LLM보다 사람에게 하는 메시지에 가깝습니다.
- @rulestack — 저희는 안내판만으로 운영하다가 사소한 일에서 실패했습니다. 에이전트에게 래퍼 스크립트로만 링크를 열라고 적어 뒀는데, 규칙을 작성한 지 약 두 달 반 뒤에 에이전트가 래퍼 없이 명령을 실행했습니다. 실행 전에 그 명령을 거부하는 훅을 추가해 해결했습니다. 기존 규칙도 쓸모없어진 건 아닙니다. 이유를 포함한 같은 규칙을 이제 훅이 거부 메시지로 보여줍니다.
원문: dev.to / 번역·요약: Trawling