kotalk/문서/116-public-security-profile-plan.md
ian b54eca25f8
Some checks are pending
ci / server (push) Waiting to run
ci / web (push) Waiting to run
ci / desktop-windows (push) Waiting to run
공개: alpha.11 검색과 전환 개선 반영
2026-04-16 15:37:41 +09:00

10 KiB

공개 보안 문서 프로파일 기획

이 문서는 공개 레포에 도입할 보안 관련 문서군의 설계안이다.

핵심 원칙은 명확하다.

  • 보안 문서는 슬로건이 아니라 이미 코드에 들어간 통제를 설명해야 한다.
  • 지금 되는 것, 제한된 것, 향후 계획을 같은 문단에 섞지 않는다.
  • “안전하다”보다 “무엇을 했고, 무엇을 아직 하지 않았는가”를 분명히 적는다.

현재 코드 기준 보안 주장선

공개 문서는 아래 수준까지만 주장한다.

영역 현재 코드에서 말할 수 있는 것 아직 말하면 안 되는 것 근거 파일
자체 구축 / 내부망 자체 호스팅과 내부망 전용 배포가 가능하도록 설계된 구조 기관망 즉시 적합, 공공기관 수준 검증 완료 deploy/compose.mvp.yml, deploy/Caddyfile
세션 / 토큰 짧은 수명 access token, 회전형 refresh token, 서버의 세션 재검증 device binding 완성, zero trust 완비 src/PhysOn.Infrastructure/ServiceCollectionExtensions.cs, src/PhysOn.Infrastructure/Auth/JwtTokenService.cs, src/PhysOn.Api/Endpoints/MessengerEndpoints.cs
참여 키 흐름 알파 단계의 제한된 참여 키 기반 온보딩 정식 신원 검증, abuse 방어 완비 src/PhysOn.Application/Services/MessengerApplicationService.cs, src/PhysOn.Infrastructure/Persistence/DatabaseInitializer.cs
릴리즈 무결성 공식 다운로드 경로와 SHA-256 체크섬 제공 공급망 보안 완결, signed build 완비 scripts/release/release-prepare-assets.sh, scripts/release/release-upload-assets.sh
전송 계층 TLS 기반 공식 운영 경로, 기본 보안 헤더, wss 문맥 보정 모든 고급 네트워크 공격 방어 deploy/Caddyfile, src/PhysOn.Mobile.Android/AndroidManifest.xml, src/PhysOn.Web/src/lib/realtime.ts
비밀값 처리 env 기반 비밀값 주입, 운영 기본 키 차단, Windows DPAPI 보호 중앙 secret manager 완비, 키 회전 체계 완비 deploy/.env.example, src/PhysOn.Infrastructure/ServiceCollectionExtensions.cs, src/PhysOn.Desktop/Services/SessionStore.cs
클라이언트 신뢰 경계 웹/데스크톱/Android가 서로 다른 저장 경계를 가진다 모든 클라이언트가 동일한 보안 수준 src/PhysOn.Web/src/lib/storage.ts, src/PhysOn.Desktop/Services/SessionStore.cs, src/PhysOn.Mobile.Android/MainActivity.cs

공개 보안 문서군의 기본 구조

