#329: API Key Scoping and Permissions Audit
API keys support three scopes: READ_ONLY, UPLOAD, ADMIN
Keys have granular permission strings that cannot exceed the owning user's role
Rate limiting is tiered per key: standard (100/min), high (500/min), unlimited (10k/min)
Scope enforcement : requireApiKeyScope() middleware correctly gates routes by scope
Permission escalation prevention : Key permissions are validated against user role at issue time and on every request
Key hash storage : Keys are stored as SHA-256 hashes, never plaintext
Revocation : Keys can be revoked via isRevoked flag, checked on every request
#330: JWT Expiry and Refresh-Token Rotation Audit
JWT tokens are verified on every request via requireAuth middleware
Refresh tokens stored in refresh_tokens entity with device fingerprinting
JWT verification : Uses jsonwebtoken.verify() with JWT_SECRET env var
Token lifetime : Should be configured via expiresIn in jwt.sign() — verify in auth service
Refresh rotation : Refresh tokens are single-use (consumed on use, new one issued)
Device binding : Refresh tokens are bound to device fingerprint
#339: Security Headers (Helmet/CORS) Audit
Express app with helmet middleware for security headers
CORS configured via environment variable
Helmet : Provides default security headers (X-Frame-Options, X-Content-Type-Options, etc.)
CORS : Configurable origins via CORS_ALLOWED_ORIGINS env var
HSTS : Should be enabled in production