interlinear

실무자와 개발자 사이비즈니스 앱과 에이전트 사이자연어와 기계어 사이

JavaScript 한 줄 없이 WebChat 임베드하기

자바스크립트 없이 Copilot Studio 챗봇을 웹사이트에 임베드하는 botframework-webchat-embed 라이브러리 사용법을 소개해요.

원문: Embedding WebChat Without Writing a Single Line of JavaScript 게시일: 2026-01-26 · 저자: Adi Leibowitz

새 라이브러리를 만들었어요. 미니멀리즘이 핵심이에요. 그 정신에 따르자면, 이 글은 아마 여기서 끝나야 할 거예요.

아니면 하이쿠로 표현할 수도 있겠네요.

데이터 속성이여
JavaScript는 필요 없네
WebChat이 그저 나타나네

하지만 이번 것은 너무 신이 나서 여기서 멈출 수가 없어요. 그래서 전체 그림을 소개할게요.

요약하자면: 이제 HTML만으로 완전한 기능을 갖춘 Copilot Studio 채팅 위젯을 어떤 웹사이트에든 임베드할 수 있어요. 작성할 JavaScript도 없고, 빌드 단계도 없어요. 데이터 속성 몇 개가 달린 <div> 하나와 스크립트 태그 하나면 충분해요.

기존 WebChat 임베딩 방식의 문제

BotFramework WebChat을 임베드하는 표준 방식은 대략 이래요.

const tokenEndpointURL = 'https://your-token-endpoint';
const res = await fetch(tokenEndpointURL);
const { token } = await res.json();

window.WebChat.renderWebChat(
  {
    directLine: window.WebChat.createDirectLine({ token }),
    styleOptions: {
      accent: '#0078d4',
      bubbleBorderRadius: 12,
      // ... many more options
    }
  },
  document.getElementById('webchat')
);

이를 위해서는 다음이 필요해요.

  • async/await와 fetch에 대한 이해
  • Direct Line 토큰의 동작 방식에 대한 지식
  • styleOptions 수동 구성
  • 토큰 실패에 대한 오류 처리
  • 채팅 컨테이너 요소 관리

그리고 이건 고정된 채팅 창을 위한 것일 뿐이에요. 최소화하고 확장되는 플로팅 버블을 원하시나요? 그러면 이제 다음도 만들어야 해요.

  • 상태 관리가 있는 토글 버튼
  • 표시·숨김 애니메이션
  • 최소화 및 재시작 컨트롤이 있는 헤더
  • 플로팅 컨테이너의 위치 지정 로직

개발자라면 다 가능한 일이지만, 마케팅 사이트에 채팅 위젯 하나 추가하고 싶은 사람에게는 고역이에요.

botframework-webchat-embed 등장

botframework-webchat-embed는 위의 모든 걸 대신 처리해 주는 WebChat의 경량 래퍼예요. 모든 것을 HTML 데이터 속성으로 구성하면, 토큰 가져오기, 위젯 렌더링, 플로팅 버블 UI를 알아서 처리해요.

전체 통합 코드는 이렇게 생겼어요.

<!-- 1. Add a container with your token endpoint -->
<div
  style="position: fixed; bottom: 20px; right: 20px; width: 380px; height: 550px;"
  data-webchat-token-url="https://your-copilot-studio-token-endpoint">
</div>

<!-- 2. Load the script -->
<script src="https://cdn.jsdelivr.net/npm/botframework-webchat-embed@latest"></script>

이게 전부예요. 요소 두 개. 스크립트가 data-webchat-token-url이 있는 요소를 자동으로 찾아, 다음을 모두 갖춘 완전한 기능의 채팅 위젯을 렌더링해요.

  • 클릭하면 확장되는 플로팅 채팅 버블
  • 최소화 및 재시작 버튼이 있는 헤더
  • 사이트의 CSS 변수로부터 자동 스타일 상속
  • 지연 로딩(사용자가 위젯을 열 때만 WebChat이 로드됨)

위젯 구성하기