프로파일 공개 문서 후보 주 독자 핵심 목적
보안 개요 SECURITY_OVERVIEW.md 모든 공개 독자 현재 보안 자세와 허용 가능한 주장선 설명
운영 프로파일 SECURITY_PROFILES.md 인프라 담당자, 기관/사내 검토자 공개 배포 / 자체 구축 / 내부망 / 로컬 개발을 구분
세션/인증 모델 AUTH_AND_SESSION_MODEL.md 백엔드, QA, 기술 검토자 참여 키, 토큰, 세션, realtime ticket 흐름 설명
전송/릴리즈 신뢰 TRANSPORT_AND_RELEASE_TRUST.md 다운로드 사용자, 운영자 TLS, 헤더, 공식 다운로드, 체크섬 설명
클라이언트 신뢰 경계 CLIENT_TRUST_BOUNDARY.md 사용자, 평론가, 보안 검토자 웹/데스크톱/Android의 보호 경계 차이를 설명
적용된 통제 APPLIED_SECURITY_CONTROLS.md 일반 사용자, 기술 검토자 현재 코드에 실제로 들어간 보안 통제를 설명
위협 모델 SECURITY_THREAT_MODEL.md 보안 담당자, 기술 도입 검토자 자산, 공격면, 완화 조치를 구조적으로 설명
운영 보안 SECURITY_OPERATING_PRACTICE.md 운영자, 기관/사내 검토자 키, 토큰, 배포, 로그, 사고 대응 원칙 설명
자체 구축/내부망 SELF_HOSTING_AND_INTERNAL_NETWORK_PROFILE.md 인프라 담당자, 기관 검토자 SaaS 외 운영 가능성과 현재 한계 설명
프라이버시/데이터 PRIVACY_AND_DATA_HANDLING_PROFILE.md 일반 사용자, 평론가 무엇이 서버에 있고, 무엇이 로컬에 있는지 설명
릴리즈 무결성 RELEASE_INTEGRITY_AND_TRANSPARENCY.md 다운로드 사용자, 오픈소스 기여자 태그, 자산, 체크섬, 미러 구조 설명
한계 문서 SECURITY_LIMITS_AND_OPEN_GAPS.md 모든 공개 독자 아직 아닌 것과 향후 과제를 정직하게 분리

프로파일별 설계

0. 보안 개요

핵심 메시지:

  • KoTalk의 공개 보안 문서는 무엇을 이미 구현했는지, 무엇을 아직 주장하지 않는지, 어디까지가 운영자 책임인지를 먼저 보여 줘야 한다.

소스 근거:

  • src/PhysOn.Api
  • src/PhysOn.Infrastructure
  • deploy/
  • scripts/release/

반드시 포함할 축:

  • Scope And Security Posture
  • What KoTalk Implements Today
  • What Is Explicitly Not Claimed Yet
  • Current Security Boundaries
  • Reporting A Vulnerability

1. 적용된 통제

핵심 메시지:

  • KoTalk는 알파 기준에서도 JWT 서명 검증, 세션 활성 검증, 인증/실시간 rate limit, 민감 응답 no-store, 로컬 세션 보호 같은 통제를 코드에 갖고 있다.

소스 근거:

  • src/PhysOn.Infrastructure/ServiceCollectionExtensions.cs
  • src/PhysOn.Api/Program.cs
  • src/PhysOn.Api/Endpoints/MessengerEndpoints.cs
  • src/PhysOn.Desktop/Services/SessionStore.cs
  • tests/PhysOn.Api.IntegrationTests/VerticalSliceTests.cs

공개 문장에서 금지할 표현:

  • 군사급 보안
  • 정보유출 불가능
  • 기관 등급 충족
  • 완전한 종단간 암호화

2. 위협 모델

핵심 메시지:

  • 자산은 세션, 토큰, 메시지, invite, 릴리즈 산출물, 운영 비밀값으로 나뉘고, 각 자산의 공격면과 완화 조치가 다르다.

다뤄야 할 공격면:

  • invite 남용
  • refresh token 탈취
  • WebSocket misuse
  • 다운로드 미러 위조
  • 운영 환경의 비밀값 누출
  • 클라이언트 로컬 세션 탈취

공개 문장에서 금지할 표현:

  • 완전한 위협 차단
  • 모든 공격 시나리오 대응 완료

3. 운영 보안

핵심 메시지:

  • KoTalk는 운영 환경에서 환경변수 기반 비밀값, 키 교체 가능성, 세션/토큰 분리, 릴리즈 체크섬 같은 운영 원칙을 요구한다.

다뤄야 할 항목:

  • JWT issuer/audience/signing key
  • bootstrap invite seed
  • 비밀값을 공개 문서에 두지 않는 기준
  • 취약점 제보와 사고 대응 흐름
  • 로그에 메시지 본문을 기본값으로 남기지 않는 원칙

소스 근거:

  • deploy/compose.mvp.yml
  • deploy/.env.example
  • src/PhysOn.Api/appsettings.json
  • src/PhysOn.Api/appsettings.Development.json

4. 자체 구축 / 내부망

핵심 메시지:

  • 현재 KoTalk는 단일 API + reverse proxy + 환경변수 + 파일 기반 DB 구조로 작동하는 작은 배포 단위를 갖고 있어 내부망 PoC나 자체 운영 검토에 유리하다.

