Korat
기능

1:1 대화와 브라우저에서 바로 거는 통화

Korat의 메신저는 의도적으로 좁습니다. 두 사람, 하나의 스레드. 초대받은 식당 테이블, 누군가 공유한 게시물, 데이팅에서 성사된 매치 — 앱의 나머지가 만들어내는 것들은 모두 그 스레드 안에 카드로 도착합니다.

채팅은 Korat의 나머지 기능이 기대고 있는 자리입니다. 친구가 식당 테이블로 부르면 초대는 채팅 카드로 옵니다. 공유된 게시물은 눌러서 바로 열 수 있는 카드로 도착합니다. 데이팅 매치는 서로 좋아요를 누른 순간 진짜 대화가 됩니다. 메시지가 도착하는 곳이 하나뿐이니 확인할 곳도 하나뿐이고, 메신저는 한 가지 일만 잘하면 됩니다.

두 사람, 하나의 스레드

Korat 채팅은 1:1 전용입니다. 하나의 대화에는 정확히 두 사람이 들어가고, 세 번째 사람을 넣을 방법은 없습니다. 여러 명이 나누는 대화는 다른 두 곳에서 일어나며, 둘 다 이 메신저가 아닙니다. 하나는 그룹의 글입니다. 그룹 글은 그룹 id를 달고 있는 평범한 게시물이라 댓글, 멘션, 알림을 피드의 기존 구조에서 그대로 물려받고, 스레드로 쌓이고 검색되고 남습니다. 다른 하나는 그룹과 스포츠 클럽이 가질 수 있는 하위 방입니다. 그룹 안에 나열되는 Discord식 텍스트 채널로, 자체 테이블과 자체 권한 위에 세워져 있고 1:1 대화보다 하는 일이 훨씬 적습니다. 그 한계는 아래에 전부 적어 두었습니다. 채팅처럼 보이지만 채팅이 아닌 방은 아예 없는 것보다 나쁘기 때문입니다.

대신 1:1 스레드는 깊이를 가져갑니다. 특정 메시지를 인용해 답장하고, 보낸 뒤 수정하고, 전송을 취소하고, 중요한 메시지를 위에 고정하고, 여섯 개의 빠른 이모지 또는 서른 개짜리 바로 반응할 수 있습니다. 입력 중 표시와 읽음 상태도 예상대로 동작합니다.

메시지에 담을 수 있는 것

텍스트 외에 이미지, 임의의 파일, 그리고 기기의 MediaRecorder로 녹음한 음성 메시지(M4A 컨테이너의 AAC)를 보낼 수 있고 말풍선 안에서 바로 재생됩니다. 위치도 보낼 수 있습니다. 여기에 앱의 다른 부분이 만들어 넣는 시스템 카드 — 공유된 게시물, 식사 테이블 초대, 통화 기록 — 가 더해집니다.

새 메시지는 상대의 기기로 푸시 알림을 보냅니다 — 1:1 메시지도 가게 수신함도 마찬가지입니다. 해지되지 않은 기기에만 도착하고, 그 방을 열면 그 방의 알림이 지워집니다. 메시지를 만들어내면서 아무도 그것을 듣지 못하는 채팅은 조용한 게 아니라 고장 난 것입니다. 함께 말해야 할 한계는 웹 앱에는 푸시가 없다는 점입니다. 브라우저에서 대화하고 있다면 메시지는 도착한 순간이 아니라 탭을 열 때 보입니다.

통화 기록 카드는 생각보다 중요합니다. 울렸지만 받지 못한 통화는 그대로 두면 흔적이 남지 않습니다. 통화를 메시지로 스레드에 기록하면 한 관계의 이력이 통화 목록과 대화창으로 갈라지지 않고 스크롤 하나로 남습니다.

양쪽이 문을 열어야 걸리는 통화

