마이크로소프트 팀즈 채팅 내보내기, 무료 계정과 Graph API 경로
개인 무료 계정은 teams.live.com/dataexport에서 대화 기록을 .tar로 받고, 조직 대화는 Microsoft Graph의 getAllMessages Export API로 뽑는다. 권한·페이징·삭제 21일 제한을 개발자 관점에서 정리했다.
마이크로소프트 팀즈에서 채팅을 내보내는 경로는 계정 종류에 따라 갈린다. 개인용 무료 계정이라면 웹 내보내기 페이지에서 대화 기록을 직접 내려받고, 회사나 학교 조직의 대화를 프로그래밍으로 뽑아내려면 Microsoft Graph의 Teams Export API를 쓴다. 2026년 7월 기준 마이크로소프트 공식 문서(Microsoft Learn)는 이 두 갈래를 서로 다른 절차로 안내한다. 이 글은 개인 계정의 자가 내보내기, 개발자·관리자용 Export API, 그리고 웹 앱용 오픈소스 확장 세 경로를 다루며, 규정 준수용 eDiscovery 도구의 세부 설정은 범위 밖이다.

개인 무료 계정은 어디서 내보내나
개인 마이크로소프트 계정으로 쓰는 무료 팀즈라면 전용 웹 페이지에서 직접 받는다. 마이크로소프트 지원 문서에 따르면 팀즈 데이터 내보내기 페이지에 로그인한 뒤 '대화 기록(Chat history)'과 '미디어(Media)' 중 받을 항목을 고르고 요청을 제출하면 된다. 파일 준비에는 시간이 걸리므로 'Available Exports' 목록을 다시 확인해 준비된 파일을 내려받는다.
결과물은 .tar 압축 파일 하나로 나온다. 대화 본문과 함께 통화 기록, 무료 버전 설문(Polls) 데이터도 같이 담긴다고 지원 문서는 설명한다. macOS와 Windows 10 이상은 별도 프로그램 없이 이 압축을 풀 수 있다. 다만 이 경로는 본인 계정의 데이터만 대상이라, 여러 사용자나 조직 전체를 한 번에 뽑는 용도로는 맞지 않는다.
조직 메시지는 Graph Export API로 뽑는다
회사·학교 계정의 대화를 대량으로 추출하려면 Microsoft Graph의 Export API를 호출한다. 마이크로소프트 공식 문서에 따르면 1:1·그룹·회의 채팅은 users/{id}/chats/getAllMessages, 채널 메시지는 teams/{id}/channels/getAllMessages 엔드포인트로 가져온다. 두 API 모두 로그인한 사용자 없이 앱 자격으로만 동작하는 애플리케이션 권한을 쓰고, 위임(delegated) 권한은 지원하지 않는다. 채팅에는 Chat.Read.All, 채널에는 ChannelMessage.Read.All 권한이 필요하며 이 승인은 관리자만 할 수 있다.
GET https://graph.microsoft.com/v1.0/users/{id}/chats/getAllMessages?$top=50&$filter=lastModifiedDateTime gt 2026-06-01T00:00:00Z and lastModifiedDateTime lt 2026-07-01T00:00:00Z
Authorization: Bearer {token}공식 문서는 $top 값을 최대 250까지 권장하지만, 이 값은 정확한 페이지 크기가 아니라 힌트일 뿐이다. 메시지가 여러 사서함 폴더에서 모이는 구조라 응답이 요청보다 적게 오면서 @odata.nextLink가 함께 붙을 수 있다. 그래서 실제 코드는 nextLink가 사라질 때까지 반복 호출하는 페이징 루프로 짜야 한다. 게다가 응답이 createdDateTime 순으로 정렬된다는 보장이 없으니, 시간순 정리는 데이터를 받는 쪽에서 다시 해야 한다. 자세한 엔드포인트와 필터 문법은 마이크로소프트의 Teams Export API 문서에 정리돼 있다.
내보내기 전에 챙길 제약
Export API에는 실무에서 걸리기 쉬운 조건이 몇 가지 있다. 첫째, 사용자가 팀즈 클라이언트에서 지운 메시지는 삭제 시점부터 21일까지만 API로 접근할 수 있다. 테넌트에 보존 정책이 설정돼 있으면 getAllRetainedMessages로 최대 30일까지 회수한다고 마이크로소프트 문서는 설명한다. 둘째, 별도 모델 선언 없이 그냥 호출하면 기본값인 평가(evaluation) 모드로 걸려 요청 앱당 사용량이 제한되고, 운영 규모로 쓰려면 데이터를 뽑는 대상 사용자에게 활성 Teams 라이선스가 있어야 한다.
셋째, 이 API는 보낸 메시지와 받은 메시지를 모두 돌려준다. 그래서 한 대화방의 참가자 전원을 대상으로 돌리면 같은 메시지가 중복으로 쌓인다. from/user/id 필터로 발신자를 좁혀 걸러내는 편이 저장 용량과 후처리 부담을 줄인다. 마지막으로 내보낸 파일에는 대화 상대의 개인정보가 그대로 담기므로, 개발자가 자기 계정과 코드부터 점검하는 것과 같은 감각으로 접근 권한과 보관 위치, 보관 기간을 미리 정해 두고 다루는 편이 안전하다.
웹 앱 대화는 오픈소스 확장으로도 내보낸다
공식 두 경로가 부담스러우면 브라우저 확장이라는 세 번째 선택지가 있다. gediz가 GitHub에 teams-web-chat-exporter 저장소로 공개한 오픈소스 확장 'Teams Chat Exporter'는 Chrome 웹스토어와 마이크로소프트 Edge 애드온, 파이어폭스 애드온으로 배포된다. 저장소 README에 따르면 이 확장은 특히 팀즈 웹 앱에서 지금 열려 있는 대화를 대상으로, 관리자 승인이나 별도 서버 없이 브라우저에서 바로 파일을 뽑는다.
README가 밝히는 출력 형식은 JSON, CSV, HTML, TXT, PDF 다섯 가지이고, 여러 형식을 한 번에 고르면 zip 번들 하나로 묶인다. 메시지 단위로는 본문 텍스트와 타임스탬프, 작성자에 더해 멘션, 반응(반응한 사람 이름 포함), 이미지·GIF·음성 같은 인라인 미디어까지 담는다. 날짜 범위로 기간을 좁히거나 여러 대화를 한 번들로 묶는 것도 지원한다.
개발자 입장에서 눈여겨볼 지점은 데이터가 어디로 나가느냐다. 저장소 설명에 따르면 이 확장은 로그인한 사용자의 로컬 환경에서만 동작하고, 이미 인증된 마이크로소프트 자체 Teams·SharePoint 엔드포인트하고만 통신한다. 제3자 서버로 대화 내용이 빠져나가지 않는다는 뜻이다. 라이선스는 MIT이고, Chat Service API를 쓸 수 없을 때는 웹 UI를 스크롤하며 DOM에서 메시지를 읽는 폴백으로 동작한다고 저장소는 밝힌다. 다만 내보내는 데이터가 조직 자산인 만큼, 소속 조직의 규정과 마이크로소프트 정책을 따를 책임은 사용자에게 있다.





