## MOC: Паттерны безопасности PhotoPlaces ### Аутентификация и сессии ```mermaid graph LR A[Login] --> B[Access Token JWT 15min] A --> C[Refresh Token SHA-256 в DB] C --> D[HttpOnly Cookie SameSite=Strict] B --> E[Bearer Authorization Header] D --> F[/auth/refresh → rotation] F --> G[Token reuse → RevokeAll] ``` ### Ключевые решения | Область | Решение | Документ | |---------|---------|----------| | Refresh token storage | SHA-256 хеш в PostgreSQL | [[decision-jwt-refresh-storage]] | | Concurrent refresh | `DeleteIfExists` + проверка rows_affected | [[atomic-refresh-token-race-condition]] | | CSRF | `SameSite=Strict` для refresh cookie | [[atomic-csrf-protection]] | | Rate limiting | Redis + in-memory fallback, per-IP через `X-Forwarded-For` | [[backend-rate-limiting]] | | WebSocket | per-connection rate limiter, глобальный лимит соединений | [[atomic-websocket-origin-check]] | | Error exposure | Скрытие деталей в production (500 + validation) | [[decision-validation-error-production]] | ### Production hardening - CORS: только разрешённые `AllowedOrigins` - CSP: Content-Security-Policy через Caddy ([[atomic-csp-configuration]]) - JWT secrets: `_FILE` suffix для Docker secrets, валидация при старте - Request body: `http.MaxBytesReader` (1 MB лимит) - Rate limiter: fail closed в production (503 при недоступности Redis) ### Проверки аудита 1. Все ли секреты вынесены из кода? (✓ env vars / Docker secrets) 2. Есть ли `_` в начале `TLS` в коде? (✓ нет прямых TLS настроек — всё через Caddy) 3. Используются ли параметризованные запросы? (✓ pgx) 4. Есть ли `any` или `interface{}` в публичных API? (✓ в `writeJSON(v interface{})` — допустимо, это транспорт) 5. Тестируется ли security? (— пока нет, нужно добавлять) ### Связанные заметки - [[architecture-overview]] - [[backend-auth-security]] - [[deploy-production-readiness]] #security #MOC #backend #auth #production