서버 개발 보안 가이드 - 인증 수행 제한
※ 취약점 설명 및 고려사항 ※
로그인 기능을 포함해 다양한 주요 인증 기능을 구현할 때에는 인증 시도 횟수를 제한해야 합니다. 주요기관의 소프트웨어 개발보안 가이드를 보면 로그인 시도 횟수를 3~5번 이내로 제한하고 이를 초과하여 로그인에 실패하는 경우 추가 입력값을 요구하거나 계정잠금을 수행하도록 설계해야 한다고 나옵니다.
※ 적용 예시 ※
현재 SMS 인증 API의 데이터베이스 컬럼은 다음과 같이 구성되어 있습니다.
- member_tel: 핸드폰 번호
- sms_token: 인증 번호
- sms_date: 인증 시도 날짜
가장 간단한 구현 방법은 [최근 10분 이내에 3회 이상 요청한 핸드폰 번호인지 체크]하여 10분 이내에 3회 이상 요청을 했다면 잠금 처리를 할 수 있도록 하는 것입니다. 따라서 다음과 같은 SQL 구문을 이용하면 좋습니다. (MySQL 기준)
SELECT COUNT(*) as cnt
FROM {SMS 인증 테이블}
WHERE sms_date > date_sub(now(), interval 600 second)
AND member_tel = {핸드폰 번호};
위 소스코드를 이용하면 최근 10분 이내에 SMS 인증 요청이 몇 번 발생했는지 확인할 수 있습니다. 그래서 컨트롤러(Controller)에서는 다음과 같은 형태로 처리할 수 있습니다. (PHP, REST API 기준)
$member_tel = $this->input_check('member_tel');
$result = $this->model_member->check_sms_repeat($member_tel );
if($result >= 3) {
$this->output->set_status_header(503); // 최근 10분 이내에 3회 이상 요청하여 잠금 처리 된 핸드폰 번호입니다.
exit;
}
'시큐어 코딩(Secure Coding)' 카테고리의 다른 글
ModSecurity 2를 이용해 Apache 로그 관리 및 방화벽 설정하기 (0) | 2019.04.16 |
---|---|
우분투(Ubuntu) 리눅스 서버에서 IPtables를 활용해 방화벽 설정하기 (0) | 2019.03.26 |
우분투(Ubuntu) 리눅스 서버에서 UFW를 활용해 방화벽 설정하기 (0) | 2019.03.26 |