# Noterich P2P Sync 튜토리얼: 클라우드 없이 장치 간 동기화 > **장치 간 노트를 안전하게 동기화하세요 — 클라우드 저장소가 필요 없습니다.** 데이터 프라이버시가 더욱 중요해진 이 시대에, Noterich는 장치 간 동기화에 대한 혁신적인 방법을 제공합니다. 우리의 **P2P (피어투피어) 동기화** 기능을 사용하면 클라우드 서버에 의존하지 않고도 장치 간 노트를 원활하게 공유할 수 있습니다. 데이터는 항상 여러분의 것입니다. ## P2P 동기화를 선택하는 이유는? 전통적인 노트 앱은 데이터를 중앙 집중식 서버에 저장합니다. 이는 프라이버시 위험, 구독 비용, 제3자 인프라 의존성과 같은 문제를 초래합니다. Noterich는 다른 길을 선택합니다: ```mermaid graph LR A[Your Device] <-->|Direct Connection| B[Your Other Device] C[Cloud Server] -.->|Not Required| A C -.->|Not Required| 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 동기화의 작동 방식 Noterich는 **WebRTC 기술**과 **PeerJS**를 결합하여 장치 간 직접적인 연결을 설정합니다. 동기화를 시작할 때: ```mermaid sequenceDiagram participant D1 as Device A (송신자) participant S as Signaling Server participant D2 as Device B (수신자) D1->>S: Connection ID 요청 S-->>D1: Room ID 생성 D1->>D2: Connection 링크 공유(QR/URL) D2->>S: Room ID를 사용하여 연결 S-->>D2: Peer 연결 설정 D1->>D2: 암호화 및 노트 전송 D2->>D2: 복호화 및 노트 불러오기 Note over D1,D2: 직접 암호화된 전송<br/>서버에 데이터 저장 없음 ``` ### 배경 기술 Noterich의 P2P 구현은 다음을 활용합니다: 1. **PeerJS 라이브러리**: 브라우저 간 통신의 복잡성을 처리합니다. 2. **AES-GCM 암호화**: 노트 데이터를 위한 군사급 암호화. 3. **PBKDF2 키 생성**: 안전한 비밀번호 기반의 암호화 키 생성. 4. **MessagePack serialization**: 빠른 전송을 위한 효율적인 바이너리 데이터 인코딩. 5. **IndexedDB Storage**: 오프라인 접근을 위한 로컬 최우선 데이터베이스. ## P2P 동기화 시작하기 ### 전제 조건 시작하기 전에 다음을 확인하세요: - ✅ 두 장치 모두 Noterich가 설치되어 있어야 합니다. - ✅ 두 장치 모두 인터넷에 연결되어 있어야 합니다(또는 동일한 로컬 네트워크). - ✅ 현대적인 웹 브라우저(Chrome, Firefox, Edge, Safari)가 필요합니다. ### 단계 1: 소스 장치에서 공유 시작 1. Noterich에서 공유하고자 하는 노트를 열어보세요. 2. 툴바의 **Share** 버튼을 클릭하세요. 3. **"P2P Share"** 옵션을 선택하세요. 4. (선택 사항) 추가 보안을 위해 비밀번호를 설정하세요. - 비밀번호는 최소 8자리여야 합니다. - AES-256-GCM 암호화를 사용합니다. 5. P2P 서버가 초기화될 때까지 기다리세요. ```mermaid graph TD A[노트 열기] --> B[Share 버튼 클릭] 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 반복 - 🔐 각 전송마다 무작위적인 소금과 IV 사용 - 🔐 AES-256-GCM 인증 암호화 - 🔐 비밀번호는 전송 시에만 사용되고, 로컬에서만 저장됨 ### 배치 노트 동기화 여러 노트를 효율적으로 전송: 1. 설정에서 **Database Transfer**를 이용하세요. 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 라이브러리 로드되지 않음" **원인**: 네트워크 차단, PeerJS CDN 또는 신호 서버 문제 **해결 방법:** 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초 기다리세요. | | 🟡 비교 중 | 노트 차이점 분석 중 | 정상적인 과정입니다. | | 🟠 사용자 확인 필요 | 비밀번호 또는 확인 필요 | 모달 알림 확인. | | 🟢 데이터 전송 | 데이터가 데이터베이스에 불러옴 | 탭을 닫지 마세요. | | ✅ 성공 | 동기화 완료 | 노트를 사용할 수 있습니다. | | 🔴 오류 | 연결 또는 전송 실패 | 문제 해결을 확인하세요. | ## 보안 모범 사례 ### 데이터 보호 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마다 제어권을 넘깁니다. // 대규모 데이터 불러오기 중에 메인 스레드가 차단되지 않도록 합니다. } ``` **권장 사항:** - 단일 전송을 최대 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] ``` | 기능 | Noterich P2P | 클라우드 동기화 | |--------|--------------|-----------------| | **데이터 저장** | 장치만 | 제3자 서버 | | **프라이버시 수준** | 최대 | 제공업체에 따라 다름 | | **비용** | 무료 | 종종 구독 기반 | | **설정 복잡도** | 중간 | 간단함 | | **동기화 속도** | 매우 빠름(직접) | 중간(서버를 통함) | | **오프라인 접근** | 완전함 | 제한적 | | **제조사 종속성** | 없음 | 높음 | | **데이터 이동성** | 완전함 | 제한적 | ## 실제 사용 사례 ### 📚 개인 지식 기반 다음을 통해 개인 지식 관리 시스템을 동기화하세요: - 집에서 깊은 작업을 위해 - 카페에서 노트북을 사용하여 - 태블릿으로 읽고 주석을 달기 위해 - 휴대폰으로 간단한 기록을 남기기 위해 ### 👥 팀 협업 팀 내에서 연구 노트를 안전하게 공유하세요: - IT 인프라가 필요하지 않음 - 엔드투엔드 암호화된 전송 - 전송 로그를 통한 감사 추적 - 개인 정보 보호 규정 준수 ### 🎓 학술 연구 논문 및 문헌 리뷰 작업에서 협업하세요: - 주석이 달린 PDF와 노트를 공유 - 로컬에서 버전 기록 유지 - 대학/개인 장치에서 작업 - 미출판 연구를 보호 ### 🏢 기업 배포 프라이버시를 중시하는 기업에서 Noterich를 배포하세요: - 데이터가 회사 네트워크를 벗어나지 않음 - 방화벽을 통과하여 설정 가능 - 기존 보안 정책과 통합 - 클라우드 서비스 의존성 감소 ## 기술적 심화 분석 (개발자를 위한) ### 아키텍처 개요 ```mermaid graph TB subgraph Sender["송신자 장치"] A1[노트 데이터] --> A2[MessagePack Serialize] A2 --> A3{암호화됨?} A3 -->|예| A4[AES-256-GCM 암호화] A3 -->|아니오| A5[원본 바이너리] A4 --> A6[512KB 단위로 분할] A5 --> A6 A6 --> A7[WebRTC 데이터 채널] end subgraph Receiver["수신자 장치"] B1[WebRTC 데이터 채널] --> B2[분할된 데이터 재조합] B2 --> B3{암호화됨?} B3 -->|예| B4[AES-256-GCM 복호화] B3 -->|아니오| B5[원본 바이너리] B4 --> B6[MessagePack deserialize] B5 --> B6 B6 --> B7[IndexedDB 저장] B7 --> B8[검색 인덱스 재구성] end A7 -.->|직접 P2P| B1 style A4 fill:#FF5722,color:#fff style B4 fill:#FF5722,color:#fff style A7 fill:#4CAF50,color:#fff style B1 fill:#4CAF50,color:#fff ```