음성·영상 통화는 앱 안의 관리자를 통해 실제 WebRTC로 동작하며 음소거, 카메라 끄기, 카메라 전환, 전체 화면 수신 화면과 알림을 지원합니다. 특이한 것은 그 앞에 놓인 잠금입니다. 통화 동의는 대화별로, 양쪽 모두에게 필요합니다. 두 사람이 각자 잠금을 열기 전까지 통화 버튼은 나타나지 않고, 그 전에는 누구도 상대를 호출할 수 없습니다.

울리는 전화는 앱이 할 수 있는 가장 침습적인 행동이기 때문입니다. 데이팅이나 가게 페이지에서 알게 된 사람은 무시할 수 있는 메시지를 보낼 수는 있어도, 따로 동의하지 않는 한 새벽 두 시에 전화를 울릴 수는 없습니다. 동의는 대화 단위라서 한 사람에게 열어준 것이 다른 사람에게는 아무 의미가 없습니다.

두 가지 한계를 분명히 적습니다. 1:1 대화는 두 사람 전용입니다 — 대화를 그룹으로 바꿀 수 없고, 이 페이지가 설명하는 메신저에 여러 명을 위한 판본은 없습니다. 실제로 있는 것은 그룹과 클럽이 갖는 하위 방이고, 이는 다른 테이블 위에 세워진 더 얇은 구조입니다. 보내고 자기 글을 지울 수 있는 일반 텍스트뿐이고, 메시지 수정도, 특정 메시지에 답장하기도, 반응도, 사진·파일·음성 메시지 첨부도, 통화도 되지 않습니다. 이 페이지의 어떤 문장도 하위 방에 대한 설명으로 읽혀서는 안 됩니다.

통화는 종단간 암호화되지 않으며 TURN 서버도 없습니다. 두 네트워크가 서로 직접 닿을 수 있을 때는 P2P로 연결되지만, 중계 서버가 없기 때문에 일부 이동통신망과 제한적인 NAT 조합에서는 연결 자체가 실패합니다. 통화가 성립하지 않는다면 대개 그 이유이고, 이는 앱의 버그가 아니라 아직 세우지 않은 인프라입니다.

접속 상태는 하트비트이지, 소켓이 아닙니다

Korat의 초록 점은 한 가지만 뜻합니다. 그 사람의 클라이언트가 최근 90초 안에 last_seen 시각을 기록했다는 것. 지속 연결이 아니라 주기적 폴링이라 배터리에는 가볍고 정밀도는 거칩니다. 40초 전에 앱을 닫은 사람도 접속 중으로 보이고, 터널에 들어간 사람은 어디로 가기도 전에 꺼집니다.

이것을 「접속 중」이 아니라 하트비트라고 부르는 이유는, 사람들이 접속 상태를 가장 자주 증거로 읽기 때문입니다. 메시지를 봤다는 증거, 나를 무시하고 있다는 증거. 90초짜리 폴링 창은 그 무게를 감당할 수 없습니다.

원하는 대화를 찾는 법

긴 목록을 쓸 만하게 유지하는 것은 두 가지입니다. 첫째는 대화 별칭입니다. 어떤 대화든 실제로 부르는 이름으로 바꿔 부를 수 있고, 그 이름은 오직 나에게만 보입니다. 피드, 그룹, 댓글, 상대의 프로필 어디로도 새지 않습니다. Korat의 이름은 언제나 프로필에서 실시간으로 조회되므로, 한 곳의 별칭이 다른 곳으로 흘러갈 구조가 아예 없습니다.

둘째는 라벨입니다. 직접 만드는 색상 태그로, 소속을 관리하고 생성·수정·삭제할 수 있으며 목록 필터로도 쓰입니다. 기본 필터인 안 읽음 · 공식 계정 · 데이팅에서 온 대화 옆에 나란히 놓입니다. 검색은 대화 이름과 마지막 메시지를 함께 훑기 때문에 어렴풋이 기억나는 한 문장이면 스레드를 찾기에 충분합니다. 대화는 상단 고정, 읽음 처리, 삭제할 수 있습니다.

서버가 볼 수 있는 것, 그리고 상대에게 할 수 있는 것

