Zum Inhalt springen / Skip to content

Wavor의 보안

귀하의 비즈니스 데이터는 은행과 동일한 보호를 받을 자격이 있습니다. 우리는 보호하는 것이 무엇인지 말하는 것뿐만 아니라, 어떻게 보호하는지를 보여줍니다.

AES-256TLS 1.32FADSGVO/GDPRUK GDPRLGPD (BR)DPDP (IN)EU 서버

핵심 보안

AES-256 암호화
Sensitive fields are stored encrypted. Read without the key, they show nothing.
EU 데이터 센터 (Hetzner DE)
Servers and customer files in Germany. Offsite backups sit encrypted outside the EU under the EU's transfer safeguards; the privacy policy names the provider.

가동 시간 및 인프라

99.9%
가동 시간 목표
6h
백업 간격
90d
Longest retention
Nerd zone

It gets technical from here. You do not need to read any of it to use Wavor safely - it is here so it can be checked.

보안 아키텍처

데이터 흐름. 요청에서 저장까지

1단계
Cloudflare 엣지
DDoS 보호, WAF, TLS 1.3 및 1.2 폴백. 글로벌 애니캐스트 네트워크.
2단계
Cloudflare 터널
출처에 물리적으로 접근할 수 없습니다. CF에 대한 아웃바운드 전용 연결, 인바운드 포트 없음. Wavor RSA-4096 인증서와 함께 AOP 사용자 지정 전용 신뢰.
3단계
Node.js 앱
세션 검증, 2FA 확인, RBAC, Zod 스키마를 통한 입력 검증.
4단계
PostgreSQL + Vault
Encrypted storage with AES-256. Secrets in HashiCorp Vault.
TLS 1.3 (1.2 폴백)
모든 7개 도메인에서 전체 엄격 HTTPS.
DDoS 보호
서버가 요청을 보기 전에 엣지 보호.
데이터는 어디에 저장되나요?
The servers are at Hetzner in Germany (Falkenstein and Nuremberg), customer files in object storage in Germany. The data centres are guarded around the clock, with biometric access. Backups and some services such as email, SMS and AI run through providers outside the EU. Those transfers are secured under the EU's rules, and the privacy policy names every provider.
키는 어떻게 보호되나요?
모든 API 키와 비밀은 HashiCorp Vault(KV v2, 암호화됨, 접근 제어됨)에 저장됩니다. 90/180/365일에 자동 회전 경고. 코드, 환경 또는 로그에 평문 비밀 없음.
백업은 어떻게 작동하나요?
Automated PostgreSQL backups every 6 hours. Kept: every one for two days, one a day up to 14 days, one a week up to 90 days. Each is decrypted again and checked after encryption, and every night the newest is restored as a test. Offsite copy at Backblaze, encrypted with our own key before it leaves the server.

방어 계층

HTTP 보안 헤더: 14개의 강화된 지침

CSP Level 3 (21 Direktiven)
강제 모드. 최대 W3C 표준 포함. script-src-elem/-attr 세분화, 관리 하위 도메인에서의 Trusted-Types, manifest/worker/media-src 화이트리스트.
HSTS (Strict-Transport-Security)
max-age 1 year, includeSubDomains, preload enabled.
X-Frame-Options
거부. iframe을 통한 클릭재킹 없음.
X-Content-Type-Options
nosniff. 브라우저가 MIME 유형을 잘못 해석할 수 없음.
Referrer-Policy
strict-origin-when-cross-origin.
Permissions-Policy
카메라, 마이크, 위치 정보. 기본적으로 모두 비활성화됨.
COOP (Cross-Origin-Opener-Policy)
same-origin. 브라우징 컨텍스트를 격리합니다.
CORP (Cross-Origin-Resource-Policy)
same-site. 리소스는 교차 출처로 포함될 수 없습니다.

Independently verifiable: Mozilla's HTTP Observatory grades the headers of wavor.io A+. A test asks Mozilla for the result again every night. https://developer.mozilla.org/en-US/observatory/analyze?host=wavor.io(developer.mozilla.org)

계정 보안

