Express 로그인 시도 제한 부재

Express 로그인 시도 제한 부재

설명

Express 로그인 처리에서 인증 실패 횟수 제한, 지연, 잠금, CAPTCHA 같은 제어 없이 비밀번호 검증이나 인증 미들웨어만 수행하면 공격자가 비밀번호 대입 공격을 반복할 수 있습니다. 로그인 엔드포인트는 성공 여부와 관계없이 시도 횟수를 추적하고 제한해야 합니다.

잠재적 영향

  • 사용자 계정이 무차별 대입 또는 크리덴셜 스터핑 공격에 노출될 수 있습니다.
  • 실패 이벤트가 추적되지 않아 공격 탐지와 대응이 늦어질 수 있습니다.

해결 방법

  • 계정, IP, 디바이스 기준으로 로그인 실패 횟수를 추적하세요.
  • express-rate-limit 같은 미들웨어로 로그인 엔드포인트에 제한을 적용하세요.
  • 잠금과 해제 이벤트를 보안 로그와 알림으로 남기세요.

예시

본문 파싱, rateLimit 초기화와 사용자 조회·오류 처리는 생략한 라우트 예시입니다. 실제 배포에서는 프록시의 클라이언트 IP 처리와 IPv6 주소 묶음, 여러 인스턴스의 공유 카운터도 구성하세요.

변경 전

javascript
app.post("/login", async (req, res) => {
  const user = await loadUser(req.body.username);
  const ok = await bcrypt.compare(req.body.password, user.passwordHash);
  res.json({ ok });
});

변경 후

javascript
const loginLimiter = rateLimit({
  windowMs: 60_000,
  max: 5,
  keyGenerator: (req) => `${req.ip}:${req.body.username ?? ""}`,
});

app.post("/login", loginLimiter, async (req, res) => {
  const user = await loadUser(req.body.username);
  const ok = await bcrypt.compare(req.body.password, user.passwordHash);
  res.json({ ok });
});

설명:

  • 변경 전: Express 로그인 처리에서 인증 실패 횟수 제한, 지연, 잠금, CAPTCHA 같은 제어 없이 비밀번호 검증이나 인증 미들웨어만 수행하면 공격자가 비밀번호 대입 공격을 반복할 수 있습니다.
  • 변경 후: 로그인 실패 횟수를 계정, IP, 디바이스 기준으로 추적하고 임계치 초과 시 지연 또는 잠금을 적용하세요.

참조