Skip to main content
이미지 및 기타 파일은 텍스트와 동일한 대화 키를 사용합니다. Chat XDK로 바이트를 암호화하고(encrypt_stream / decrypt_stream), /2/chat/media/upload 경로(사이드바 API 참조 → 미디어)로 업로드한 다음, encrypt_message에 **media_hash_key**를 첨부합니다. 업로드 시 DM 스코프와 함께 **media.write**를 포함하세요. 경로에는 하이픈으로 연결된 대화 ID를 사용하세요(:-). MIME/치수는 복호화된 바이트에서 가져오는 것이 좋습니다. 이 경로는 Posts 미디어 모델(expansions=attachments.media_keys, media.fields=variants 등)이 아닙니다. 이러한 매개변수는 Posts에 적용됩니다; E2EE X Chat blob은 **media_hash_key**와 X Chat 미디어 다운로드로 지정됩니다.

암호화

encrypt_stream / decrypt_stream은 전체 페이로드를 메모리에서 처리합니다. 큰 파일의 경우 stream_encryptor() / stream_decryptor()가 증분 객체(StreamEncryptor / StreamDecryptor)를 반환합니다: push로 청크를 공급한 다음 finish를 한 번 호출하세요—finish는 스트림이 잘렸으면 오류를 냅니다.

업로드

API 참조 → 미디어 아래의 OpenAPI 페이지에 있는 요청 본문을 사용하세요. 크기가 필요한 곳에는 암호화된 blob 크기를 사용하는 것이 좋습니다. 완료는 첨부 및 다운로드용 **media_hash_key**를 반환합니다. 일시적인 5xx는 백오프로 재시도하세요. Python/TypeScript는 미디어 헬퍼가 존재할 때 XDK를 사용할 수 있습니다; 그렇지 않으면 어떤 언어에서든 Bearer 토큰과 함께 POST하세요.

첨부 파일과 함께 전송

미디어 첨부와 함께 암호화한 다음, 메시지 전송 본문을 POST합니다(시작하기와 동일한 필드 매핑).

다운로드 및 복호화

경로: GET /2/chat/media/{conversation_id}/{media_hash_key}. 응답 본문은 암호문입니다. 수신 메시지에서는 복호화된 첨부 파일 / media_hashes에서 media_hash_key를 읽습니다. 이벤트의 키 버전으로 키를 선택하세요. 각 복호화된 메시지 이벤트에는 콘텐츠가 암호화된 keyVersion(JS; 다른 바인딩은 key_version)이 포함됩니다. 최신이 아닌 해당 버전의 대화 키—conversationKeys.keys[event.keyVersion]—로 첨부 파일을 복호화하세요. 키 교체 이후(예: 멤버 추가)에는 최신 키가 오래된 메시지에 첨부된 미디어를 복호화할 수 없습니다.

  • 미디어가 암호화된 시점과 동일한 대화 키 버전을 사용하세요
  • 평문 미디어나 원시 키를 로그에 남기지 마세요
  • MIME은 복호화 에 감지하세요
  • 웹 클라이언트: 가능하면 클라이언트에서 암호화/복호화; OAuth 토큰은 서버에 유지하세요
각 미디어 경로의 전체 요청 및 응답 스키마는 사이드바의 API 참조 → 미디어에 있습니다 (업로드 초기화, 청크 추가, 업로드 완료, 미디어 다운로드).