단북

AI 환각으로 잘못 만든 UI 컴포넌트의 렌더링 위험을 어떻게 방지하나요?

LLM이 생성한 UI/코드를 그대로 렌더링할 때의 위험과, 스키마 검증·화이트리스트·샌드박스 등 방어 전략을 정리합니다.

LLM이 UI 구조나 코드를 생성하면 환각(hallucination) 으로 존재하지 않는 컴포넌트·잘못된 props·깨진 구조를 만들 수 있습니다. 이를 그대로 렌더링하면 화면이 깨지거나 앱이 죽고, 심하면 보안 위협이 됩니다. 핵심은 “신뢰하지 말고 검증하라” 입니다.

위험

  • 렌더링 충돌 — 잘못된 구조·존재하지 않는 컴포넌트로 런타임 에러·크래시.
  • 보안 — 생성된 HTML/스크립트를 그대로 삽입하면 XSS 위험.
  • 사용자 신뢰 훼손 — 그럴듯하지만 틀린 UI/정보 노출.

방어 전략

  • 구조화된 출력 강제 — 자유 코드 대신 정해진 JSON 스키마(UI 명세) 로 받게 하고, Zod 등으로 런타임 검증. 스키마를 벗어나면 거부.
  • 컴포넌트 화이트리스트 — 미리 정의한 안전한 컴포넌트 맵에서만 렌더. 매핑에 없는 타입은 무시/대체.
    const REGISTRY = { Card, Button, Chart } as const;
    function Render({ type, props }: UiNode) {
      const Comp = REGISTRY[type];
      if (!Comp) return null; // 화이트리스트에 없으면 렌더하지 않음
      return <Comp {...sanitize(props)} />;
    }
  • props 검증·정화 — 타입·범위 검증, 문자열은 정화(DOMPurify). dangerouslySetInnerHTML 회피.
  • 에러 경계(Error Boundary) — 렌더 실패를 격리해 전체 앱이 죽지 않게.
  • 샌드박스 — 임의 코드 실행이 불가피하면 격리된 iframe·sandbox에서.
  • 휴먼/규칙 게이트 — 중요한 출력은 미리보기·확인 단계, 폴백 UI 제공.

요약: 모델 출력은 신뢰 불가 입력으로 취급 → 스키마 검증 → 화이트리스트 렌더 → 에러 경계로 격리. “임의 코드/HTML을 그대로 실행”이 가장 피해야 할 패턴입니다.

LLM이 생성한 UI를 안전하게 렌더링하는 방법으로 옳은 것은?

이 레슨을 다 읽으셨나요?

완료 표시는 이 브라우저에 저장됩니다.