39 lines
4.3 KiB
Markdown
39 lines
4.3 KiB
Markdown
# 기기 발견
|
|
|
|
기기 목록은 Socket.IO 변경 이벤트로 갱신한다. 계속 목록을 조회하는 검색 루프나 대기 스피너는 사용하지 않는다. 실제 새 기기 이벤트 후 서버 조회를 기다리는 동안에만 카드 형태의 스켈레톤을 표시하며, 정보를 받으면 같은 자리에서 실제 카드로 바뀐다. 조회 실패 시 스켈레톤은 최대 5초 뒤 사라진다. 연결 해제 시 짧게 사라지는 효과를 적용하고, 동작 줄이기 설정을 존중한다.
|
|
|
|
## 같은 네트워크
|
|
|
|
기존의 검증된 공인 IP 그룹 발견을 유지한다. 운영에서는 Cloudflare → NPM → hop. 프록시 경로를 검증하고 활성화해야 한다. 실제 NAS에서 기존 사용자가 같은 네트워크 자동 발견을 확인했다. 방 참여 중에는 해당 방 기기만 표시한다.
|
|
|
|
## 위치로 근처 기기 찾기
|
|
|
|
- 기본 반경 100m. 위치는 내부에서 자동으로 확인하며 별도 검색 버튼·거리 안내 문구를 표시하지 않는다. 양쪽 브라우저가 위치 권한을 허용해야 한다. 첫 요청의 권한 창은 브라우저가 표시한다.
|
|
- HTTPS 필요. 위치 권한 거절·미지원·오차가 너무 큰 경우 기존 QR/네트워크 연결을 유지한다. 거절 후 반복 권한 요청을 하지 않는다. 브라우저에서 권한을 다시 허용하거나 발견 허용을 바꾸면 상태를 반영한다.
|
|
- 위도·경도는 소수점 4자리로 줄여 프로세스 메모리에만 보관한다. DB·브라우저 저장소·다른 기기 응답에는 좌표를 넣지 않는다. 브라우저 위치 권한 상태를 사용하며 별도 동의 플래그를 저장하지 않는다.
|
|
- 화면이 보이고 연결·발견 허용 상태일 때만 2분마다 위치를 갱신한다. 이동 추적 `watchPosition`은 사용하지 않는다.
|
|
- 발견 허용 끄기·권한 해제·탭 숨김·방 참여·접속 종료 시 해당 탭 좌표를 제거한다. 강제 종료 등으로 제거 신호가 누락되어도 150초 후 만료한다.
|
|
- 다른 탭에서 검색 중인 같은 기기는 마지막 유효한 좌표가 사라질 때까지 표시될 수 있다.
|
|
- 위치가 바뀌어 목록에 변화가 있을 때만 관련 기기에 이벤트를 보낸다. 파일 시스템 정리는 1분 간격이며 요청·세션 만료 정리는 별도로 유지한다.
|
|
- 위치 오차 때문에 근처 사용자 누락이나 옆 건물 사용자가 표시될 수 있다. 실제 Bluetooth 거리나 접속 경로를 증명하는 기능은 아니다. 전송에는 기존 수락 절차와 접근 검사 모두 적용한다.
|
|
- 링크 수락으로 새 탭이 열려 위치가 제거되는 경우에는 수락 직전 확인된 요청 ID에 한해 15초짜리 일회성 수락 권한을 사용한다. 좌표를 연장하거나 방·차단·발견 허용 경계를 우회하지 않는다.
|
|
|
|
설정 기본값:
|
|
|
|
```dotenv
|
|
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 문서](https://developer.mozilla.org/en-US/docs/Web/API/NavigatorUAData/getHighEntropyValues)를 참고했다.
|