Secure Coding Guide | 반복된 인증시도 제한 기능 부재


정의

인증 시도 횟수를 제한하지 않아 공격자가 무작위 인증 시도를 통해 계정 접근 권한을 얻을 수 있는 보안약점이다.

영향

공격자로 부터 무작위 ID와 패스워드로 무차별 대입 인증공격을 시도하여 계정 접근 권한 획득한다.

조치 방법

로그인 루틴 호출 시 실패 횟수를 제한하지 않은 경우

안전하지 않은 Java 코드 일부

User user = userMapper.selectById(userId)

// 비밀번호가 일치하지 않은 경우
if (!passwordEncoder.matches(password, user.getPassword()))
    throw new BadCredentialsException("2006");

패스워드에 대한 실패 횟수에 대한 검증이 없다.

안전한 Java 코드 일부

User user = userMapper.selectById(userId)

// 로그인 실패 수가 5번 이상이면 로그인 거부
if (user.getLoginFailedCount() >= 5) {
  throw new BadCredentialsException();
}

// 비밀번호가 일치하지 않은 경우
if (!passwordEncoder.matches(password, user.getPassword())) {
    user.setLoginFailedCount(user.getLoginFailedCount() + 1);
    userMapper.updateLoginFailedCount(user);
    throw new BadCredentialsException();
}

패스워드에 대한 실패 횟수에 대한 검증이 있다.