Cloudflare Turnstile, reCAPTCHA, hCaptcha. Alle drei machen das Gleiche: sie entscheiden, ob ein Request von einem Menschen oder einem Bot kommt. Und alle drei haben das gleiche Problem: deine User-Daten landen auf fremden Servern, du hast keinen Einblick in die Scoring-Logik, und wenn der Dienst ausfällt, stehen deine Formulare still.
Janus ist die self-hosted Alternative. Kein Third-Party Tracking, keine Cookies, keine externen Scripts. Alle Daten bleiben auf deiner Infrastruktur. Das SDK ist unter 5KB gzipped (Turnstile/reCAPTCHA: 50-200KB).
Multi-Signal Risk Scoring
Janus kombiniert vier Signale zu einem Risk Score von 0 bis 100. Base Score: 50 (neutral). Jedes Signal addiert oder subtrahiert.
Proof-of-Work. SHA-256 Challenge mit konfigurierbarer Difficulty (Default: 4 Leading Zeros), gelöst in einem Web Worker (non-blocking, yieldet alle 1000 Iterationen). Die Lösungszeit ist der Indikator: unter 100ms gibt +25 Risikopunkte (vorberechnete Lösung oder GPU), 1-15 Sekunden gibt -10 (normaler Browser), über 30 Sekunden gibt +5 (verdächtig langsam). Nonce Replay Protection via Redis SET NX mit 10-Minuten TTL. Lösungszeiten unter 50ms oder über 300s werden komplett rejected.
Browser Fingerprinting. Canvas, WebGL, Audio, Fonts, Navigator. Fingerprint-Konsistenz: unter 50% gibt +20 Punkte, über 90% gibt -10. Fingerprints werden als SHA-256 Hash gespeichert, pro Site unterschiedlich gehasht. Kein Cross-Site Tracking. Redis trackt Fingerprint Velocity: IPs pro Fingerprint und Fingerprints pro IP, um Bot-Farms zu erkennen.
Behavioral Analysis. Mausbewegungen (Velocity Variance), Tastatur-Timing, Scroll-Events, Touch-Events. Mode-aware Scoring: im Managed Mode (Checkbox) erwartet Janus Interaktion und bestraft fehlende stärker als im Invisible Mode.
Automation Detection. Prüft auf Webdriver, Phantom, Selenium, Nightmare, CDP Markers. Fehlender JA3-Hash (TLS Fingerprint) ist ein eigenes Signal.
Jedes Signal allein ist umgehbar. Zusammen werden sie teuer zu faken.
Verification Flow

Der komplette Flow hat vier Stages:
Challenge Issuance. SDK sendet POST /api/v1/challenge mit Site-Key. API validiert Origin gegen Domain Allowlist, generiert HMAC-bound Challenge: HMAC(siteId + IP + timestamp + nonce). Challenge wird in PostgreSQL gespeichert (status: pending, TTL: 5min).
Signal Collection. SDK sammelt Fingerprints parallel (Canvas, WebGL, Audio, Fonts), startet Automation Detection, berechnet Merkle Root aller Signal-Hashes, delegiert PoW an Web Worker.
Verification. SDK sendet Solution + alle Signals. API validiert: Challenge pending und nicht expired, IP matcht, Nonce nicht replayed (Redis), SHA-256 Hash hat Required Leading Zeros, Solve Time im validen Range. Marks Challenge als solved. Scored Risk basierend auf allen Signalen. Issued HMAC Token gebunden an IP + Fingerprint mit crypto.timingSafeEqual für Constant-Time Comparison. 5-Minuten TTL.
Server-Side Validation. Dein Backend sendet Token an POST /api/v1/siteverify. API hasht Secret, verifiziert HMAC Signature, prüft Expiry und Site Ownership. Antwort: { success, action, risk_score, hostname }.
Dual-Layer Rate Limiting
Nginx Layer. Transport-Level: 10r/s Challenges (Burst 20), 5r/s Verify (Burst 10), 30r/s Siteverify (Burst 50), 3r/m Auth (Brute-Force Prevention). Connection Limit: 20 pro IP. Security Headers: X-Frame-Options: DENY, X-Content-Type-Options: nosniff, Permissions-Policy blockiert Camera/Microphone/Geolocation/Payment. SDK Payload limitiert auf 64KB.
Application Layer. Redis Sorted Sets für Sliding Window Rate Limiting pro IP und pro Fingerprint. ZREMRANGEBYSCORE entfernt expired Entries, ZCARD zählt, ZADD fügt hinzu, PEXPIRE setzt TTL. Alles in einer Pipeline. Bei Redis-Ausfall: Fail Closed.
AWS-Infrastruktur

ECS Fargate mit Deployment Circuit Breaker für automatischen Rollback. Auto-Scaling auf CPU (70%) und Memory (80%). Konservativer Scale-In (300s Cooldown), aggressiver Scale-Out (60s). Dual Capacity Provider: FARGATE + FARGATE_SPOT mit Base Capacity von 1 auf Standard. Health Checks mit 30s Interval und 60s Startup Period.
RDS PostgreSQL 16. Multi-AZ Failover in Production. gp3 Storage mit Auto-Scaling bis 100GB. Performance Insights. 30 Tage Backup Retention in Production. Deletion Protection. Connection/Disconnection Logging und Slow Query Detection (1000ms Threshold).
ElastiCache Redis 7. allkeys-lru Eviction Policy. Appendonly Persistence.
CloudFront vor dem SDK in S3. Immutable Versions unter v<hash> mit 1 Jahr Cache, Latest mit 300s TTL.
Secrets Management. AWS Secrets Manager. Alle Secrets automatisch generiert beim ersten terraform apply: 32-Char Passwörter für DB, 64-Char Hex für Application Secrets. Injected via valueFrom ARN References.
IAM. OIDC Federation für GitHub Actions. Keine langlebigen AWS Keys. Scoped CI/CD Role mit Resource-spezifischen ARNs.
Networking. VPC mit Public/Private Subnet Split über 2+ AZs. ALB in Public, Compute in Private. Security Group Chain: ALB → ECS → RDS/Redis via SG References. ALB mit HTTPS (TLS 1.3 Policy), Path-based Routing, HTTP-zu-HTTPS Redirect.
CI/CD
Parallele Jobs: Lint + Typecheck (pro Package), Build, Test, E2E. Concurrency Control cancelt In-Progress Jobs. E2E Tests gegen echte PostgreSQL 16 + Redis 7 mit Health Checks. Database Schema via drizzle-kit push.
Docker Images mit 8-Char Commit SHA als immutable Tag. GitHub Actions Cache für Layers. Deploy-Job: Build API + Dashboard parallel → ECS Force New Deployment → aws ecs wait services-stable. SDK Upload zu S3 mit CloudFront Invalidation.
Terraform: Plan auf PR (Diff als Comment, auf 60k Chars getrimmt), Apply auf Merge mit Environment Approval Gates.
Platform Features
Admin Dashboard (Next.js 15 + React 19) mit Real-Time Analytics via Server-Sent Events. Two-Factor Authentication (TOTP). Prometheus Metrics. Webhook Notifications (HMAC-signed). Structured JSON Logging mit Correlation IDs. Plugin System für Custom Risk Scoring. Adaptive PoW Difficulty bei Angriffen. OpenAPI/Swagger Docs.
GDPR: Fingerprints als One-Way Hashes, Behavioral Signals als aggregierte Scores, optionale IP-Anonymisierung, automatische Data Retention Cleanup, Right-to-Erasure Endpoint.