8장 · 보안 - 안전한 도구 실행왜 안전한 도구가 필요한가 — 주문번호만 알면 누구 주문이든 보인다권한은 세션이 정한다 — 모델이 채우는 값에 권한을 맡기지 않는다개인정보 마스킹 — 모델에게 준 것은 화면에 나올 수 있다읽기 도구와 쓰기 도구 — 흔적을 남기는 도구는 다르게 다룬다따라하기 1 — 도구 모듈 haru_tools.py 만들기따라하기 2 — 안전장치 확인하기정리와 체크리스트실습문제와 해답
8장. 보안 - 안전한 도구 실행
정리와 체크리스트
8장에서 배운 것
- 모델이 채우는 인자는 고객이 바꿀 수 있는 값입니다. 권한을 정하는 값은 인자로 받지 않습니다.
- 세션(session) — 로그인한 고객이 누구인지에 대한 정보. 우리 코드가 만들고, 대화로는 바뀌지 않습니다.
- 클로저(closure) — 안쪽 함수가 바깥 함수의 변수를 기억하는 것.
make_tools(session)이 도구를 세션에 묶는 방법입니다. - 마스킹(masking) — 개인정보의 일부를 가려 전달하는 것. 도구가 값을 돌려주는 자리에서 합니다.
- 읽기 도구와 쓰기 도구 — 흔적(부작용)을 남기는 도구는 되돌릴 수 있는 것만 만듭니다.
- 도구는 예외로 멈추지 않는다 — 어떤 경우에도 모델이 읽을 수 있는 값을 돌려줍니다.
한눈에 보는 핵심
session = CustomerSession("C001") # 누구인가 — 우리 코드가 정한다
tools = make_tools(session) # 그 세션에 묶인 도구 여섯 개
tools["get_my_orders"]() # 인자가 없다. 남의 목록이 나올 길이 없다
tools=list(tools.values()) # 모델에게는 이렇게 넘긴다
| 부탁 (프롬프트) | 보장 (코드) |
|---|---|
| "남의 주문을 보여 주지 마라" | 도구 인자에 customer_id가 없고, 세션과 비교해 거부한다 |
| "주문이 있는지도 알려 주지 마라" | 남의 주문번호에 없는 주문번호와 같은 값을 돌려준다 |
| "개인정보를 쓰지 마라" | 도구가 가린 값만 돌려준다 |
| "환불을 약속하지 마라" | 환불을 실행하는 도구가 없다 |
| "말만 하지 말고 접수하라" | 호출 이력과 tickets.json으로 확인한다 |
haru_tools.py에서 가져다 쓰는 것 |
무엇인가 |
|---|---|
CustomerSession |
로그인한 고객 |
make_tools |
세션에 묶인 도구 여섯 개를 만드는 함수 |
mask_name, mask_phone |
마스킹 함수 |
ORDERS, PRODUCTS, CUSTOMERS |
CSV를 읽어 둔 표 |
TICKETS_PATH |
티켓 파일의 위치 |
체크리스트
- [ ]
get_order_status(order_id, customer_id)설계가 왜 위험한지 설명할 수 있다. - [ ] 세션이 무엇이고, 도구 인자와 무엇이 다른지 말할 수 있다.
- [ ]
make_tools(session)이 돌려준 도구가 세션을 기억하는 까닭을 클로저로 설명할 수 있다. - [ ]
get_my_orders에 인자가 하나도 없는 것이 왜 안전한지 설명할 수 있다. - [ ] 마스킹을 프롬프트가 아니라 도구의 반환 자리에서 하는 이유를 말할 수 있다.
- [ ] 읽기 도구와 쓰기 도구의 차이를 말하고, 환불 도구를 만들지 않은 이유를 설명할 수 있다.
- [ ] 티켓의 값 중 코드가 정하는 것과 모델이 정하는 것을 나눌 수 있다.
- [ ] 도구가 예외를 내는 대신 값을 돌려주게 만든 이유를 설명할 수 있다.
- [ ] 남의 주문번호를 넣었을 때 모델이 도구를 불렀는지, 누가 막았는지 실행 결과에서 짚을 수 있다.
- [ ] 남의 주문번호와 없는 주문번호에 같은 값을 돌려주는 이유를 설명할 수 있다.
- [ ]
memory_store/tickets.json이 언제, 무엇에 의해 만들어지는지 안다.
한 줄 핵심
안전은 모델에게 부탁해서 얻는 것이 아닙니다. 모델이 채울 수 없는 자리에 권한을 두고, 모델에게 주지 않을 것을 정하고, 만들지 않을 도구를 정하는 것입니다.