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

30 lines
4.0 KiB
Markdown

# 클립보드 전송
2026-10-13 수정안은 기존 링크 전송을 링크·텍스트 자동 판별 방식으로 확장한다. 파일 전송, 수락 정책, 기기 발견과 보관함을 유지한다.
## 화면과 동작
- 전송 대상 기기를 선택하면 첫 클립보드 읽기를 시도한다. 브라우저가 별도 확인을 요구하는 모바일 환경이나 권한 조회를 지원하지 않는 Safari/Firefox에서는 자동 읽기를 생략하고 빈 입력창을 제공한다. 직접 입력·붙여넣기·‘다시 가져오기’는 그대로 사용할 수 있다.
- 전체 내용이 단일 HTTP/HTTPS URL이면 한 줄 입력창, 나머지는 여러 줄 텍스트 입력창을 표시한다. `www.example.com`과 일반 도메인 주소에는 전송 시 HTTPS를 붙인다. 여러 URL이나 URL을 포함한 문장은 텍스트로 보낸다. URL의 자격 증명과 HTTP/HTTPS 이외의 스킴은 자동 열기 대상으로 취급하지 않는다.
- 텍스트는 줄바꿈·탭·앞뒤 공백을 그대로 보관하고 전달한다. 화면에는 글자 수를 표시하며 최대 크기는 UTF-8 기준 **256KiB**다. 공백만 있는 내용은 보내지 않는다.
- 창 포커스·클립보드 변경으로 입력 중 내용을 바꾸지 않는다. 첫 진입과 ‘다시 가져오기’에서만 읽는다. 빈 클립보드나 읽기 실패는 현재 입력을 유지한다.
- 파일을 선택하면 클립보드 콘텐츠를 대체한다. 한 번에 파일 또는 클립보드만 보내고 전송 버튼도 하나다. 로그인 사용자는 기존 보관함 자료도 가져올 수 있다.
- 링크는 수락 후 자동으로 열고 주소 복사를 보조 동작으로 제공한다. 파일은 기존처럼 다운로드한다.
- 텍스트는 수락 후 중앙 미리보기를 표시한다. 원문은 HTML로 실행하지 않고 스크롤 가능한 영역에 보여준다. 가장 큰 버튼은 ‘클립보드에 복사’이며 복사 완료를 알린다. 읽음은 복사·닫기 동작으로 반영한다.
- 익명 화면에는 과거 전송 내역을 제공하지 않는다. 수락한 탭에서만 도착 동작을 처리하며 새로고침으로 텍스트 미리보기나 링크 열기를 재실행하지 않는다.
- 로그인 중 받은 텍스트는 기존 받은 항목에 자동 저장한다. 직접 저장·수신 기록·보관함 재전송 모두 기존 7일 만료·계정 세션 경계를 적용한다.
브라우저의 시스템 붙여넣기 안내는 웹사이트가 숨기거나 우회할 수 없다. 의도적인 클립보드 버튼 동작에서만 표시되도록 읽기 경로를 제한한다. [WebKit 설명](https://webkit.org/blog/10855/async-clipboard-api/).
## 서버와 데이터
기존 `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를 사용한다.
파일 용량은 기존 파일 저장 한도에 따라 계산한다. 텍스트는 인라인 본문 제한과 기존 요청 빈도 제한을 적용한다. 좌표·클립보드 원문을 로그나 오프라인 캐시에 추가하지 않는다.