안녕하세요! 👋 OWASP Top 10 정복 시리즈, 오늘은 2017년의 "Broken Authentication"에서 이름이 더 포괄적으로 변경된 A07:2021-식별 및 인증 실패(Identification and Authentication Failures)에 대해 알아보겠습니다.
여러분의 집 현관문이 튼튼한 자물쇠로 잠겨있어도, 그 자물쇠가 너무 흔하거나(쉬운 비밀번호), 열쇠 꾸러미가 아무에게나 노출되어 있다면 어떻게 될까요? 😱 이처럼 '식별 및 인증 실패'는 사용자가 누구인지 확인하는 과정(식별)과 그 신원을 검증하는 과정(인증)에 허점이 있어 발생하는 취약점입니다. 우리 서비스의 첫 관문인 로그인 시스템이 얼마나 튼튼한지 지금부터 함께 점검해 보시죠! 🕵️♀️

🤔 식별 및 인증 실패? 그게 뭔가요?
"당신이 누구인지, 그리고 당신이 맞는지 확인하는 과정에서 문제가 생기는 것" 👥➡️❓
식별 및 인증 실패는 애플리케이션이 사용자의 신원(Identification)을 제대로 확인하지 못하거나, 신원을 검증(Authentication)하는 메커니즘이 약하거나 잘못 구현되어 발생하는 보안 문제입니다. 쉽게 말해, 시스템이 "로그인하려는 사람이 정말 그 사람인지" 확신하지 못하게 되는 모든 상황을 포함합니다.
이 취약점은 공격자가 합법적인 사용자의 계정(ID, 비밀번호)을 탈취하거나, 아예 로그인 과정을 우회하여 시스템에 접근하도록 허용할 수 있기 때문에 매우 치명적입니다. 일단 계정이 탈취되면, 공격자는 해당 사용자의 권한으로 모든 작업을 수행할 수 있죠.
🕵️♂️ 흔하게 발견되는 식별 및 인증 실패 사례들
어떤 경우에 식별 및 인증이 '실패'했다고 말할 수 있을까요?
1. 약하거나 예측 가능한 비밀번호 🔑
가장 기본적인, 그리고 가장 흔한 문제입니다.
- 문제점: 서비스에서 사용자에게 password123, 123456, qwerty 등과 같이 쉽거나 흔한 비밀번호를 허용하는 경우입니다. 공격자는 사전 공격(Dictionary Attack)이나 무차별 대입 공격(Brute-force Attack)을 통해 이러한 비밀번호를 쉽게 추측하고 계정을 탈취할 수 있습니다.
- 사례: 비밀번호 최소 길이, 대소문자, 숫자, 특수문자 조합 등의 복잡도 정책이 없거나 너무 약한 경우.
2. 부적절한 비밀번호 재설정/복구 메커니즘 🔄
비밀번호 분실 시의 편리함이 때로는 독이 됩니다.
- 문제점: "비밀번호 힌트" 질문이 너무 쉬워서(예: '어머니 성함은?'), 공격자가 SNS 등 공개된 정보를 통해 답변을 유추하여 계정 탈취를 시도할 수 있습니다. 또는 비밀번호 재설정 링크가 너무 쉽게 예측 가능하거나, 유효 기간이 없는 경우도 있습니다.
- 사례: 비밀번호 재설정 시 사용자 ID만으로 재설정 이메일을 보낼 수 있는데, 이메일 주소 확인 없이 단순히 '성공' 메시지만 보여주는 경우. (계정 존재 여부 노출)
3. 세션 관리 취약점 👻
로그인 후에도 안전해야 합니다.
- 문제점: 로그인에 성공하면 사용자에게 세션 토큰이 발급되는데, 이 토큰이 짧거나 예측 가능하여 공격자가 탈취하거나 위조할 수 있는 경우입니다. 또는 로그아웃 시 세션이 제대로 무효화되지 않아, 공격자가 탈취된 세션으로 계속 로그인 상태를 유지할 수 있는 경우도 있습니다.
- 사례: 세션 ID가 URL에 노출되거나, HTTP Only 및 Secure 속성이 설정되지 않아 XSS 공격 등으로 세션 쿠키가 탈취되는 경우.
4. 다단계 인증(MFA)의 부재 또는 취약성 📱
하나의 열쇠만으로는 부족합니다.
- 문제점: 중요한 계정에 다단계 인증(Multi-Factor Authentication, MFA)이 적용되지 않았거나, 적용되었더라도 MFA 코드를 무제한으로 시도할 수 있는 경우입니다.
- 사례: SMS로 2차 인증 코드를 보내는 기능이 있지만, 코드를 여러 번 틀려도 계속 시도할 수 있어 무차별 대입 공격에 취약한 경우.
5. 계정 잠금 및 속도 제한 부재 🚫
무한 시도는 언젠가 성공합니다.
- 문제점: 로그인 시도 실패 시 계정을 잠그거나, 특정 시간 동안 로그인 시도 횟수를 제한하는 기능(Rate Limiting)이 없는 경우입니다. 공격자는 이를 이용해 무한정 로그인 정보를 추측하거나, 존재하는 계정을 알아낼 수 있습니다.
- 사례: 로그인 페이지에서 특정 ID에 대해 비밀번호를 100만 번 시도해도 계정이 잠기지 않거나 IP 주소가 차단되지 않는 경우.
🛡️ 어떻게 막을 수 있을까요? (방어 방법)
식별 및 인증 실패는 서비스의 첫 관문이므로, 가장 견고하게 구축되어야 합니다.
- 강력한 비밀번호 정책 강제 🔐:
- 최소 길이, 대소문자, 숫자, 특수문자 조합 등 복잡도 요구사항을 설정하고 강제해야 합니다.
- 이미 유출된 비밀번호 목록(HaveIBeenPwned API 등)과 대조하여 사용을 금지해야 합니다.
- 비밀번호는 반드시 솔트(Salt)를 이용한 강력한 해싱 알고리즘(Bcrypt, Argon2 등)으로 저장해야 합니다.
- 다단계 인증(MFA) 도입 📱✔️: 가능한 모든 중요 계정에 다단계 인증을 의무화하거나 강력하게 권장해야 합니다. (예: OTP, SMS 인증, 생체 인식)
- 계정 잠금 및 속도 제한 적용 🚫⏰:
- 일정 횟수 이상의 로그인 시도 실패 시 계정을 잠그거나, 일정 시간 동안 해당 IP 주소/사용자의 로그인 시도를 제한해야 합니다.
- 사용자 ID가 존재하지 않는다는 등의 정보 노출을 피하기 위해 로그인 실패 시 항상 일반적인 오류 메시지("아이디 또는 비밀번호가 올바르지 않습니다.")를 보여주세요.
- 안전한 세션 관리 🍪:
- 세션 ID는 예측 불가능하고 무작위성이 높은 값을 사용해야 합니다.
- 세션 쿠키에 Secure, HttpOnly 플래그를 설정하여 XSS 등으로 인한 탈취를 방지합니다.
- 로그아웃 시 세션을 즉시 무효화하고, 세션 만료 시간을 적절하게 설정해야 합니다.
- 비밀번호 재설정/복구 메커니즘 강화 🔒➡️✉️:
- 재설정 링크는 일회용으로, 짧은 유효 시간을 가져야 합니다.
- 사용자가 쉽게 추측할 수 있는 "보안 질문"은 피해야 합니다.
- 이메일 또는 SMS를 통한 인증 시, 무제한 시도를 막는 속도 제한을 적용해야 합니다.
✨ 마치며
식별 및 인증 실패는 모든 공격의 시작점이 될 수 있는 매우 중요한 취약점입니다. 우리의 서비스가 아무리 훌륭해도, 첫 관문이 허술하면 모든 것이 무용지물이 됩니다. 개발 초기 단계부터 강력한 인증 메커니즘을 설계하고 구현하며, 지속적으로 점검하고 개선하는 것이 필수적입니다.
우리 서비스의 현관문을 튼튼하게 만들고, 열쇠 관리를 철저히 하여 해커의 침입을 막아냅시다! 🏡💪
태그: OWASP, A07, Authentication Failures, 식별, 인증, 비밀번호보안, MFA, 세션관리, 계정탈취
'일반IT > IT보안' 카테고리의 다른 글
| 🛠️ 깨진 조각은 전체를 무너뜨린다! OWASP 8위, 소프트웨어 및 데이터 무결성 실패 (0) | 2025.10.02 |
|---|---|
| 🚨 당신의 계정은 안녕하십니까? 크리덴셜 스터핑의 모든 것! (0) | 2025.10.02 |
| 🦠 내 서비스에 숨어있는 시한폭탄! OWASP 6위, 취약하고 오래된 컴포넌트 (0) | 2025.09.30 |
| 🚪 열려있는 뒷문, OWASP 5위 보안 설정 오류 (Security Misconfiguration) 파헤치기 (0) | 2025.09.30 |
| OWASP Top 10: A04:2021 안전하지 않은 설계(Insecure Design)와 DREAD 위협 평가 📊 심층 분석! (0) | 2025.09.29 |