# Noterich P2P Sync 튜토리얼: 클라우드 없이 여러 기기 간 동기화 > **여러 기기 간 노트를 안전하게 동기화하세요 – 클라우드 저장소가 필요하지 않습니다.** 데이터 개인정보 보호가 매우 중요한 이 시대에, Noterich는 여러 기기 간 동기화를 위한 혁신적인 방법을 제공합니다. 우리의 **P2P (Peer-to-Peer) Sync** 기능을 사용하면 클라우드 서버에 의존하지 않고도 기기 간 노트를 안전하게 공유할 수 있습니다. 귀하의 데이터는 항상 귀하의 것입니다. ## P2P Sync를 선택하는 이유는? 전통적인 노트 앱들은 데이터를 중앙 서버에 저장합니다. 이로 인해 개인정보 보호 위험, 구독 비용, 제3자 인프라에 대한 의존성이 발생합니다. Noterich는 다른 길을 선택합니다: ```mermaid graph LR A[귀하의 기기] <-->|직접 연결| B[귀하의 다른 기기] C[클라우드 서버] -.->|필요하지 않음| A C -.->|필요하지 않음| B style A fill:#4CAF50,color:#fff style B fill:#4CAF50,color:#fff style C fill:#9E9E9E,color:#fff,stroke-dasharray: 5 5 ``` ### 주요 장점 - **🔒 개인정보 보호 최우선**: 귀하의 노트는 제3자 서버와 접촉하지 않습니다. - **⚡ 빠르고 직접적**: 기기들이 직접 통신하여 동기화가 더 빠릅니다. - **💰 구독 없음**: 프리미엄 계층 없이 무료 P2P 동기화 가능합니다. - **🌐 어디서나 작동**: 로컬 네트워크 또는 인터넷을 통해 동기화할 수 있습니다. - **📱 플랫폼 간 작동**: 데스크톱, 노트북, 태블릿, 모바일 간에 작동합니다. ## P2P Sync 작동 방식 Noterich는 **WebRTC 기술**과 **PeerJS**를 사용하여 기기 간 직접 연결을 설정합니다. 동기화를 시작할 때: ```mermaid sequenceDiagram participant D1 as Device A (송신자) participant S as Signaling Server participant D2 as Device B (수신자) D1->>S: 연결 요청 S-->>D1: 방 주소 생성 D1->>D2: 연결 링크 공유(QR/URL) D2->>S: 방 주소를 사용하여 연결 S-->>D2: 피어 연결 설정 D1->>D2: 암호화 및 노트 전송 D2->>D2: 암호 해독 및 노트 가져오기 Note over D1,D2: 직접 암호화된 전송<br/>서버에 데이터 저장 없음 ``` ### 배경 기술 Noterich의 P2P 구현은 다음을 활용합니다: 1. **PeerJS 라이브러리**: 브라우저 간 통신을 위한 WebRTC 복잡성을 처리합니다. 2. **AES-GCM 암호화**: 노트 데이터를 위한 군용급 암호화입니다. 3. **PBKDF2 키 생성**: 안전한 비밀번호 기반의 암호화 키 생성입니다. 4. **MessagePack 시리얼라이제이션**: 빠른 전송을 위한 효율적인 이진 데이터 인코딩입니다. 5. **IndexedDB 저장소**: 오프라인 접근을 위한 로컬 최우선 데이터베이스입니다. ## P2P Sync 시작하기 ### 전제 조건 시작하기 전에 다음을 확인하세요: - ✅ 두 기기 모두 Noterich가 설치되어 있어야 합니다. - ✅ 두 기기 모두 인터넷에 연결되어 있어야 합니다(또는 같은 로컬 네트워크에). - ✅ 현대적인 웹 브라우저(Chrome, Firefox, Edge, Safari)가 필요합니다. ### 단계 1: 원본 기기에서 공유 시작 1. Noterich에서 공유하고자 하는 노트를 열어보세요. 2. 도구 모음에서 **공유** 버튼을 클릭하세요. 3. **"P2P Share"** 옵션을 선택하세요. 4. (선택 사항) 추가 보안을 위해 비밀번호를 설정하세요. - 비밀번호는 최소 8자리여야 합니다. - AES-256-GCM 암호화를 사용합니다. 5. P2P 서버가 초기화될 때까지 기다리세요. ```mermaid graph TD A[노트 열기] --> B[공유 버튼 클릭] B --> C[P2P Share 선택] C --> D{비밀번호 설정?} D -->|예| E[비밀번호 입력 ≥8자리] D -->|아니오| F[암호화 생략] E --> G[P2P 서버 초기화] F --> G G --> H[공유 링크 및 QR 코드 생성] ``` ### 단계 2: 연결 링크 공유 P2P 서버가 시작되면, Noterich는 다음을 생성합니다: - **공유 가능한 고유한 링크**와 연결 매개변수가 포함된 - **QR 코드**로 모바일 기기에서 빠르게 스캔할 수 있습니다. 링크 형식은 다음과 같습니다: ``` https://noterich.com/#dbshare=<infoHash>&server=<signaling-server> ``` **공유 방법:** | 방법 | 최적의 경우 | 어떻게 할 것인가 | |--------|----------|--------| | 🔗 링크 복사 | 이메일, 메시지 앱 | "링크 복사" 버튼을 클릭 | | 📱 QR 코드 | 모바일 기기 | 기기 카메라로 스캔 | | 📧 이메일 | 원격 협력자 | 링크를 이메일에 붙여넣기 | ### 단계 3: 목적 기기에서 수신 수신 기기에서: 1. **공유 링크 열기** - 직접 링크를 클릭하거나, - 모바일 기기로 QR 코드를 스캔 2. **수신된 노트 검토** - 노트 제목과 메타데이터를 미리 보기 - 발신자 정보를 확인 3. **비밀번호 입력** (암호화된 경우) - 발신자가 제공한 비밀번호를 입력 - 데이터가 기기에서 로컬로 해독됨 4. **목적 워크스페이스 선택** - 기존 워크스페이스를 선택하거나, - 가져온 노트를 위한 새로운 워크스페이스 생성 5. **인입 확인** - 노트가 해독되어 IndexedDB에 저장됨 - 검색 인덱스가 자동으로 재구성됨 ```mermaid graph LR A[링크 열기] --> B[송신자와 연결] B --> C{암호화됨?} C -->|예| D[비밀번호 입력] C -->|아니오| E[메타데이터 수신] D --> E E --> F[노트 미리보기] F --> G[워크스페이스 선택] G --> H[인입 및 인덱스 생성] H --> I[동기화 완료!] style I fill:#4CAF50,color:#fff ``` ## 고급 기능 ### 암호화된 전송 민감한 노트에 대해, Noterich는 선택적 엔드투엔드 암호화를 제공합니다: **암호화 과정:** ```javascript // 비밀번호 → 암호화 키(PBKDF2) password + salt → deriveKey() → AES-256-GCM 키 // 노트 데이터 → 암호화된 버퍼 noteData + key + iv → encrypt() → encryptedBuffer // 전송 패키지 { encryptedBuffer: ArrayBuffer, salt: Uint8Array, // 키 생성용 iv: Uint8Array // 초기화 벡터 } ``` **보안 기능:** - 🔐 100,000 PBKDF2 반복을 통한 키 생성 - 🔐 각 전송마다 랜덤한 salt과 IV 사용 - 🔐 AES-256-GCM 인증된 암호화 - 🔐 비밀번호는 전송 시에만 사용되고, 로컬에서만 저장됨 ### 일괄 노트 동기화 여러 노트를 효율적으로 전송: 1. 설정에서 **데이터베이스 전송**을 사용하세요. 2. **"P2P Sync"** 모드를 선택하세요. 3. 동기화할 노트를 선택하세요. 4. 수신자는 선택 옵션과 함께 일괄 미리보기를 받습니다. **성능 최적화:** - 노트를 512KB씩 단위로 전송 - 비블로킹 비동기 처리로 UI가 멈추지 않음 - 바이트 단위의 정확한 진행 상황 추적 - 데이터 손상 없이 언제든지 취소 가능 ### 충돌 해결 두 기기 모두에 존재하는 노트를 동기화할 때: ```mermaid graph TD A[충돌 감지] --> B{타임스탬프 비교} B -->|로컬이 더 최신| C[로컬 버전 유지] B -->|원격이 더 최신| D[충돌 알림 표시] D --> E[버전 선택] E --> F[로컬] E --> G[원격] E --> H[수동으로 병합] B -->|둘 다 삭제됨| I[생략] style C fill:#2196F3,color:#fff style F fill:#2196F3,color:#fff style G fill:#4CAF50,color:#fff ``` **충돌 유형 처리:** - `local-newer`: 귀하의 버전이 더 최신 - `remote-newer`: 들어오는 버전이 더 최신 - `local-deleted`: 이 노트를 로컬에서 삭제함 - `remote-deleted`: 발신자의 기기에서 노트가 삭제됨 - `remote-restored`: 이전에 삭제된 노트가 복원됨 ## 문제 해결 ### 일반적인 문제 및 해결 방법 #### ❌ "PeerJS 라이브러리 로드되지 않음" **원인**: 네트워크 차단 또는 Signaling 서버 문제 **해결 방법:** 1. 인터넷 연결을 확인하세요. 2. 방화벽이 WebRTC 연결을 허용하는지 확인하세요. 3. 다른 네트워크를 시도해보세요(모바일 핫스팟). 4. 브라우저가 WebRTC를 지원하는지 확인하세요. #### ❌ "연결 시간 초과" **원인**: NAT/방화벽이 직접 연결을 방해함 **해결 방법:** 1. 두 기기가 같은 네트워크에 연결되어 있는지 확인하세요. 2. VPN을 일시적으로 비활성화하세요. 3. 라우터의 WebRTC 설정을 확인하세요. 4. 모바일 연결을 위해 QR 코드를 사용하세요. #### ❌ "암호화 실패" **원인**: 잘못된 비밀번호 또는 손상된 전송 **해결 방법:** 1. 비밀번호가 정확한지 확인하세요(대소문자 구분). 2. 발신자로부터 새로운 공유 링크를 요청하세요. 3. 전송 중에 안정적인 연결이 있는지 확인하세요. 4. 더 작은 크기의 배치로 시도하세요. #### ❌ "동기화 중" 오류 **원인**: 동시에 여러 동기화 시도 **해결 방법:** 1. 현재 동기화가 완료될 때까지 기다리세요. 2. 다른 Noterich 탭/윈도우를 닫으세요. 3. 페이지를 새로 고치고 다시 시도하세요. 4. 지속적으로 문제가 있다면 브라우저 캐시를 지우세요. ### 연결 상태 표시기 | 상태 | 의미 | 조치 | |--------|---------|--------| | 🔵 연결 중 | 피어 연결 설정 중 | 5-10초 기다리세요 | | 🟡 비교 중 | 노트 차이 분석 중 | 정상적인 과정 | | 🟠 사용자 확인 필요 | 비밀번호 또는 확인 필요 | 모달 알림 확인 | | 🟢 전송 시작 | 데이터를 데이터베이스로 가져오기 | 탭을 닫지 마세요 | | ✅ 성공 | 동기화 완료 | 노트를 사용할 준비가 되었습니다 | ## 보안 best practices ### 데이터 보호 P2P 동기화는 본질적으로 안전하지만, 다음 지침을 따르세요: 1. **강력한 비밀번호 사용** - 최소 8자리 (12자 이상 권장) - 대문자, 소문자, 숫자, 기호를 혼합 - 다른 서비스에서 사용한 비밀번호를 재사용하지 마세요. 2. **수신자를 확인하세요.** - 신뢰할 수 있는 기기와만 링크를 공유하세요. - 물리적으로 가까운 경우 QR 코드를 사용하세요. - 공개 채널에 링크를 게시하지 마세요. 3. **활성 연결 모니터링** - 동기화 중 연결된 피어를 확인하세요. - 성공적으로 전송된 후 연결을 끊으세요. - 공유된 링크가 위험해지면 삭제하세요. 4. **정기적인 백업** - 중요한 노트를 정기적으로 내보내세요. - 백업을 안전한 위치에 저장하세요. - 정기적으로 복구 절차를 테스트하세요. ### 암호화 제한 이해 **암호화된 내용:** - ✅ 노트 내용(텍스트, 형식, 메타데이터) - ✅ 첨부파일 및 내장 미디어 - ✅ 전송 중의 데이터베이스 구조 **암호화되지 않은 내용:** - ⚠️ 연결 메타데이터(타임스탬프, 데이터 크기) - ⚠️ IP 주소(서신 서버에 노출됨) - ⚠️ 기기 식별자(연결 라우팅용) ## 성능 팁 ### 동기화 속도 최적화 1. **네트워크 조건** - 같은 로컬 네트워크에서 동기화: 가장 빠른 전송 - 5GHz WiFi는 2.4GHz보다 선호됨 - 데스크톱 기기에는 유선 이더넷 사용 2. **배치 크기** - 대량 전송: 더 작은 배치로 나누세요. - 진행 상황 표시기를 확인하세요. - 지연되면 취소하고 다시 시도하세요. 3. **브라우저 성능** - 동기화 중 Noterich 탭을 활성화 유지하세요. - 불필요한 브라우저 탭을 닫으세요. - 최신 브라우저 버전으로 업데이트하세요. 4. **기기 리소스** - 충분한 저장 공간이 있는지 확인하세요. - 메모리 집약적인 애플리케이션을 닫으세요. - 동기화가 느리면 브라우저를 재시작하세요. ### 메모리 관리 Noterich는 브라우저가 멈추지 않도록 스마트한 배치 처리를 구현합니다: ```javascript // setTimeout을 사용한 비동기 처리 async function asyncBatchProcessor(items, processor, batchSize = 10) { // 10개씩 처리 // 10ms마다 제어권을 넘깁니다. UI가 반응적으로 유지되도록 // 대규모 가져오기 중에 메인 스레드가 차단되지 않도록 } ``` **권장 사항:** - 단일 전송을 최대 100개의 노트로 제한하세요. - 큰 배치 동기화 후 30초 기다리세요. - 브라우저 캐시를 정기적으로 지우세요. ## FAQ ### Q: 두 개 이상의 기기로 동기화할 수 있나요? **A:** 네! 각 기기 쌍에 대해 별도의 P2P 세션을 시작하세요. 다중 기기 워크플로우의 경우: 1. 기기 A → 기기 B 동기화 2. 그 다음 기기 B → 기기 C 동기화 3. 또는 기기 A를 모든 기기의 중앙 허브로 사용하세요. ### Q: P2P 동기화는 오프라인에서도 작동하나요? **A:** P2P는 서신 서버 연결을 위해 초기 인터넷 연결이 필요합니다. 연결이 설정된 후: - ✅ 로컬 네트워크 전송은 인터넷 없이 작동합니다. - ✅ 데이터는 기기 간 직접 전송됩니다. - ❌ 초기 연결은 서신 서버 접속이 필요합니다. ### Q: 동기화가 중단되면 어떻게 되나요? **A:** Noterich는 중단 상황을 잘 처리합니다: - 부분적으로 전송된 노트는 삭제됩니다. - 손상된 데이터는 데이터베이스에 들어오지 않습니다. - 동기화 프로세스를 다시 시작하면 됩니다. - 이미 동기화된 노트는 영향을 받지 않습니다. ### Q: 다른 Noterich 인스턴스와 동기화할 수 있나요? **A:** 물론! P2P 동기화는 모든 Noterich 사용자 간에 작동합니다: - 협력자와 개별 노트를 공유할 수 있습니다. - 계정 연동이 필요하지 않습니다. - 각 전송은 독립적이고 안전합니다. - 한 번 사용하는 노트 공유에 적합합니다. ### Q: 파일 크기 제한이 있나요? **A:** 실제 제한은 다음에 달려 있습니다: - 브라우저 메모리 가용성 - 네트워크 안정성 - 권장 최대치: 세션당 50MB - 더 큰 전송은 여러 배치로 나누세요. ### Q: 공유 링크는 얼마 동안 유효하나요? **A:** 공유 링크는 세션 기반입니다: - 발신자의 Noterich 탭이 열려 있는 동안 유효합니다. - 발신자가 탭/브라우저를 닫으면 만료됩니다. - 보안을 위해 한 번 사용하는 것이 좋습니다. - 각 전송 세션마다 새로운 링크를 생성합니다. ## 비교: P2P vs 클라우드 동기화 ```mermaid quadrantChart title "동기화 방법 비교" x-axis "낮은 개인정보 보호" --> "높은 개인정보 보호" y-axis "낮은 제어" --> "높은 제어" quadrant-1 "Noterich P2P" quadrant-2 "피해야 함" quadrant-3 "전통적인 클라우드" quadrant-4 "중앙 집중식 서비스" "Noterich P2P": [0.9, 0.9] "전통적인 클라우드": [0.3, 0.4] "중앙 집중식 서비스": [0.4, 0.3] ```