← 목록으로
● 범용 공격기법 · 유출 비밀번호 재사용 대입 공격

크리덴셜 스터핑을 그대로 재현하고,
막는 코드까지 공개합니다

다른 서비스에서 유출된 비밀번호 목록을 그대로 대입해보는 크리덴셜 스터핑 — 비밀번호 하나만 맞으면 로그인되는 구조의 근본적 약점을 재현하고, MFA(2차 인증)가 이를 어떻게 막는지 실제 침투테스트 도구(hydra)로 직접 검증했습니다.

라이브 데모 보기 → 코드 바로보기

누구를 위한 건가

비밀번호 단일 인증만으로 충분하다고 가정하는 로그인 시스템을 만들고 있는 백엔드 개발자용 학습 자료입니다.

OWASP #7
OWASP API 보안 Top 10에서 인증취약점(크리덴셜 스터핑 포함)이 차지하는 순위대
hydra
GitHub 스타 1만+ 실제 침투테스트 도구로 직접 공격 재현·검증
0원
지금 공개하는 코드의 가격 — 전부 무료

코드 — password-only-login.js

비밀번호 일치만으로 로그인을 허용하는 취약한 로그인 API.

password-only-login.js
// 취약한 로그인 API — 비밀번호가 일치하면 그걸로 끝.
// 다른 서비스에서 유출된 비밀번호 목록을 그대로 대입하는
// 크리덴셜 스터핑 공격에 그대로 뚫림(hydra로 직접 검증).
class PasswordOnlyLogin {
  constructor(userDb) {
    this.db = userDb; // { username: password }
  }

  login(username, password) {
    if (this.db[username] === password) {
      return { status: 'ok' };
    }
    return { status: 'invalid_credentials' };
  }
}

module.exports = { PasswordOnlyLogin };

코드 — mfa-guard.js

해결책: 비밀번호가 맞아도 유효한 2차 인증 코드 없이는 로그인을 거부한다.

mfa-guard.js
// 해결책: 비밀번호 + 2차 인증(TOTP류) 둘 다 필요.
// 유출된 비밀번호가 100% 맞아도, 공격자는 실시간으로
// 바뀌는 2차 인증 코드를 모르므로 로그인 불가.
class MfaGuardedLogin {
  constructor(userDb, totpProvider) {
    this.db = userDb;
    this.totp = totpProvider; // .currentCode(username)
  }

  login(username, password, totpCode) {
    if (this.db[username] !== password) {
      return { status: 'invalid_credentials' };
    }
    if (totpCode !== this.totp.currentCode(username)) {
      return { status: 'invalid_credentials' }; // 어느쪽이 틀렸는지 알려주지 않음
    }
    return { status: 'ok' };
  }
}

module.exports = { MfaGuardedLogin };

가격

무료 (지금)
심화 버전(계정 잠금·이상탐지 포함) 출시 예정 — 사업자등록 완료 후 자유가격($0부터)으로 공개
goalsgo7574@gmail.com
구매·결제가 아닙니다 — "심화버전 출시알림 받고 싶어요"라고 메일 한 통만 보내주시면, 출시 시 연락드립니다.
주의: 이건 학습용 축소 구현입니다. 실전에선 계정 잠금, 속도제한, 이상행위 탐지도 함께 필요합니다.

의견을 남겨주세요

이 상품에 대한 피드백이나 질문이 있으면 알려주세요. 회신을 원하시면 이메일을 남겨주세요(선택).