Sicherheitswarnungen per E-Mail sind entscheidend, um Benutzerkonten zu schützen. Sie müssen klar, handlungsorientiert und sofort zugestellt sein. So entwerfen Sie effektive Sicherheitsbenachrichtigungen.
Arten von Sicherheitswarnungen
Anmeldebenachrichtigungen
interface LoginAlert {
user: { email: string; name: string };
login: {
timestamp: Date;
ip: string;
location?: { city: string; country: string };
device: string;
browser: string;
};
isNewDevice: boolean;
isNewLocation: boolean;
}
await sendEmail({
to: user.email,
subject: login.isNewDevice
? 'New device signed in to your account'
: 'New sign-in to your account',
template: 'login-alert',
data: {
user,
login,
secureAccountUrl: `${baseUrl}/security`,
notYouUrl: `${baseUrl}/security/report?session=${sessionId}`
},
priority: 'high'
});
Bestätigung der Passwortänderung
await sendEmail({
to: user.email,
subject: 'Your password was changed',
template: 'password-changed',
data: {
user,
changedAt: new Date(),
device: request.device,
location: request.location,
resetUrl: `${baseUrl}/reset-password`,
supportEmail: '[email protected]'
}
});
Warnung vor verdächtiger Aktivität
interface SuspiciousActivityAlert {
user: User;
activity: {
type: 'failed_logins' | 'unusual_location' | 'api_abuse' | 'data_export';
details: string;
timestamp: Date;
riskLevel: 'low' | 'medium' | 'high';
};
recommendedActions: string[];
}
await sendEmail({
to: user.email,
subject: '⚠️ Unusual activity detected on your account',
template: 'suspicious-activity',
data: {
user,
activity,
recommendedActions: [
'Change your password',
'Review recent activity',
'Enable two-factor authentication'
],
securityDashboardUrl: `${baseUrl}/security`,
lockAccountUrl: `${baseUrl}/security/lock?token=${lockToken}`
},
priority: 'high'
});
E-Mails zur Zwei-Faktor-Authentifizierung
Bestätigung: 2FA aktiviert
await sendEmail({
to: user.email,
subject: 'Two-factor authentication enabled',
template: '2fa-enabled',
data: {
user,
method: '2fa.method', // 'authenticator' | 'sms' | 'email'
backupCodes: user.hasBackupCodes,
manageUrl: `${baseUrl}/security/2fa`
}
});
Backup-Codes neu generiert
await sendEmail({
to: user.email,
subject: 'New backup codes generated',
template: 'backup-codes-regenerated',
data: {
user,
generatedAt: new Date(),
device: request.device,
warning: 'Your old backup codes no longer work',
viewCodesUrl: `${baseUrl}/security/backup-codes`
}
});
Sitzungs- und Geräteverwaltung
Neues Gerät hinzugefügt
await sendEmail({
to: user.email,
subject: 'New device added to your account',
template: 'new-device',
data: {
user,
device: {
name: deviceInfo.name,
type: deviceInfo.type,
browser: deviceInfo.browser,
os: deviceInfo.os,
addedAt: new Date()
},
location: deviceInfo.location,
removeDeviceUrl: `${baseUrl}/security/devices/${deviceId}/remove`,
viewAllDevicesUrl: `${baseUrl}/security/devices`
}
});
Alle Sitzungen beendet
await sendEmail({
to: user.email,
subject: 'All sessions signed out',
template: 'sessions-terminated',
data: {
user,
terminatedAt: new Date(),
terminatedBy: 'you', // or 'admin' or 'security_system'
sessionsCount: terminatedCount,
reason: 'Password change', // or 'Security concern' or 'User request'
signInUrl: `${baseUrl}/login`
}
});
Warnungen zu API und Access-Token
API-Schlüssel erstellt
await sendEmail({
to: user.email,
subject: 'New API key created',
template: 'api-key-created',
data: {
user,
apiKey: {
name: key.name,
prefix: key.prefix, // First 8 chars only
permissions: key.permissions,
createdAt: new Date()
},
manageKeysUrl: `${baseUrl}/settings/api-keys`
}
});
Ungewöhnliche API-Aktivität
await sendEmail({
to: user.email,
subject: 'Unusual API activity detected',
template: 'api-activity-alert',
data: {
user,
activity: {
keyName: key.name,
requestCount: activity.count,
timeWindow: '1 hour',
normalRange: '100-500 requests',
actualCount: activity.count
},
revokeKeyUrl: `${baseUrl}/settings/api-keys/${key.id}/revoke`,
viewLogsUrl: `${baseUrl}/settings/api-keys/${key.id}/logs`
}
});
Ablauf der E-Mail-Änderung
E-Mail-Änderung angefordert
// Send to OLD email
await sendEmail({
to: user.currentEmail,
subject: 'Email change requested',
template: 'email-change-requested',
data: {
user,
newEmail: maskEmail(newEmail),
requestedAt: new Date(),
cancelUrl: `${baseUrl}/security/email-change/cancel?token=${cancelToken}`,
expiresIn: '24 hours'
}
});
// Send to NEW email
await sendEmail({
to: newEmail,
subject: 'Verify your new email address',
template: 'email-change-verify',
data: {
user,
verifyUrl: `${baseUrl}/security/email-change/verify?token=${verifyToken}`,
expiresIn: '24 hours'
}
});
Best Practices für Sicherheitswarnungen
Priorität und Timing
const securityEmailConfig = {
// Immediate, high priority
immediate: [
'password_changed',
'email_changed',
'suspicious_activity',
'2fa_disabled',
'all_sessions_terminated'
],
// Can batch or slight delay
batchable: [
'new_login_known_device',
'api_key_created',
'settings_changed'
]
};
async function sendSecurityAlert(type: string, data: any) {
const isImmediate = securityEmailConfig.immediate.includes(type);
await sendEmail({
...data,
priority: isImmediate ? 'high' : 'normal',
headers: {
'X-Priority': isImmediate ? '1' : '3',
'X-Security-Alert': 'true'
}
});
}
Klare Handlungsanweisungen
// Always include:
// 1. What happened
// 2. When it happened
// 3. What to do if it was you
// 4. What to do if it wasn't you
const securityEmailStructure = {
whatHappened: 'Your password was changed',
when: formatDateTime(event.timestamp),
where: `${event.location.city}, ${event.location.country}`,
device: event.device,
ifYou: 'No action needed. You can ignore this email.',
ifNotYou: {
actions: [
{ label: 'Reset your password', url: resetUrl },
{ label: 'Contact support', url: supportUrl }
],
urgency: 'Do this immediately to secure your account'
}
};
Best Practices
- —Sofort senden - Sicherheitswarnungen müssen in Echtzeit ankommen
- —Eindeutige Betreffzeilen - Nutzer sollten das Problem allein am Betreff erkennen
- —Kontext einfügen - Zeit, Ort, Geräteinformationen
- —Aktionen bereitstellen - Klare nächste Schritte für beide Szenarien
- —Keine sensiblen Daten einfügen - Keine Passwörter oder vollständigen Tokens in E-Mails
- —Einheitliches Branding verwenden - Damit Nutzer legitime Warnungen erkennen
- —Zustellbarkeit testen - Sicherheits-E-Mails müssen im Posteingang landen, nicht im Spam
Sicherheitswarnungen schaffen Vertrauen. Wenn Nutzer wissen, dass Sie auf sie aufpassen, fühlen sie sich beim Verwenden Ihres Produkts sicherer.