1. 취약한 비밀번호 허용의 위험성
CWE-521은 시스템이 비밀번호를 설정하거나 변경할 때, 충분히 복잡하지 않은 비밀번호를 허용할 때 발생합니다. 1234, password, qwerty와 같이 흔히 쓰이는 문자열이나 짧은 길이의 비밀번호는 공격자의 **사전 공격(Dictionary Attack)**이나 **무차별 대입 공격(Brute-force Attack)**에 매우 취약합니다. 특히 관리자 계정의 비밀번호가 취약할 경우, 단 한 번의 추측으로 시스템 전체의 제어권이 탈취될 수 있는 치명적인 위협입니다.
2. 흔히 발생하는 취약한 패턴
서비스 편의성을 우선시하여 보안 검증을 생략할 때 주로 나타납니다.
• 최소 길이 제한 부재: 4자리 혹은 6자리 정도의 짧은 숫자만으로 가입이 가능한 경우.
• 문자 조합 규칙 누락: 영문, 숫자, 특수문자의 혼용을 강제하지 않는 경우.
• 기본 비밀번호 방치: 초기 가입 시 부여된 임시 비밀번호를 변경하지 않고 계속 사용할 수 있게 허용하는 경우.
• 사용자 정보 포함: 아이디(ID)나 생년월일이 포함된 비밀번호를 허용하는 경우.
3. 실무적 대응: 강력한 패스워드 정책(Password Policy) 수립
애플리케이션 레벨에서 다음과 같은 검증 로직을 반드시 포함해야 합니다.
• 복잡성 요구사항 강제: 최소 8자 이상(권장 10자), 영문 대/소문자, 숫자, 특수문자 중 3종류 이상을 포함하도록 설정합니다.
• 사전 필터링: 널리 알려진 취약한 비밀번호 목록(Top 10,000 Passwords)과 대조하여 가입을 차단합니다.
• 개인정보 연관성 체크: 아이디와 동일하거나 유사한 문자열이 포함되었는지 검증합니다.
• 정규 표현식 활용: 서버 측 유효성 검사에서 정규식을 사용하여 엄격하게 필터링합니다.
4. CWE-521 대응 및 안전한 비밀번호 검증 자바 코드 예시
코멘트: 비밀번호 정책은 사용자에게는 조금 번거로울 수 있지만, 시스템을 지키는 가장 기본적이고 강력한 방어선입니다. 단순히 null 체크만 할 것이 아니라, 정규식을 통해 '강도 높은' 비밀번호를 유도하십시오. logger.debug()를 통해 검증 실패 사유를 기록하되, 사용자가 입력한 비밀번호 자체를 로그에 남기지 않도록 극도로 주의하는 것이 시큐어 코딩의 핵심입니다.
댓글 달기