21장. AI 거버넌스와 보안, 온프레미스 인프라
LLM 서비스의 위협 지도
은행은 창구, 서류함, 금고, 전산망마다 다른 위험을 따로 살핍니다. LLM 서비스도 사용자의 말, 검색 자료, 모델, 도구, 답이 지나는 길마다 위험이 다릅니다.
그림은 요청 하나가 지나는 다섯 지점입니다. 1번 사용자의 말에는 직접 인젝션이, 2번 검색 자료에는 간접 인젝션과 남의 문서가, 3번 프롬프트에는 숨겨 둔 비밀이, 4번 도구에는 지나친 권한이, 5번 답에는 개인정보와 거짓 정보가 섞일 수 있습니다. 창구가 1번, 서류함이 2번, 금고가 3번과 4번, 고객에게 건네는 서류가 5번입니다.
OWASP 의 LLM 위협 목록
웹 보안 단체 OWASP 는 LLM 서비스의 주요 위협을 목록으로 냅니다. 아래는 2025년 판의 항목과 이 과정에서 다룬 곳입니다. 목록은 해마다 고쳐지므로 최신 판을 확인합니다.
| 번호 | 위협 | 이 과정에서 |
|---|---|---|
| LLM01 | 프롬프트 인젝션 | 이 장 실습 1, 2 |
| LLM02 | 민감 정보 노출 | 이 장 실습 3~5 |
| LLM03 | 공급망(모델, 패키지) | 11장 폐쇄망, 버전 고정 |
| LLM04 | 데이터·모델 오염 | 19장 데이터 검사와 게이트 |
| LLM05 | 출력을 그대로 쓰기 | 이 장 출력 검사 |
| LLM06 | 지나친 권한 | 18장 사용자를 묶은 도구 |
| LLM07 | 시스템 프롬프트 유출 | 이 장 실습 1, 2 |
| LLM08 | 벡터·임베딩의 약점 | 이 장 실습 5 접근 제어 |
| LLM09 | 거짓 정보 | 20장 평가 |
| LLM10 | 끝없는 소비(비용, 자원) | 17장 붐빔 막기 |
지점마다 점검 항목 세기
# 지점마다 이 장에서 점검하는 항목
checks = {
"사용자의 말": ["직접 인젝션"],
"검색 자료": ["간접 인젝션", "등급이 높은 문서"],
"프롬프트": ["숨긴 비밀"],
"도구": ["지나친 권한"],
"답": ["개인정보", "심은 링크", "관리 코드"],
}
# 결과: 지점마다 항목 수와 전체 항목 수
print({k: len(v) for k, v in checks.items()}, "· 모두", sum(map(len, checks.values())))코드에 나오는 함수
| 코드 | 쉬운 뜻 |
|---|---|
checks.items() | (지점 이름, 항목 목록) 짝을 하나씩 꺼낸다 |
{k: len(v) for k, v in ...} | 지점마다 항목 수를 센 새 사전을 만든다 |
checks.values() | 지점 이름은 빼고 항목 목록만 꺼낸다 |
map(len, ...) | 목록마다 len 을 적용한다. map 은 "하나하나에 짝지어 적용하기"라는 뜻이다 |
sum(...) | 항목 수를 모두 더한다 |
이 코드가 뜻하는 것
아파트 관리소의 순찰 점검표와 같습니다. 현관, 주차장, 옥상처럼 장소마다 확인할 항목이 적혀 있고, 장소마다 몇 개인지와 모두 몇 개인지를 셉니다. 여기서 장소가 지점, 확인 항목이 점검 항목입니다.
| 줄 | 하는 일 | 쉽게 말하면 |
|---|---|---|
checks = {...} | 다섯 지점과 점검 항목을 적는다 | 장소별 순찰 점검표 |
{k: len(v) ...} | 지점마다 항목 수를 센다 | 장소마다 몇 개를 보나 |
sum(map(len, checks.values())) | 전체 항목 수를 센다 | 순찰 한 번에 보는 항목 수 |
결과에서 답 지점이 3개로 가장 많고, 모두 8개입니다. 답은 사용자에게 나가기 직전의 마지막 관문이라 여러 가지를 한꺼번에 봅니다.
주의할 점
- 한 지점만 막으면 다른 지점으로 들어옵니다. 지점마다 무엇을 막는지 표로 정리해 둡니다.
- 보안은 기능을 다 만든 뒤가 아니라 설계할 때부터 정합니다. 18장에서 도구에 사용자를 묶은 것이 그 예입니다.