kotalk/문서/27-cross-device-handoff-and-session-continuity.md
2026-04-16 09:24:26 +09:00

8.1 KiB

Cross Device Handoff And Session Continuity

목적

메신저는 단일 기기 앱이 아니라 흐름이 이어지는 도구여야 한다.
사용자는 PC에서 읽다가 모바일에서 이어 보고, 모바일에서 초안을 쓰다가 데스크톱에서 마무리한다.
이 흐름이 부자연스럽다면 기능이 많아도 실제 체감은 낮다.

이 문서는 Windows 데스크톱, 모바일 웹, 안드로이드가 병렬로 존재하는 상황에서 세션이 끊기지 않고, 문맥이 보존되며, 같은 일을 다시 하지 않아도 되는 제품 설계를 정의한다.

현재 산출물의 핵심 리스크

  • 모바일 웹에서 세션 만료가 발생하면 사용자는 제품 전체를 불안정하게 느낀다.
  • 기기 전환 시 마지막으로 보던 대화, 읽지 않은 구간, 작성 중 초안이 유지되지 않는다.
  • 실제 구현보다 문서가 앞서 있어 사용자 기대와 현실 사이의 간극이 생긴다.
  • 다른 기기에서 다시 해야 하는 일이 많을수록 메신저의 신뢰도는 빠르게 하락한다.

핵심 원칙

1. 세션 연속성은 편의 기능이 아니라 신뢰 기능이다

  • 사용자는 토큰 구조를 이해하지 않는다.
  • 사용자가 이해하는 것은 갑자기 다시 로그인해야 했는가, 쓰던 것이 남아 있었는가 뿐이다.
  • 따라서 세션 설계는 보안과 UX를 함께 다뤄야 한다.

2. 기기 전환 비용은 거의 0에 가까워야 한다

  • 다른 기기에서 앱을 열었을 때 마지막 대화와 읽지 않은 구간이 보여야 한다.
  • 최소한 어디서 멈췄는지는 기억돼야 한다.
  • 사용자는 다시 검색하고 다시 스크롤하고 다시 정리하는 과정을 반복하고 싶어 하지 않는다.

3. 작성 중 상태는 로컬과 서버를 함께 활용해 지킨다

  • 로컬 캐시는 즉시성에 강하고, 서버 초안은 기기 간 이동에 강하다.
  • 둘 중 하나만 있으면 경험이 끊긴다.

지원해야 하는 전환 시나리오

PC -> 모바일 웹

  • 퇴근 직전 PC에서 읽던 업무방을 모바일에서 바로 이어 본다.
  • 방금 입력하던 초안은 이어쓰기 카드로 복원된다.
  • PC에서 연 파일과 링크는 모바일에서 최근 작업 항목으로 보인다.

모바일 웹 -> PC

  • 이동 중 모바일에서 가볍게 읽고, 자리로 돌아와 PC에서 자세히 답변한다.
  • 읽음 커서는 서버 기준으로 즉시 동기화된다.
  • 긴 답장이나 파일 첨부가 예상될 때 PC에서 이어쓰기 제안을 보여 줄 수 있다.

안드로이드 -> PC

  • 푸시 알림에서 확인만 해 둔 대화가 PC에서 방금 모바일에서 본 대화로 우선 노출된다.
  • 사진 업로드 직후 PC에서 해당 스레드가 자동 포커스된다.

다중 데스크톱 창

  • 메인 창과 팝아웃 창이 동시에 열려 있어도 상태 충돌이 없어야 한다.
  • 읽기 커서와 드래프트는 창 단위가 아니라 사용자 단위로 동기화되어야 한다.

세션 정책

인증 수명 정책

  • 액세스 토큰은 짧게 가져가되, 리프레시 경로는 사용자가 느끼지 못하도록 매끄럽게 동작해야 한다.
  • 세션 만료 예정 시 조용히 갱신을 시도하고 실패할 때만 명시적으로 안내한다.
  • 사용자가 작성 중일 때는 로그인 강제 이동을 하지 않는다.
  • 먼저 드래프트 보존, 그 다음 세션 복구, 마지막으로 재인증 순서를 따른다.

장치 등록 정책

  • 각 기기는 신뢰 장치로 등록된다.
  • 등록 시 보이는 항목:
    • 장치명
    • OS
    • 최근 사용 시각
    • 대략적 지역
  • 사용자는 활성 장치를 한눈에 보고 원격 로그아웃할 수 있어야 한다.

안전 장치

  • 낯선 장치 로그인 시 기존 기기에 약한 알림을 보낸다.
  • 비밀번호 없는 Alpha 단계에서도 장치 목록과 강제 로그아웃은 제공한다.
  • 민감한 장치 작업은 최근 인증 재확인을 붙인다.

상태 동기화 모델