2FA: TOTP / SMS / 이메일
두 번째 요소를 위한 세 가지 방법. 백업 코드는 일회용입니다.
장치 인식
새 장치에 대한 즉각적인 알림 이메일(IP + User-Agent 포함).
세션 관리
활성 세션 보기, 개별적으로 종료하거나 모두 한 번에 로그아웃.
무차별 대입 공격 보호 (3계층)
이메일당 5회 실패 / 15분 잠금. IP당 10회 / 1시간. 하나의 IP에서 5개의 서로 다른 이메일 / 24시간 금지.
Cloudflare 턴스타일 캡차
클릭 퍼즐 없이 봇 보호. crossOrigin 익명 + no-referrer로 로드된 스크립트. Cloudflare에 세션 유출 없음.
Bcrypt 비밀번호 해싱 (비용 12)
Every guess costs computing time, which makes list attacks unaffordable. Passwords >= 12 chars, zxcvbn strength check.
Zod 입력 검증
모든 API 입력은 Zod를 통해 서버 측에서 검증됩니다. DB 스키마와 함께 단일 진실 출처로서 Drizzle-Zod.
Rate limiting with a sliding window
A sliding window rather than fixed blocks, so a limit is not handed out afresh at the top of every minute. The counter currently lives in the individual worker process; once Redis is configured, all processes share one.

고급 제어

세분화된 RBAC (실패 시 종료)
역할 + HTTP 메서드 인식: GET은 보기 필요, POST/PATCH는 편집 필요, DELETE는 삭제 필요. 권한 누락 = 403, 우회 불가.
다중 테넌트 격리
모든 DB 쿼리에 companyId 범위. 테넌트 간 데이터 유출 없음.
감사 로그
모든 변형은 eventLog + AuditLogger를 통해 기록됩니다. 사용자 ID, 회사 ID, 작업, 엔티티가 포함된 불변의 기록.
Approval by two people
Four actions need two approvals: changes to legal values, prices and terms, and a new sub-processor. While only one person is authorised, that person decides alone. The rule takes effect once there is a second.
비밀 회전 정책
90/180/365일에 자동 경고가 secretRotation.ts를 통해 발생합니다.
응답에서 PII 마스킹
PII 접근 권한이 없는 팀원에 대해 이메일, IBAN, 전화번호가 마스킹됩니다. piiMasking.ts 중앙.
로그 스크러빙
모든 로그는 중앙에서 정리됩니다. 로그, 모니터링 또는 디버그 출력에 개인 식별 정보(PII) 없음.
범위가 있는 API 키
apiKeyAuth.ts를 통한 만료가 있는 세분화된 권한.
소프트 삭제 및 복구
삭제된 데이터의 28일 복구. 자동 쿼리 필터가 있는 deletedAt 열.
Data export
모든 사용자 데이터의 전체 JSON 내보내기를 한 요청으로. DSAR 흐름을 통한 삭제 (제17조).

데이터 보호

Concrete technical measures

필드 수준 암호화 (AES-256-GCM)
IBAN, 세금 ID, 사회 보장, 은행 세부정보, TOTP 2FA 비밀 및 일회용 코드(로그인/검증/재설정): AES-256-GCM, 96비트 IV, 128비트 인증 태그. 암호화마다 무작위 IV.
실패 시 종료 암호화
생산 환경에서 ENCRYPTION_KEY가 없으면 서버가 시작을 거부합니다. 평문 폴백 없음 (GDPR 제32조 lit. a).
변조 감지 (GCM)
AES-GCM 인증 태그는 모든 암호문 변조를 감지합니다. 복호화는 실패 시 강력하게 실패합니다. 결코 조용히 수용하지 않습니다.
HMAC-SHA256 검색 해시
암호화된 필드는 결정론적 HMAC를 통해 검색 가능하게 유지됩니다. 별도의 키(NIST SP 800-57에 따른 키 분리).
Vault 키 관리
ENCRYPTION_KEY + SESSION_SECRET + 모든 API 키는 HashiCorp Vault(KV v2)에 있습니다. 코드, 환경 또는 로그에 평문 없음.
회전을 위한 키 버전 관리
암호문 형식 v1:iv:data:tag. 데이터 손실 없이 새로운 버전으로 회전 가능.

공급망 보안

손상된 종속성에 대한 보호 (event-stream 2018, ua-parser-js 2021)

Dependencies as a build gate
Every build checks all dependencies against the vulnerability database. New findings block; known ones sit in a dated baseline that may only shrink.
Dependabot 경고
GitHub Dependabot은 CVE 데이터베이스에 대해 매일 확인합니다. 자동 보안 PR.
잠금 파일 커밋됨
repo의 package-lock.json. CI가 로컬과 다른 버전을 가져오는 것을 방지합니다.
SSRF protection on outbound fetches
Every address that comes from user input is checked before Wavor fetches it. Private networks are blocked, and each redirect is checked again instead of being followed blindly.
자동 보안 패치
unattended-upgrades installs operating-system security fixes automatically.
외부 스크립트: CORS + 리퍼러
Turnstile (Cloudflare)는 crossOrigin 익명 + referrerPolicy no-referrer로 로드됩니다. 자격 증명 유출 없음.

