설치
- Python
- TypeScript
- Rust
- Go
- C#
- Java
chatxdk이며, chat_xdk로 임포트합니다. Python 3.10+ 필요.빠른 시작
백로그를 복호화하고, 키를 캐시하고, 이벤트 하나를 복호화하고, 회신을 암호화합니다. 시작하기에서와 같이 전송 본문을POST /2/chat/conversations/{id}/messages에 연결하세요.
- Python
- TypeScript
- Rust
- Go
- C#
- Java
라이프사이클 및 키
SDK를 구성하고, 개인 키를 저장하며(패스코드로 보호되는 보안 키 백업 또는 로컬 키 blob), Chat API에 공개 키를 등록하고, 잠금 해제 또는 가져오기 후 등록된 공개 키 버전을 설정하세요. 보안 키 백업은 Juicebox로 구현되어 있으며, 관련 구성 필드가 그 이름을 갖는 것도 그 때문입니다. 기기/앱 신원당 한 번generate_keypairs를 호출하고, 등록 페이로드를 공개 키 엔드포인트에 POST하세요. 모든 바인딩에서 보안 키 백업을 위해 setup / unlock(및 관련 패스코드 헬퍼)을 사용하세요. export_keys / import_keys(봇 및 서버용 원시 키 blob 지속)는 네이티브 바인딩에서만 사용 가능합니다—Python, Go, .NET, JVM, Rust. JS/WASM 바인딩은 원시 키 내보내기 또는 가져오기를 노출하지 않습니다: 브라우저에서 인스턴스에 접근하는 모든 스크립트가 신원을 유출할 수 있으므로, JS는 키를 보안 키 백업 내부에 유지합니다. 요청당 백업 realm 왕복을 피하고자 하는 JS 서버는 요청 전반에 걸쳐 잠금 해제된 하나의 Chat 인스턴스를 재사용하거나, 키 blob이 지원되는 네이티브 바인딩을 실행해야 합니다.
- Python
- TypeScript
- Rust
- Go
- C#
- Java
juicebox_config 객체(권장—그대로 전달), 전체 sdk_config 래퍼, 또는 순수한 token_map.
선택 사항: 서명 검증은 기본적으로 켜져 있습니다(reject_unverified = true)—비활성화하려면 set_reject_unverified(false)를 호출하세요(권장하지 않음); 백업 realm 구성이 변경되면 update_config; UI 상태를 위해 is_unlocked / has_identity_key. 전체 필드 목록은 chat-xdk 저장소의 스텁에 있습니다.
대화 키
세 가지 prepare 메서드는 각각 하나의 호출로 키 변경에 필요한 모든 것을 수행합니다: 새 대화 키를 생성하고, 각 참가자(전달한 공개 키에서)에 대해 암호화하고, 변경 사항에 서명합니다. 모두 동일한PreparedConversationChange 형태를 반환하며, POST할 준비가 되어 있습니다—conversation_participant_keys에서 SDK 필드 encrypted_key를 **encrypted_conversation_key**로 이름을 바꾸고, action signature를 필수 action_signatures 본문 필드로 매핑하세요.
encrypt_message와 미디어를 위해 원시 키 바이트를 보관하세요; API의 암호화된 봉투를 암호화에 전달하지 마세요.
{ keys, latest_version }를 재구축하려면 키 변경 이벤트 페이로드에 extract_conversation_keys를 사용하세요. decrypt_conversation_key는 단일 ECIES blob을 언래핑합니다.
- Python
- TypeScript
- Rust
- Go
- C#
- Java
prepare_group_create에는 멤버/관리자 ID 목록; prepare_group_members_change에는 새 로스터와 현재 로스터)—샘플은 그룹을 참조하세요. 둘 다 두 개의 action signature를 반환합니다; POST는 둘 다 포함해야 합니다.
복호화
**decrypt_events**는 이력과 백로그용입니다: 스트림에서 대화 키를 가져오고, 복호화된 메시지를 반환하며, 전체 배치가 실패하는 대신 이벤트별 오류를 수집합니다. **decrypt_event**는 이미 키 캐시가 있을 때 단일 실시간 이벤트용입니다; 실패 시 예외를 발생/던집니다.
SDK가 발신자를 검증할 수 있도록 서명 키를 전달하세요. API 공개 키 필드를 SigningKeyEntry에 매핑합니다: public_key_version → public_key_version(같은 이름), signing_public_key → public_key, public_key → identity_public_key, 그리고 identity_public_key_signature와 user_id. 검증은 기본적으로 필수입니다: 서명 키 목록을 생략하거나 빈 목록을 전달해도 이를 건너뛰지 않습니다—서명된 이벤트는 실패합니다(decrypt_events의 경우 errors에 수집, decrypt_event의 경우 던져짐). 실제로 검증을 건너뛰려면 먼저 set_reject_unverified(false)를 호출해야 합니다(프로덕션에서는 권장하지 않음).
- Python
- TypeScript
- Rust
- Go
- C#
- Java
암호화 및 전송 헬퍼
**encrypt_message**는 텍스트 메시지를 위한 서명된 암호문을 만듭니다(선택적 엔티티, media_hash_key를 통한 첨부, TTL, 알림 플래그). 반환된 페이로드를 메시지 전송 본문에 매핑하세요: encrypted_content → encoded_message_create_event, encoded_event_signature → encoded_message_event_signature, 그리고 message_id.
회신과 반응에는 encrypt_reply, encrypt_add_reaction, **encrypt_remove_reaction**을 사용하세요(sequence_id는 부모를 대상으로 함). **encrypt / decrypt**는 대화 키 아래의 UTF-8 메타데이터용입니다(예: 암호화된 그룹 이름)—메시지 봉투용이 아닙니다. **encrypt_stream / decrypt_stream**은 첨부 바이트를 암호화합니다; 미디어 참조. 저수준 **sign / verify / verify_key_binding**은 고급 흐름을 지원합니다; 대화 키 변경, 그룹 생성, 멤버 추가는 prepare 메서드에 의해 서명됩니다.
encrypt_message / encrypt_reply에 전달되는 대화 ID는 보유하고 있는 어떤 형태든 될 수 있습니다—이벤트의 A:B, 목록이나 URL 경로의 A-B(어떤 순서든), 또는 순수한 수신자 사용자 ID—SDK가 서명 전에 정규화합니다. 그룹 ID(g 접두사)는 그대로 통과됩니다.
- Python
- TypeScript
- Rust
- Go
- C#
- Java
미디어 스트림
텍스트에 사용된 것과 동일한 대화 키로 파일 바이트를 암호화하고, Chat 미디어 API를 통해 업로드하며,encrypt_message에 **media_hash_key**를 첨부하세요. 이것은 Posts 미디어 모델(expansions=attachments.media_keys)이 아닙니다. 전체 업로드/다운로드 흐름: 미디어.
- Python
- TypeScript
- Rust
- Go
- C#
- Java
큰 미디어를 위한 증분 스트리밍
큰 파일의 경우, 전체 페이로드를 메모리에 보관하지 마세요:stream_encryptor() / stream_decryptor()는 청크(각 약 1 MB)로 push(chunk)를 통해 공급한 다음 마지막에 finish()를 한 번 호출하는 StreamEncryptor / StreamDecryptor를 반환합니다. 복호화 시 finish()는 잘린 스트림을 감지합니다(마지막 프레임 전에 입력이 끝났으면 실패), 그러므로 성공하기 전까지 푸시된 평문을 완료된 것으로 취급하지 마세요.
- Python
- TypeScript
유틸리티
Base64/hex 헬퍼, MIME 감지, 이미지 치수는 모듈 수준 함수(Python/JS/Rust/Go) 또는ChatXdkUtilities(C#/Java)로 사용할 수 있습니다—추가 라이브러리를 가져오지 않고 첨부 파일 메타데이터를 구축할 때 유용합니다.
- Python
- TypeScript
- Rust
- Go
- C#
- Java
중요한 타입
이러한 개념적 타입은 언어 전반에 걸쳐 나타납니다(정확한 필드 이름은 다릅니다; JS는 종종message와 같은 camelCase 이벤트 판별자를 사용합니다):
- SendPayload —
encrypt_message및 관련 암호화 헬퍼의 반환값; Chat API 전송 본문에 매핑. - PublicKeyRegistrationPayload — 공개 키 추가 API를 위한
generate_keypairs/ 공개 키 게터의 출력. - SigningKeyEntry — 서명 검증을 위해 복호화에 전달되는 발신자 공개 자료.
- PreparedConversationChange — 세 가지 prepare 메서드의 출력: 파생되거나 전달된
conversation_id, 원시conversation_key바이트,conversation_key_version,participant_keys(user_id,encrypted_key,public_key_version), 그리고action_signatures(message_id,encoded_message_event_detail,signature,signature_version,public_key_version, 선택적signature_payload—키 변경 서명에서는 해당 페이로드가 평문 키를 포함하므로 생략됨). - DecryptEventsResult — 메시지, 선택적 오류, 그리고 추출된
conversation_keys.
docs/API.md, *.pyi, index.d.ts)을 사용하세요.
오류
Python은 일반적으로 설명적인 메시지와 함께 **ValueError**를 발생시킵니다(예: 잘못된 패스코드). TypeScript/JavaScript는 **Error**를 던집니다. Go는 (value, error)를 반환합니다. 이력의 경우 하나의 잘못된 이벤트가 배치를 중단시키지 않도록 **decrypt_events**를 선호하세요; 부분적 실패에 대해서는 errors 컬렉션을 검사하세요.
일부 검증 오류는 영구적입니다. 서명은 불변이며 이벤트 자체에서 서명된 페이로드를 재구축하여 검증되므로, signature missing or no matching signing key 또는 ECDSA 불일치로 실패하는 오래된 이벤트는 이후 로드 시마다 실패합니다—재시도, 키 갱신, 또는 API 호출로도 치유할 수 없습니다. 이러한 것을 일시적 오류가 아닌 툼스톤으로 취급하세요. 대화 키를 교체하면 그 시점 이후부터 깨끗하고 검증 가능한 이력이 시작됩니다.
다음 단계
시작하기
Chat XDK를 Chat API에 연결하기
미디어
스트림 암호화 및 미디어 REST
실시간 이벤트
웹훅 및 활동 전달
문제 해결
일반적인 실패