← 목록으로
● 범용 공격기법 · 카드 유효성 대량검증(BIN/카드테스팅) 공격

소액결제로 유효한 카드번호를 찾는 공격,
그걸 막는 코드를 공개합니다

카드테스팅(BIN 공격)은 알려진 BIN(발급사 식별번호) 뒤의 나머지 숫자를 대량으로 대입해, 소액 승인요청만으로 유효한 카드번호를 찾아내는 공격입니다. 실제 침투테스트 도구(hydra)로 이 공격을 재현하고, 속도제한(velocity check)이 이를 어떻게 막는지 검증했습니다.

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

누구를 위한 건가

카드 승인 API에 시도 횟수 제한을 걸지 않은 결제 시스템을 만드는 백엔드 개발자용 학습 자료입니다.

OWASP
자동화된 위협(OWASP Automated Threats to Web Applications)의 대표 사례 중 하나(카드 크래킹)
hydra
GitHub 스타 1만+ 실제 침투테스트 도구로 직접 공격 재현·검증
0원
지금 공개하는 코드의 가격 — 전부 무료

코드 — unlimited-charge-attempts.js

시도 횟수 제한 없이 카드번호 유효성을 확인해주는 취약한 결제 API.

unlimited-charge-attempts.js
// 취약한 결제 API — 카드번호가 유효한지 몇 번이든 확인해줌.
// 소액(또는 $0) 승인요청이라 피해는 작아 보이지만, 공격자는
// 이 응답 자체를 "유효한 카드번호 탐색기"로 악용함(hydra로 검증).
class UnlimitedChargeAttempts {
  constructor(validCards) {
    this.validCards = validCards; // Set<cardNumber>
  }

  charge(cardNumber) {
    if (this.validCards.has(cardNumber)) {
      return { status: 'card_valid' };
    }
    return { status: 'card_declined' };
  }
}

module.exports = { UnlimitedChargeAttempts };

코드 — velocity-check-guard.js

해결책: 같은 출처가 실패를 일정 횟수 넘기면 그 이후로는 전부 차단한다.

velocity-check-guard.js
// 해결책: 같은 출처(IP 등)의 실패 횟수를 세어, 일정 횟수를
// 넘으면 그 이후 요청은 카드번호를 보지도 않고 즉시 차단.
class VelocityCheckGuard {
  constructor(validCards, blockAfter = 3) {
    this.validCards = validCards;
    this.blockAfter = blockAfter;
    this.failuresBySource = new Map();
  }

  charge(cardNumber, source) {
    const fails = this.failuresBySource.get(source) || 0;
    if (fails >= this.blockAfter) {
      return { status: 'rate_limited' }; // 진짜 카드라도 이젠 안 알려줌
    }
    if (this.validCards.has(cardNumber)) {
      return { status: 'card_valid' };
    }
    this.failuresBySource.set(source, fails + 1);
    return { status: 'card_declined' };
  }
}

module.exports = { VelocityCheckGuard };

가격

무료 (지금)
심화 버전(기기 핑거프린팅·발급사 연동 포함) 출시 예정 — 사업자등록 완료 후 자유가격($0부터)으로 공개
goalsgo7574@gmail.com
구매·결제가 아닙니다 — "심화버전 출시알림 받고 싶어요"라고 메일 한 통만 보내주시면, 출시 시 연락드립니다.
주의: 이건 학습용 축소 구현입니다. IP만 보는 속도제한은 프록시 로테이션으로 우회될 수 있어, 실전에선 기기 핑거프린팅 등도 함께 필요합니다.

의견을 남겨주세요

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