[시리즈] 클립보드 공유 시스템

0. 시작

마지막 수정

애플의 기기들 사이에서는 연동을 위한 편리한 기능이 많다. airdrop, 공유 클립보드, handoff 같은 기능이다.
평소에는 참 잘 사용하는데, 한 두번씩 아쉬운 점들이 생긴다. 타사 기기로는 공유가 참 어렵다는 것이 문제다.
airdrop이야 tailscale로 해결하면 되지만... 클립보드는 영 쉽지 않다.
그래서 홈 서버를 거치는 클립보드 공유 시스템을 만들어 보려고 한다.

뭔가 셀프 호스팅 서버를 가지면서, 주요 OS를 모두 지원하는 오픈소스 프로젝트를 찾을 수 없어서 직접 만들어본다.
우선 나만 사용할 것 이라서 간단한 스펙으로 만들어본다.

AI를 사용하면 쉽게 만들 수 있지만, 뭔가 무뎌지는 내 정신을 붙잡기 위해 서버는 손으로 코딩을 진행할 것이다. 클라이언트 앱들은 그냥 우리 코덱스 선생님에게 맡길 것 이다.

예상 구현 방법

  • 기기 그룹
    • 각 클라이언트끼리는 QR 코드 혹은 문자열 코드를 통해 그룹에 속할 수 있음
    • QA 코드의 내용은 문자열 코드를 그대로 QR 코드로 만든 것
    • 연동 진행시 서버에 각자의 공개키를 전달
  • e2e 암호화 구현
    • 서버는 각 클라이언트의 공개키를 저장하고 있음
    • 각 클라이언트는 서버에게 자신의 그룹의 공개키를 조회할 수 있음
    • 클립보드 데이터를 다른 클라이언트에게 브로드캐스팅 할 때 각 클라이언트에 맞는 공개키로 암호화해서 전달
    • MLS은 현재 예상 스펙상 과하기 때문에 제외함
  • SSE 사용
    • 모든 클라이언트는 서버에 SSE로 연결
    • 클립보드에 데이터가 복사되면 별도 엔드포인트로 데이터 전달
    • 데이터는 바이너리 형태로 전달, SSE를 사용하기 위해서는 Base64 인코딩 필요함.
  • 언어 : Go
    • 기존에는 Rust를 사용하다가 근래 비동기 작업에 편한 Go에 관심이 많아져서 사용
    • 꽤 적은 메모리 사용량, 직관적이고 편한 비동기
    • 별도 웹 프레임워크를 사용하지 않고 빌트인 라이브리러인 net/http 만 사용
  • 클라이언트 지원
    • Windows, MacOS, Android, iOS