모니터링 및 가시성

오류 추적 (자체 호스팅)
스택 트레이스와 함께 실시간 오류 알림.
메트릭 (Prometheus + Grafana)
요청 대기 시간, DB 쿼리, 메모리, 사용자 정의 비즈니스 메트릭.
서버 모니터링
가동 시간, CPU, 메모리, 디스크: 24/7 자동 검사.

파일 업로드 보안 (7계층 스택)

악성 소프트웨어, 다중 언어 공격, SVG-XSS, 경로 탐색, MIME 스니핑에 대한 보호

계층 1: 절대 크기 게이트 (100 MB)
zip 폭탄 + DoS에 대한 하드 캡. Multer + 심층 방어.
계층 2: 유형별 크기 게이트
이미지 5 MB, PDF 20 MB, 비디오 100 MB. 유형별 한계.
계층 3: MIME 화이트리스트 + 블록리스트
22가지 유형 허용. HTML/JS/EXE/SH/JAR는 명시적으로 차단됨 (XSS 벡터).
계층 4: 파일 이름 정리
../ 경로 탐색, 널 바이트, Windows 예약 이름 차단.
계층 5: 매직 바이트 검증
파일 내용은 확장자 + MIME과 일치해야 합니다. 파일 유형 라이브러리는 'evil.exe를 picture.jpg로 이름 변경' 공격을 감지합니다.
계층 6: SVG 정리
DOMPurify는 SVG에서 포함된 <script> 태그를 제거합니다. 세척 없이 SVG 업로드는 일반적인 XSS 벡터입니다.
Layer 7: virus scan
Server-side virus scan before storage, provided the scanner is running on the server. If it is missing, that is logged rather than passed over silently.

XSS 심층 방어 (4계층)

저장된, 반사된, DOM, 공급망 XSS. 모든 벡터가 포함됩니다.

계층 1: React JSX 자동 이스케이프
모든 사용자 입력은 기본적으로 이스케이프됩니다. <script> 태그는 텍스트로 렌더링되며, 절대 실행되지 않습니다. 코드 규칙: 사용자 입력으로 dangerouslySetInnerHTML을 사용하지 마십시오.
계층 2: DOMPurify 정리기
sanitizeProse() + sanitizeEmailPreview()는 기사 HTML, 이메일 미리보기 + 마크다운을 정리합니다. <script>, <iframe>, on*-핸들러, javascript:/data: URI를 제거합니다.
계층 3: CSP script-src 'self'
레이어 1+2가 실패하더라도: 브라우저는 외부 스크립트를 차단합니다. Stripe + Turnstile 캡차에 대해서만 화이트리스트.
계층 4: 신뢰할 수 있는 유형 (관리자)
require-trusted-types-for 'script' on admin.wavor.io는 모든 DOM 조작을 정책을 통해 강제합니다. 라이브러리 버그로 인한 DOM-XSS를 방지합니다.

인증 로드맵

우리는 투명합니다: 우리는 구축 중이며 아직 공식 인증이 없습니다. 그러나 우리는 이미 표준을 구현하고 있으며 이를 위해 적극적으로 노력하고 있습니다.

DSGVO / GDPR (EU)
구현됨
UK GDPR (Data Protection Act 2018)
구현됨
LGPD (Brasilien)
구현됨
DPDP Act 2023 (Indien)
구현됨
AVG (Niederlande)
구현됨
FADP (Schweiz)
구현됨
ePrivacy (Cookie-Consent)
구현됨
DSA (Digital Services Act)
구현됨
SOC 2 Type II
계획됨
ISO 27001:2022
계획됨
ISO 27017 + 27018 (Cloud)
계획됨
ISO 27701 (Privacy)
계획됨
ISO 42001 (AI Management)
계획됨
BSI C5 Type II
계획됨
CSA STAR Level 1
계획됨

우리는 또한 EU AI 법, NIS2 및 GoBD (독일 회계)에 맞추어 조정합니다. 이는 규정이지 인증이 아닙니다.

보안 문제 보고

취약점을 발견하셨나요? 우리 팀에 비밀리에 보고하십시오. 우리는 모든 보고서를 진지하게 받아들이며 가능한 한 빨리 연락드리겠습니다.