section: Secrets & Config | prio: P0 | est: 3h
Pourquoi
La rotation des clés JWT sans downtime est obligatoire pour la sécurité à long terme. Sans kid support, changer la clé invalide toutes les sessions actives.
Acceptance Criteria
- JWT RS256 :
JWT_PRIVATE_KEY_KID1 (RSA 4096 PEM, clé active), JWT_PUBLIC_KEY_KID1 (clé publique partageable), JWT_PRIVATE_KEY_KID2 (clé future pour rotation), JWT_PUBLIC_KEY_KID2. Le header JWT inclut kid pour identifier la clé. Le middleware JWTMiddleware supporte 2 clés actives simultanément.
- Google OAuth :
GOOGLE_CLIENT_ID uniquement (pas de client secret pour la vérification ID tokens)
- SMS :
AT_API_KEY, AT_USERNAME, AT_SENDER_ID=QUANTIFY
- Email :
SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASSWORD, MAIL_FROM, DKIM_PRIVATE_KEY
- PostgreSQL :
DATABASE_URL (primary, sslmode=require), DATABASE_URL_REPLICA (read replica), TEST_DB_PASSWORD
- Redis :
REDIS_CLUSTER_URLS (comma-separated), REDIS_PASSWORD
- Cloudflare R2 :
R2_ACCOUNT_ID, R2_ACCESS_KEY_ID, R2_SECRET_ACCESS_KEY, R2_BUCKET_AVATARS, R2_CDN_URL
- Crypto :
TOTP_ENCRYPTION_KEY (AES-256, 64 hex chars)
- App :
BCRYPT_COST=12, BCRYPT_WORKER_POOL_SIZE, MAX_LOGIN_ATTEMPTS=5, LOCKOUT_DURATION_MINUTES=15, OTP_DAILY_LIMIT=5, USERNAME_RECLAIM_DELAY_DAYS=30, USERNAME_CHANGE_COOLDOWN_DAYS=30, AUTO_REVOKE_METER_ADMIN=true, ACCOUNT_DELETION_GRACE_DAYS=30
- Struct
Config dans config/ avec validation au démarrage (panic si secret critique absent)
.env.example exhaustif commenté. Aucun secret en dur dans le code.
Fichiers
config/
├── auth.go
├── user.go
└── validate.go
.env.example
Scale
Rotation JWT sans downtime = zéro déconnexion lors des rotations de clés sécurité.
section: Secrets & Config | prio: P0 | est: 3h
Pourquoi
La rotation des clés JWT sans downtime est obligatoire pour la sécurité à long terme. Sans kid support, changer la clé invalide toutes les sessions actives.
Acceptance Criteria
JWT_PRIVATE_KEY_KID1(RSA 4096 PEM, clé active),JWT_PUBLIC_KEY_KID1(clé publique partageable),JWT_PRIVATE_KEY_KID2(clé future pour rotation),JWT_PUBLIC_KEY_KID2. Le header JWT inclutkidpour identifier la clé. Le middleware JWTMiddleware supporte 2 clés actives simultanément.GOOGLE_CLIENT_IDuniquement (pas de client secret pour la vérification ID tokens)AT_API_KEY,AT_USERNAME,AT_SENDER_ID=QUANTIFYSMTP_HOST,SMTP_PORT,SMTP_USER,SMTP_PASSWORD,MAIL_FROM,DKIM_PRIVATE_KEYDATABASE_URL(primary, sslmode=require),DATABASE_URL_REPLICA(read replica),TEST_DB_PASSWORDREDIS_CLUSTER_URLS(comma-separated),REDIS_PASSWORDR2_ACCOUNT_ID,R2_ACCESS_KEY_ID,R2_SECRET_ACCESS_KEY,R2_BUCKET_AVATARS,R2_CDN_URLTOTP_ENCRYPTION_KEY(AES-256, 64 hex chars)BCRYPT_COST=12,BCRYPT_WORKER_POOL_SIZE,MAX_LOGIN_ATTEMPTS=5,LOCKOUT_DURATION_MINUTES=15,OTP_DAILY_LIMIT=5,USERNAME_RECLAIM_DELAY_DAYS=30,USERNAME_CHANGE_COOLDOWN_DAYS=30,AUTO_REVOKE_METER_ADMIN=true,ACCOUNT_DELETION_GRACE_DAYS=30Configdansconfig/avec validation au démarrage (panic si secret critique absent).env.exampleexhaustif commenté. Aucun secret en dur dans le code.Fichiers
Scale
Rotation JWT sans downtime = zéro déconnexion lors des rotations de clés sécurité.