Files
hop.noname.company/docs/CLIPBOARD_TRANSFER.md

4.0 KiB

클립보드 전송

2026-10-13 수정안은 기존 링크 전송을 링크·텍스트 자동 판별 방식으로 확장한다. 파일 전송, 수락 정책, 기기 발견과 보관함을 유지한다.

화면과 동작

  • 전송 대상 기기를 선택하면 첫 클립보드 읽기를 시도한다. 브라우저가 별도 확인을 요구하는 모바일 환경이나 권한 조회를 지원하지 않는 Safari/Firefox에서는 자동 읽기를 생략하고 빈 입력창을 제공한다. 직접 입력·붙여넣기·‘다시 가져오기’는 그대로 사용할 수 있다.
  • 전체 내용이 단일 HTTP/HTTPS URL이면 한 줄 입력창, 나머지는 여러 줄 텍스트 입력창을 표시한다. www.example.com과 일반 도메인 주소에는 전송 시 HTTPS를 붙인다. 여러 URL이나 URL을 포함한 문장은 텍스트로 보낸다. URL의 자격 증명과 HTTP/HTTPS 이외의 스킴은 자동 열기 대상으로 취급하지 않는다.
  • 텍스트는 줄바꿈·탭·앞뒤 공백을 그대로 보관하고 전달한다. 화면에는 글자 수를 표시하며 최대 크기는 UTF-8 기준 256KiB다. 공백만 있는 내용은 보내지 않는다.
  • 창 포커스·클립보드 변경으로 입력 중 내용을 바꾸지 않는다. 첫 진입과 ‘다시 가져오기’에서만 읽는다. 빈 클립보드나 읽기 실패는 현재 입력을 유지한다.
  • 파일을 선택하면 클립보드 콘텐츠를 대체한다. 한 번에 파일 또는 클립보드만 보내고 전송 버튼도 하나다. 로그인 사용자는 기존 보관함 자료도 가져올 수 있다.
  • 링크는 수락 후 자동으로 열고 주소 복사를 보조 동작으로 제공한다. 파일은 기존처럼 다운로드한다.
  • 텍스트는 수락 후 중앙 미리보기를 표시한다. 원문은 HTML로 실행하지 않고 스크롤 가능한 영역에 보여준다. 가장 큰 버튼은 ‘클립보드에 복사’이며 복사 완료를 알린다. 읽음은 복사·닫기 동작으로 반영한다.
  • 익명 화면에는 과거 전송 내역을 제공하지 않는다. 수락한 탭에서만 도착 동작을 처리하며 새로고침으로 텍스트 미리보기나 링크 열기를 재실행하지 않는다.
  • 로그인 중 받은 텍스트는 기존 받은 항목에 자동 저장한다. 직접 저장·수신 기록·보관함 재전송 모두 기존 7일 만료·계정 세션 경계를 적용한다.

브라우저의 시스템 붙여넣기 안내는 웹사이트가 숨기거나 우회할 수 없다. 의도적인 클립보드 버튼 동작에서만 표시되도록 읽기 경로를 제한한다. WebKit 설명.

서버와 데이터

기존 transfer_requests.kind와 items.kind에 text가 있고 items.text 컬럼도 있으므로 DB 구조 변경이나 별도 파일 생성은 필요 없다. 코드·이미지만 재빌드해 배포한다.

  • POST /api/transfer-requests: { targetDeviceId, kind: "text", byteSize, count: 1 }로 본문 없이 요청한다. 크기는 실제 UTF-8 바이트 수다.
  • 기존 수락 이후 POST /api/transfers/:id/complete: { text: "원문" }으로 확정한다. 본문 종류, 승인 크기, 발신자, 수락·만료·차단·CSRF·Origin·멱등성을 검증한다.
  • 기존 { urls: [...] } API와 여러 URL 항목도 유지한다. 새 클립보드 UI에서는 여러 URL을 한 텍스트로 취급한다.
  • POST /api/vault: { kind: "text", text, note? }로 직접 저장한다. 보관함 검색·복사·기기 전송도 지원한다. 외부 이메일 전송은 다시 열지 않는다.
  • MAX_TEXT_PAYLOAD_SIZE_KB=256을 기본값으로 적용한다. 최대 설정값은 1024KiB이며 프런트엔드도 서버가 제공한 한도로 검사한다. 기존 .env에 값이 없으면 256KiB를 사용한다.

파일 용량은 기존 파일 저장 한도에 따라 계산한다. 텍스트는 인라인 본문 제한과 기존 요청 빈도 제한을 적용한다. 좌표·클립보드 원문을 로그나 오프라인 캐시에 추가하지 않는다.