Real World Example

Hardening a Fintech Login API

A lending or wallet app's login endpoint is attacked constantly (credential stuffing). Several layers work together:

LayerNestJS toolSetting
Per-IP rate limitThrottlerGuard20 login attempts / 10 min per IP
Per-account lockoutService logic + Redis counterLock 15 min after 5 failures
Same error for unknown email and wrong passwordAuthService"Invalid email or password"
Constant-time comparebcrypt.compareNo timing leaks
Audit logInterceptorIP, device, result for every attempt
Secure headershelmetHSTS, no sniffing
@Controller('auth')
export class AuthController {
  @Public()
  @Throttle({ long: { limit: 20, ttl: 10 * 60_000 } })
  @UseGuards(AccountLockGuard, AuthGuard('local'))
  @HttpCode(200)
  @Post('login')
  login(@CurrentUser() user: User) {
    return this.auth.issueTokens(user);
  }
}