먼저 Copilot Studio 토큰 엔드포인트가 필요해요. 설정(Settings) → **채널(Channels)**로 이동해 이메일(Email) 채널을 선택하고 토큰 엔드포인트(Token Endpoint) URL을 복사하세요.

주의: 이 라이브러리는 인증되지 않은 에이전트만 지원해요. 에이전트에 Entra ID 인증이 필요하다면 전체 WebChat SDK를 써야 해요.

외관

헤더와 버블 텍스트를 커스터마이징할 수 있어요.

<div
  data-webchat-token-url="https://your-token-endpoint"
  data-webchat-title="Support"
  data-webchat-bubble-text="Need help?">
</div>

스타일링

위젯은 사이트의 CSS 변수(--primary-color, --accent-color, --brand-color)를 자동으로 감지하고 컨테이너로부터 font-family를 상속받아요. 서로 다른 사이트의 두 위젯인데도, 명시적 스타일링은 전혀 없어요.

--primary-color: #6366f1을 사용하는 사이트

--primary-color: #f97316을 사용하는 사이트

명시적으로 제어하려면 data-webchat-style-* 속성(모든 WebChat styleOption의 kebab-case 버전)을 쓰세요.

<div
  data-webchat-token-url="..."
  data-webchat-style-accent-color="#ff6b6b"
  data-webchat-style-bubble-border-radius="8"
  data-webchat-style-hide-upload-button="true">
</div>

동작

여기서부터가 재미있는 부분이에요. 앞서 말했던 상태 관리, 지연 로딩, 환영 메시지 로직을 기억하시나요? 이 모든 게 속성 몇 개로 처리돼요.

속성 기본값 동작
data-webchat-minimized true 플로팅 버블 상태로 시작
data-webchat-preload false 최소화 상태에서도 WebChat을 즉시 로드
data-webchat-send-start-event true 로드 시 Conversation Start 토픽 트리거
data-webchat-mock-welcome false 에이전트 호출 대신 클라이언트 사이드 환영 메시지 표시

마지막 항목이 제가 제일 좋아하는 기능이에요. 에이전트를 실제로 트리거하지 않고 친근한 인사말을 표시하고 싶으신가요? 불리언 하나만 바꾸면 돼요. Redux 미들웨어도, 액티비티 주입도, 타이밍 꼼수도 필요 없어요. 이게 왜 중요한지 설명하는 모킹된 환영 메시지에 대한 글을 통째로 쓴 적이 있는데, 여기서는 그저… 속성 하나예요.

완전한 예제

다크 테마 사이트에서는 이런 모습이에요.

<!DOCTYPE html>
<html>
<head>
  <style>
    :root { --primary-color: #6366f1; }
    body { font-family: 'Inter', sans-serif; }
    .chat-widget {
      position: fixed;
      bottom: 20px;
      right: 20px;
      width: 380px;
      height: 550px;
    }
  </style>
</head>
<body>
  <div
    class="chat-widget"
    data-webchat-token-url="https://your-token-endpoint"
    data-webchat-title="Support"
    data-webchat-bubble-text="Chat with us">
  </div>
  <script src="https://cdn.jsdelivr.net/npm/botframework-webchat-embed@latest"></script>
</body>
</html>

제한 사항

이 라이브러리는 의도적으로 다음을 지원하지 않아요.

  • Entra ID로 인증되는 에이전트
  • Direct Line 시크릿
  • 커스텀 미들웨어 또는 액티비티 인터셉터

이 중 하나라도 필요하다면 전체 BotFramework WebChat SDK를 쓰세요.

핵심 요약

  • HTML 데이터 속성만으로 WebChat 임베드
  • CSS 변수로부터 자동 스타일 상속
  • 최소화·재시작 기능이 내장된 플로팅 버블 UI
  • 인증되지 않은 Copilot Studio 에이전트 전용

속성이란 무엇인가
코드가 아닌, 선언된 의도
그리고 그것은 이루어지네

여러분의 사이트에 WebChat을 임베드해 보셨나요? 여러분의 사용 사례가 궁금해요. 아래에 댓글을 남겨 주세요!