4.3 KiB
기기 발견
기기 목록은 Socket.IO 변경 이벤트로 갱신한다. 계속 목록을 조회하는 검색 루프나 대기 스피너는 사용하지 않는다. 실제 새 기기 이벤트 후 서버 조회를 기다리는 동안에만 카드 형태의 스켈레톤을 표시하며, 정보를 받으면 같은 자리에서 실제 카드로 바뀐다. 조회 실패 시 스켈레톤은 최대 5초 뒤 사라진다. 연결 해제 시 짧게 사라지는 효과를 적용하고, 동작 줄이기 설정을 존중한다.
같은 네트워크
기존의 검증된 공인 IP 그룹 발견을 유지한다. 운영에서는 Cloudflare → NPM → hop. 프록시 경로를 검증하고 활성화해야 한다. 실제 NAS에서 기존 사용자가 같은 네트워크 자동 발견을 확인했다. 방 참여 중에는 해당 방 기기만 표시한다.
위치로 근처 기기 찾기
- 기본 반경 100m. 위치는 내부에서 자동으로 확인하며 별도 검색 버튼·거리 안내 문구를 표시하지 않는다. 양쪽 브라우저가 위치 권한을 허용해야 한다. 첫 요청의 권한 창은 브라우저가 표시한다.
- HTTPS 필요. 위치 권한 거절·미지원·오차가 너무 큰 경우 기존 QR/네트워크 연결을 유지한다. 거절 후 반복 권한 요청을 하지 않는다. 브라우저에서 권한을 다시 허용하거나 발견 허용을 바꾸면 상태를 반영한다.
- 위도·경도는 소수점 4자리로 줄여 프로세스 메모리에만 보관한다. DB·브라우저 저장소·다른 기기 응답에는 좌표를 넣지 않는다. 브라우저 위치 권한 상태를 사용하며 별도 동의 플래그를 저장하지 않는다.
- 화면이 보이고 연결·발견 허용 상태일 때만 2분마다 위치를 갱신한다. 이동 추적
watchPosition은 사용하지 않는다. - 발견 허용 끄기·권한 해제·탭 숨김·방 참여·접속 종료 시 해당 탭 좌표를 제거한다. 강제 종료 등으로 제거 신호가 누락되어도 150초 후 만료한다.
- 다른 탭에서 검색 중인 같은 기기는 마지막 유효한 좌표가 사라질 때까지 표시될 수 있다.
- 위치가 바뀌어 목록에 변화가 있을 때만 관련 기기에 이벤트를 보낸다. 파일 시스템 정리는 1분 간격이며 요청·세션 만료 정리는 별도로 유지한다.
- 위치 오차 때문에 근처 사용자 누락이나 옆 건물 사용자가 표시될 수 있다. 실제 Bluetooth 거리나 접속 경로를 증명하는 기능은 아니다. 전송에는 기존 수락 절차와 접근 검사 모두 적용한다.
- 링크 수락으로 새 탭이 열려 위치가 제거되는 경우에는 수락 직전 확인된 요청 ID에 한해 15초짜리 일회성 수락 권한을 사용한다. 좌표를 연장하거나 방·차단·발견 허용 경계를 우회하지 않는다.
설정 기본값:
LOCATION_DISCOVERY_ENABLED=true
LOCATION_DISCOVERY_RADIUS_METERS=100
기존 NAS .env에 항목이 없어도 기본값이 적용된다. 새 주소·포트 설정은 필요 없다.
기종 정보와 이름
지원하는 Chromium Android 브라우저에서는 navigator.userAgentData.getHighEntropyValues(['model'])로 모델 정보를 읽는다. 지원하지 않거나 브라우저가 공개하지 않으면 기존 이름·고유 코드를 표시한다. 모델 정보 조회는 최대 1초만 기다리며 실패가 접속을 막지 않는다.
일반 기본 이름(Android 등)은 모델이 있으면 모델로 표시한다. 직접 지정한 이름은 항상 우선하며, 모든 카드에 고유 코드도 함께 표시한다. 같은 모델 여러 대는 코드와 이름 변경으로 구분할 수 있다. 모델·플랫폼 정보는 연결 중 서버 메모리에만 두고 마지막 연결 종료 후 정리한다.
제조사는 브라우저가 제공하는 필드가 아니다. SM-/GT-는 Samsung, Pixel은 Google로 제한적으로 추정한다. 모르는 모델은 추정하지 않는다. 브라우저 브랜드(Chrome 등)를 기기 제조사로 사용하지 않는다. OS에서 지정한 개인 기기 이름, 일련번호, MAC 주소는 읽지 않는다. iPhone의 정확한 기종도 이 방식으로 보장하지 않는다.
모델 힌트의 범위와 공개 제한은 MDN 문서를 참고했다.