보안 아키텍처

클라이언트 측 암호화(CSE) 프로토콜과 무신뢰 저장 인프라에 대한 기술 사양입니다.

보안 기본

  • 종단간 암호화는 브라우저에서 이루어집니다. 업로드 전에 로컬에서 암호화되므로 평문은 기기를 떠나지 않습니다.
  • 암호화/복호화 키는 브라우저에서 생성되어 공유 링크에 포함됩니다. PrivateNote.ai는 그 키를 받거나 저장하지 않습니다.
  • 서버는 암호화된 암호문만 저장하며, 복호화에 필요한 키를 갖고 있지 않습니다.

클라이언트 측 암호화

메모는 전송 전에 Web Crypto API로 브라우저 메모리에서 로컬 암호화됩니다. 서버는 그 결과인 암호문만 봅니다.

키 처리

표준 비공개 메모는 원시 256비트 키를 URL 프래그먼트(#...)의 Base64url로 인코딩합니다. 비밀번호로 보호된 메모는 Argon2id로 유도한 키로 콘텐츠 키를 감쌉니다.

공유 링크가 있으면 그 메모에 접근할 수 있습니다. 의도한 수신자에게만 공유하십시오.

암호학

대칭 암호화

  • AES-256-GCM

    128비트 인증 태그와 메모 ID, 만료, 열람 한도를 묶는 추가 인증 데이터(AAD)를 쓰는 인증 암호화입니다. 256비트 키는 그로버 방식의 양자 키 탐색에도 실질적인 장벽으로 남습니다.

  • 12바이트 암호학 IV

    고유한 초기화 벡터는 여러 메모에서 패턴이 드러나는 것을 막습니다.

키 유도(KDF)

  • Argon2id(v2 프로필)

    비밀번호로 보호된 메모는 무차별 대입 비용, 특히 GPU/ASIC 공격 비용을 높이기 위해 메모리 부하가 큰 매개변수(time=3, memory=64 MiB, parallelism=1)의 Argon2id를 사용합니다.

  • 16바이트 암호학 솔트

    메모마다 고유한 솔트는 레인보우 테이블 공격을 막습니다.

인프라 및 운영 보안

EU 관할 저장

인증 데이터, 암호화된 메모, 운영 기록은 EU 관할 인프라에 저장됩니다.

원자적 상태 관리

Cloudflare Durable Objects는 한 번 읽기 로직에 원자적 일관성을 제공하여 경쟁 상태와 이중 소비를 막습니다.

추적 쿠키 없음

상태 비저장 API입니다. 광고나 추적 픽셀은 로드되지 않습니다.

Turnstile 확인

사람만 통과할 수 있는 요청 확인으로 무차별 메모 열거를 방지합니다.

공급망 및 무결성

암호화가 브라우저에서 실행되므로 로드하는 앱 번들은 신뢰 모델의 일부입니다. 정적 호스팅, 고정된 CI 빌드, 브라우저 보호 장치에 의존합니다. 침해된 클라이언트에 대한 보장은 아니지만, 실행될 수 있는 것을 의도적으로 제한합니다.

배포 및 브라우저 보호 장치
  • CI의 콘텐츠 해시 빌드 자산으로 하는 정적 Cloudflare Pages 배포
  • HTTP Content Security Policy와 보안 헤더. 허용 목록은 기능에 필요한 경우만 해당합니다(Turnstile, 기기 내 AI CDN, WASM)
  • package-lock.json으로 재현 가능한 설치(배포 파이프라인의 npm ci)
  • Cloudflare 엣지의 HSTS(preload)가 적용된 HTTPS
  • 광고나 분석 스크립트는 없습니다. 제3자 JS는 주로 Turnstile과, 해당 기능을 사용할 때의 선택적 AI CDN 로드입니다

AI 데이터 처리

메모 초안을 작성할 때 AI는 선택 사항입니다. 보안 링크를 만드는 데 AI는 필요하지 않습니다. 사용할 때는 기기 내 Private AI와 선택형 Cloud Assist 중에서 고르십시오. 둘의 개인정보 경계는 다릅니다.

Private AI(기기 내)

개인정보

브라우저에서 실행됩니다(WebLLM). 초안 텍스트는 추론을 위해 PrivateNote.ai나 제3자에게 전송되지 않습니다.

저장한 뒤

텍스트는 로컬에서 처리됩니다. 업로드되는 것은 암호화된 메모뿐이며, AI 프롬프트는 서버로 전송되지 않습니다.

기기 요구 사항

지원되는 경우 WebGPU를 쓸 수 있는 데스크톱에서 Qwen3 0.6B 또는 Gemma 2 2B를 불러옵니다. 모델 가중치를 위해 브라우저 저장 공간 최대 약 1 GB와 실행에 충분한 GPU 메모리가 필요합니다. 휴대폰이나 성능이 낮은 노트북에서는 실행되지 않는 경우가 많습니다. Cloud Assist를 사용하거나 AI 없이 작성하십시오.

처음 설정

처음 사용할 때 공개 CDN(예: Hugging Face 또는 jsDelivr)에서 양자화된 가중치(최대 약 1 GB)를 다운로드할 수 있습니다. 암호화된 메모 업로드와는 별개입니다. 이후 세션에서는 캐시된 가중치를 다시 사용할 수 있습니다.

Cloud Assist(호스팅)

개인정보

Cloudflare Workers AI에서 실행됩니다(Google Gemma 4 26B). 선택해야 합니다. 초안 평문이 기기를 떠납니다. Cloud Assist를 확인할 때까지 아무것도 전송되지 않습니다.

저장한 뒤

업로드되는 것은 암호화된 메모뿐입니다. 초안을 작성하는 동안 프롬프트는 평문으로 PrivateNote.ai Worker를 통과합니다. 저장하지는 않지만, Cloudflare가 처리하기 전에 해당 요청을 위해 엣지에서 처리합니다.

기기 요구 사항

최신 브라우저와 네트워크 연결이면 됩니다. GPU나 큰 로컬 저장 공간은 필요하지 않습니다. 기기에서 Private AI를 실행할 수 없거나 호스팅 초안을 선택할 때 사용합니다.

처음 설정

필요하지 않습니다. 모델 다운로드, 설치 단계, 로컬 캐시는 없습니다. 선택한 뒤 안내가 나오면 초안을 보내십시오.

위협 모델 및 한계

유용한 위협 모델은 무엇을 보호하는지, 누구로부터 보호하는지, 무엇을 가정하는지, 어떤 통제가 적용되는지, 그리고 명시적으로 다루지 않는 범위를 밝힙니다. 이 페이지 앞부분의 보호 조치는 4절에 대응하며, 1–3절과 5절은 경계를 정의합니다.

보호 대상

  • 메모 평문

  • 암호화 키

  • 1회 열람 보장

  • 만료 및 열람 제한

  • 사용자 계정 데이터

  • 인증 자격 증명

가정

  • 암호화하거나 복호화할 때 사용자의 기기와 브라우저를 신뢰할 수 있다고 가정합니다.
  • 브라우저가 Web Crypto를 올바르게 구현한다고 가정합니다.
  • 당사 오리진으로의 TLS가 의도한 대로 작동한다고 가정합니다.
  • 전달된 애플리케이션 코드가 악의적으로 수정되지 않았다고 가정합니다(공급망 및 무결성 참고).
  • 메모 링크는 의도한 수신자에게만 공유된다고 가정합니다.

다루는 범위

  • 서버 또는 데이터베이스 침해(저장 시 암호문만)
  • 저장된 메모에 접근하는 악의적이거나 호기심 많은 관리자
  • 저장소 또는 인프라 제공자의 침해
  • 메모 트래픽의 네트워크 가로채기(TLS와 암호문)
  • 자동화된 메모 열거와 남용(Turnstile, 속도 제한)
  • 비밀번호로 보호된 메모에 대한 무차별 대입(Argon2id)
  • 계정 탈취 시도(HttpOnly 세션, 로그인 시 교체, 속도 제한, 선택적 TOTP, 민감한 작업의 추가 인증)
  • 한 번만 읽는 메모의 재요청 또는 재생(첫 열람 시 원자적 소비)

다루지 않는 범위

  • 발신자 또는 수신자 기기의 악성코드
  • 악성 브라우저 확장 프로그램
  • 침해된 운영 체제
  • 화면 캡처 또는 녹화 소프트웨어
  • 클립보드 모니터링
  • 전체 메모 URL(#fragment 키 포함)을 안전하지 않은 채널로 공유하거나 권한 없는 상대와 공유하는 경우
  • 전달된 JavaScript 애플리케이션의 침해
  • 사용자를 대상으로 한 피싱 공격
  • 사회 공학
  • Cloud Assist 추론을 선택한 경우(초안 평문의 제3자 처리)

기술적 진정성

마케팅 문구보다 명확성과 측정 가능한 보안 보장을 우선합니다.

보안 세션 시작
PrivateNote on LaunchNest