메시지는 서버에 평문으로 저장되며, 대화의 행을 두 참여자에게만 한정하는 행 수준 보안 정책으로 보호됩니다. Korat 어디에도 채팅·통화·파일의 종단간 암호화는 없고, 관리형 데이터베이스가 제공하는 것 이상의 애플리케이션 수준 저장 암호화도 없습니다. 그것이 요구 사항인 대화라면 그 목적에 맞게 만들어진 도구를 쓰십시오. 안심시키는 한마디보다 정확한 위협 모델이 더 쓸모 있습니다.

사람 쪽의 대응은 이렇습니다. 스레드에서든 프로필에서든 차단할 수 있고, 차단하면 상대의 대화와 게시물이 가려지는 동시에 데이팅 덱에서도 사라집니다. 신고도 가능합니다. 차단은 화면마다 반복해야 하는 동작이 아니라, 한 번으로 앱 전체에 결과가 미치는 동작입니다.

방으로 떨어지는 카드에는 각각 출처가 있습니다. 친구가 부른 자리는 주문의 그 테이블이고, 흘러온 게시물은 피드의 바로 그 글입니다.

손님이 가게로 보내는 메시지도 같은 구조를 씁니다. 다만 가게 쪽에서 읽는 곳은 비즈니스 콘솔의 수신함입니다. 디지털 명함을 찍은 뒤 바로 말을 걸 때도 결국 여기로 돌아옵니다.

자주 묻는 질문

Korat에 단체 채팅이 있나요?

메신저에는 없습니다. 1:1 대화는 두 사람 전용이고 세 번째 사람을 넣을 수 없습니다. 여러 명은 그룹에서 이야기합니다. 하나는 댓글과 @멘션, 알림을 지원하는 글이고, 다른 하나는 그룹 안에 나열되는 Discord식 텍스트 채널인 하위 방으로, 스포츠 클럽에도 같은 것이 있습니다.

그 하위 방은 1:1 채팅과는 별개의 구조이고 하는 일이 훨씬 적습니다. 보내고 자기 글을 지울 수 있는 일반 텍스트뿐이고, 메시지 수정도, 특정 메시지에 답장하기도, 반응도, 사진·파일·음성 메시지 첨부도, 통화도 되지 않습니다.

Korat 메시지는 종단간 암호화되나요?

아닙니다. 메시지와 파일, 통화 모두 종단간 암호화되지 않습니다. 채팅 행은 서버에 저장되고, 각 대화를 두 참여자로 한정하는 행 수준 보안 정책이 보호합니다.

관리형 데이터베이스가 제공하는 것 이상의 애플리케이션 수준 저장 암호화는 없습니다.

대화에서 통화 버튼이 보이지 않는 이유는 무엇인가요?

통화 동의는 대화별이며 양쪽 모두에게 필요합니다. 그 스레드에서 두 사람이 모두 통화 잠금을 열어야 음성·영상 버튼이 나타납니다.

한 사람에게 열어준 것은 다른 누구에게도 적용되지 않습니다.

영상 통화가 연결되지 않습니다. 무엇이 문제인가요?

아직 TURN 중계 서버가 없어서 통화는 두 기기가 서로 직접 닿을 수 있는지에 의존합니다. 일부 이동통신망과 제한적인 NAT 조합에서는 그것이 불가능해 연결이 성립하지 않습니다.

두 기기가 같은 Wi-Fi에 있거나 직접 연결을 허용하는 네트워크라면 대개 동작합니다.

대화 이름을 바꾸면 상대에게도 보이나요?

보이지 않습니다. 대화 별칭은 나에게만 적용됩니다. 상대의 실제 표시 이름은 피드와 댓글, 그룹을 포함해 모든 곳에서 그대로 보입니다.

Korat의 이름은 프로필에서 실시간으로 조회되므로 별칭이 콘텐츠로 새어 나갈 수 없습니다.

대화를 열어보세요

Korat은 무료이며 안드로이드와 브라우저에서 동작하고, 채팅은 양쪽에서 동일하게 작동합니다.