diff --git a/.env.example b/.env.example index 36909c0f..a725958f 100644 --- a/.env.example +++ b/.env.example @@ -36,8 +36,16 @@ DATABASE_URL=mysql://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME} # ============== SECURITY ============== # JWT-Secret: min. 32 Zeichen. Generieren: openssl rand -hex 64 +# Wird sowohl für Access- als auch Refresh-Token verwendet. JWT_SECRET=change-this-to-a-very-long-random-secret-please-rotate-before-production -JWT_EXPIRES_IN=7d + +# Access-/Refresh-Token-Lifetimes +# - Access-Token: kurzlebig, lebt nur im Browser-Memory (XSS-Schutz) +# - Refresh-Token: lang, im httpOnly-Cookie (JS-unzugänglich) +# Wenn der Access abläuft, holt das Frontend transparent einen neuen über +# /api/auth/refresh – User merkt nichts. Logout invalidiert beide sofort. +JWT_EXPIRES_IN=15m +JWT_REFRESH_EXPIRES_IN=7d # Encryption-Key für Portal-Credentials: GENAU 64 Hex-Zeichen. # Generieren: openssl rand -hex 32 diff --git a/docker-compose.yml b/docker-compose.yml index 5329e4d0..405ad42f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -59,7 +59,8 @@ services: DB_USER: ${DB_USER} DB_PASSWORD: ${DB_PASSWORD} JWT_SECRET: ${JWT_SECRET} - JWT_EXPIRES_IN: ${JWT_EXPIRES_IN:-7d} + JWT_EXPIRES_IN: ${JWT_EXPIRES_IN:-15m} + JWT_REFRESH_EXPIRES_IN: ${JWT_REFRESH_EXPIRES_IN:-7d} ENCRYPTION_KEY: ${ENCRYPTION_KEY} NODE_ENV: production PORT: 3001