반드시 동기화할 상태

  • 마지막으로 보던 대화
  • 각 대화의 읽음 위치
  • 임시 저장된 초안
  • 고정/무음/업무방/친한 대화 상태
  • 최근 검색 기록
  • 최근 연 파일과 링크
  • 알림 선호도

로컬 전용으로 남길 상태

  • 창 분할 비율
  • 특정 기기의 로컬 UI 밀도 설정
  • 최근 열어 본 팝아웃 창 배치
  • 임시 개발용 진단 토글

서버 우선 상태

  • 읽음 커서
  • 초안 메타데이터
  • 장치 목록
  • 멀티 디바이스 충돌 해결 버전

충돌 해결 원칙

  • 같은 대화 초안을 두 기기에서 동시에 수정하면 가장 최근 수정본을 기본 제안으로 둔다.
  • 다만 최근 이전본도 다른 기기 초안으로 되돌릴 수 있어야 한다.
  • 읽음 커서는 더 뒤로 간 위치를 우선으로 한다.
  • 무음, 고정 상태는 마지막 변경 시각 기준으로 반영한다.

UI 설계

데스크톱

  • 사이드바 상단에 다른 기기에서 이어보기 섹션을 둘 수 있다.
  • 설정의 계정 화면에서 장치 목록과 세션 상태를 보여 준다.
  • 세션 이상 시 화면 전체 차단 대신 상단 배너를 사용한다.
  • 팝아웃 창은 세션 만료 후에도 즉시 닫히지 않고 복구 시도 후 상태를 안내한다.

모바일 웹

  • 로그아웃 공포를 줄이기 위해 세션을 확인하는 중 상태를 자연스럽게 보여 준다.
  • 브라우저 재시작 후 첫 진입 시 마지막 대화를 가장 먼저 복원한다.
  • 초안 복원은 배너보다 입력창 안의 작은 힌트로 노출한다.

안드로이드

  • 푸시에서 진입한 대화가 이미 다른 기기에서 읽혔더라도 관련 문맥은 남겨 준다.
  • 이미지 업로드, 카메라 전환, 백그라운드 재개 중 세션 갱신 실패를 견디는 설계가 필요하다.

업무적 소통 강화 장치

  • 회의 전 최근 사용 장치를 기준으로 가장 적합한 기기에서 열어 보게 유도한다.
  • 데스크톱에서는 회의방, 작업방, 나에게 보내기 메모를 서로 다른 창으로 띄울 수 있어야 한다.
  • 모바일에서 나중에 PC에서 정리 플래그를 남기면 PC에서 바로 보인다.
  • 링크와 파일은 기기 전환 후에도 같은 문맥에서 이어서 열린다.

친근한 소통 강화 장치

  • 사진과 음성 중심 대화는 모바일에서 이어 쓰기 쉬워야 한다.
  • 데스크톱에서 읽던 사적 대화는 모바일에서 가볍게 이어보기 수준으로 복원한다.
  • 친구 대화의 경우 장치 목록 노출이 과도하게 불안감을 주지 않도록 문구를 차분하게 설계한다.

실패 시나리오

  • 세션 갱신 실패
  • 오프라인 상태에서 앱 재실행
  • 장치 시간이 어긋난 상태
  • 장치 간 읽음 커서 지연
  • 초안 충돌
  • 서버 점검 또는 배포 직후 재연결 실패

각 실패는 사용자에게 무슨 일이 일어났는지, 다음에 무엇이 보장되는지, 무엇을 눌러야 하는지가 1문장 안에 설명되어야 한다.

QA 기준

  • 토큰 만료 후 재진입 시 90% 이상이 재로그인 없이 복구돼야 한다.
  • 작성 중 초안 손실률은 0에 가깝게 관리해야 한다.
  • 기기 전환 후 마지막 대화 복원 성공률을 핵심 KPI로 둔다.
  • 모바일 웹은 브라우저 종료/재개, PWA 홈 진입, 백그라운드 복귀를 반드시 반복 검증한다.

단계별 범위

Alpha

  • 장치 등록
  • 읽음 커서 동기화
  • 마지막 대화 복원
  • 로컬 초안 보존

Beta

  • 서버 초안 동기화
  • 장치 목록/원격 로그아웃
  • 세션 자동 갱신
  • 모바일에서 PC로 이어쓰기 제안

Later

  • 패스키 기반 신뢰 장치
  • 다중 창/다중 계정 고급 정책
  • 작업 흐름 기반 장치 추천

완료 기준

  • 사용자가 어느 기기에서 열어도 이어진다고 느껴야 한다.
  • 세션 만료는 보안 문제로는 엄격하되, 사용자 체감으로는 거의 드러나지 않아야 한다.
  • 기기 전환이 불편해서 특정 메신저를 포기하지 않도록 해야 한다.