반드시 같이 적을 제한:

  • 현재는 SQLite 단일 노드 MVP
  • 기관망/폐쇄망 검증 완료 상태는 아님
  • 대규모 HA/DR, 다중 리전 같은 운영 수준은 아직 문서화 단계가 아님

소스 근거:

  • deploy/compose.mvp.yml
  • src/PhysOn.Api/Program.cs
  • src/PhysOn.Infrastructure/Persistence/VsMessengerDbContext.cs

5. 프라이버시 / 데이터 처리

핵심 메시지:

  • 지금 단계의 KoTalk는 무엇을 수집하고 어디에 저장하는지 설명 가능한 작은 표면을 갖고 있다.

반드시 포함할 문장:

  • 현재는 E2EE가 아니다.
  • 서버 저장 구조가 존재한다.
  • 운영자가 책임지는 영역이 있다.
  • Windows 로컬 세션 저장과 웹 세션 저장의 경계가 다르다.

소스 근거:

  • src/PhysOn.Application/Services/MessengerApplicationService.cs
  • src/PhysOn.Desktop/Services/SessionStore.cs
  • src/PhysOn.Web/src/lib/storage.ts
  • src/PhysOn.Mobile.Android/MainActivity.cs

금지할 표현:

  • 추적하지 않는다 단정
  • 메타데이터를 남기지 않는다
  • 프라이버시 완전 보호

6. 릴리즈 무결성과 운영 투명성

핵심 메시지:

  • 릴리즈는 버전, 자산, 체크섬, 다운로드 미러, 릴리즈 노트 기준으로 추적 가능해야 한다.

소스 근거:

  • scripts/release/release-prepare-assets.sh
  • scripts/release/release-publish-forge.sh
  • scripts/release/release-publish-github.sh
  • release-assets/
  • artifacts/builds/

금지할 표현:

  • 공급망 공격 차단 완료
  • 릴리즈 무결성 완전 보장

7. 한계와 열린 과제

핵심 메시지:

  • KoTalk는 지금 어디까지 구현됐고, 무엇은 아직 아니다.

반드시 적어야 할 현재 갭:

  • Android는 현재 WebView 셸
  • 가입은 아직 참여 키 기반 alpha flow
  • 단일 DB / 단일 API MVP
  • E2EE 미구현
  • 기관 운영 검증 미완료

기존 공개 문서와의 연결

  • SECURITY.md는 계속 허브 문서로 유지한다.
  • TRUST_CENTER.md는 요약/표면 문서로 두고, 세부 보안 프로파일 문서로 분기시킨다.
  • PRIVACY_AND_DATA_HANDLING.md가 이미 있다면, 새 프로파일 문서와 역할을 분리한다.
  • RELEASING.md는 릴리즈 무결성 문서와 상호 링크한다.
  • DEVELOPMENT.md는 테스트 참여 키, 로컬 운영, 비밀값 주입 관련 링크만 남기고 세부 보안 설명은 새 문서군으로 보낸다.

공개 편집 원칙

써야 하는 표현:

  • 현재 구현 기준
  • 알파 단계에서 실제 적용된 통제
  • 운영 환경에서는 ...를 요구
  • 이 저장소에서 확인 가능한 근거

피해야 하는 표현:

  • 근본적으로 해결했다
  • 완벽히 안전하다
  • 완전한 탈중앙화
  • 기관 수준 보안 충족
  • 카카오톡 대체 완성

우선 공개 순서

  1. SECURITY_OVERVIEW.md
  2. AUTH_AND_SESSION_MODEL.md
  3. TRANSPORT_AND_RELEASE_TRUST.md
  4. CLIENT_TRUST_BOUNDARY.md
  5. SECURITY_PROFILES.md
  6. APPLIED_SECURITY_CONTROLS.md
  7. SECURITY_THREAT_MODEL.md
  8. SECURITY_OPERATING_PRACTICE.md
  9. SELF_HOSTING_AND_INTERNAL_NETWORK_PROFILE.md
  10. PRIVACY_AND_DATA_HANDLING_PROFILE.md
  11. RELEASE_INTEGRITY_AND_TRANSPARENCY.md
  12. SECURITY_LIMITS_AND_OPEN_GAPS.md