안녕하세요! 👋 웹 보안에 관심 있는 모든 분을 환영합니다. 오늘은 2017년 OWASP Top 10에서 두 번째로 심각한 위협으로 꼽혔던 A2: 취약한 인증(Broken Authentication)에 대해 이야기 나눠보려고 합니다.

로그인, 세션 관리... 너무나 당연하게 사용하는 기능이지만, 이곳에 숨어있는 허점들이 어떻게 우리의 계정을 위험에 빠뜨리는지, 그리고 어떻게 막을 수 있는지 쉽고 상세하게 알려드릴게요! 🕵️♀️
🤔 취약한 인증(Broken Authentication)이란?
취약한 인증은 말 그대로 인증(Authentication)과 세션 관리(Session Management)와 관련된 기능이 잘못 구현되었을 때 발생하는 모든 보안 취약점을 의미합니다.
사용자가 정말 '그 사람'이 맞는지 확인하는 과정(인증)과, 로그인 상태를 안전하게 유지하는 과정(세션 관리)에 구멍이 뚫리면 공격자는 다른 사람의 계정을 훔치거나, 유출된 정보로 다른 시스템까지 접근하는 등 심각한 피해를 일으킬 수 있습니다. 🔑
마치 현관문의 자물쇠가 부실하거나, 열쇠를 아무 데나 복사할 수 있는 상황과 같아요. 아무리 집 안이 튼튼해도 문이 허술하면 소용없겠죠?
대표적인 취약한 인증 시나리오들
공격자들은 어떤 허점들을 노릴까요? 가장 흔한 사례들을 통해 알아보겠습니다.
1. 무차별 대입 공격 (Brute Force Attack)
가장 고전적이면서도 무식한(?) 방법입니다. 공격자는 가능한 모든 아이디와 비밀번호 조합을 자동으로 계속 시도해서 잠긴 문을 열려고 합니다.
- Credential Stuffing (크리덴셜 스터핑): 더 지능적인 형태의 무차별 대입 공격입니다. 공격자는 다른 곳에서 유출된 대량의 아이디/비밀번호 목록을 입수하여, 그 목록으로 다른 웹사이트에 로그인을 시도합니다. 많은 사용자가 여러 사이트에서 동일한 아이디와 비밀번호를 쓴다는 점을 악용하는 거죠! 😈
예시: A 쇼핑몰에서 유출된 내 아이디와 비밀번호 (my_id / my_password123)를 공격자가 얻었습니다. 그는 이 정보를 B은행, C포털 사이트에도 똑같이 입력해 봅니다. 만약 제가 비밀번호를 돌려썼다면... 끔찍한 결과가 초래되겠죠.
2. 허술한 비밀번호 정책 및 복구 기능
- 취약한 비밀번호 허용: 1234, password, abcde 와 같이 너무 간단한 비밀번호를 사용하도록 허용하는 경우.
- 안전하지 않은 비밀번호 복구: "당신의 출신 초등학교는?"과 같이 너무 뻔하고 유추하기 쉬운 질문으로 본인 확인을 하거나, 이메일로 임시 비밀번호를 평문으로 보내주는 경우. 공격자는 SNS 등을 통해 개인정보를 알아내 쉽게 계정을 탈취할 수 있습니다.
3. 세션 관리의 실패 (Session Management Failure)
로그인은 성공했는데, 그 '로그인 상태'를 제대로 관리하지 못해서 발생하는 문제입니다.
- 예측 가능한 세션 ID: 로그인에 성공하면 서버는 사용자에게 세션 ID라는 이름표를 발급해 줍니다. 브라우저는 이 이름표를 가지고 다니며 "나 로그인 한 사람이야!"라고 증명하죠. 그런데 이 세션 ID가 100, 101, 102처럼 너무 단순하고 예측하기 쉽다면, 공격자는 다른 사람의 세션 ID를 추측해서 계정을 가로챌 수 있습니다.
- 세션 타임아웃 미설정: 사용자가 로그아웃을 하지 않거나, 웹사이트를 그냥 닫았을 때 로그인 상태가 무한정 유지되는 경우. 공용 PC에서 로그아웃을 잊었다면 다음 사람이 내 계정을 그대로 사용할 수 있게 됩니다.
- 세션 고정 (Session Fixation): 공격자가 자신의 세션 ID를 미리 알아낸 뒤, 그 세션 ID를 URL에 담아 사용자에게 클릭하도록 유도합니다. 사용자가 그 링크를 통해 로그인하면, 공격자는 자신이 알고 있던 세션 ID로 해당 사용자의 계정에 접속할 수 있게 됩니다.
예시: https://example.com/login?SESSIONID=공격자가알고있는값
🛡️ 강력한 인증 시스템 구축하기 (대응 방안)
그렇다면 우리의 소중한 계정을 지키기 위해 어떻게 해야 할까요?
1. 다중 인증 (Multi-Factor Authentication, MFA) 도입
가장 강력하고 효과적인 방어책입니다. 🏆 비밀번호 외에 OTP(일회용 비밀번호), SMS 인증, 생체 인증(지문, 얼굴) 등 추가적인 인증 수단을 요구하는 것입니다. 비밀번호가 유출되더라도 공격자는 추가 인증을 통과할 수 없어 계정을 안전하게 지킬 수 있습니다.
2. 강력한 비밀번호 정책 강제
- 복잡성 요구: 길이(예: 10자 이상), 대/소문자, 숫자, 특수문자를 조합하도록 강제합니다.
- 자주 사용되는 비밀번호 금지: top 10,000개의 흔한 비밀번호 목록과 비교하여 사용하지 못하게 막습니다.
- 비밀번호 해시(Hash) 저장: 절대로 비밀번호를 평문으로 데이터베이스에 저장해서는 안 됩니다. bcrypt, scrypt, Argon2와 같은 강력한 해시 함수를 사용하여 암호화하고, **솔트(Salt)**를 추가하여 무지개 테이블 공격(Rainbow Table Attack)에 대비해야 합니다.
3. 로그인 시도 횟수 제한 및 계정 잠금
무차별 대입 공격을 막기 위해, 일정 횟수(예: 5회) 이상 로그인에 실패하면 해당 계정을 일정 시간 동안 잠그거나, CAPTCHA와 같은 사람 확인 절차를 요구해야 합니다.
4. 안전한 세션 관리
- 추측 불가능한 세션 ID: UUID나 암호학적으로 안전한 난수 생성기를 사용하여 길고 복잡한 세션 ID를 생성해야 합니다.
- 로그인 성공 시 세션 ID 재발급: 로그인에 성공하면, 이전의 세션 ID는 버리고 완전히 새로운 세션 ID를 발급하여 세션 고정 공격을 방어해야 합니다.
- 적절한 세션 타임아웃: 사용자가 활동이 없으면 일정 시간(예: 30분) 후에 세션을 자동으로 만료시켜야 합니다.
- 쿠키 보안 속성 설정: 세션 ID가 담긴 쿠키에 Secure (HTTPS에서만 전송), HttpOnly (JavaScript 접근 방지) 속성을 설정하여 탈취 위험을 줄여야 합니다.
2021년 OWASP Top 10에서는 A2: 취약한 인증이 A7: 식별 및 인증 실패(Identification and Authentication Failures)라는 이름으로 변경 및 확장되었습니다. 이는 인증 메커니즘 자체의 중요성이 여전히 크다는 것을 의미합니다.
사용자의 신원을 확인하는 '인증'은 모든 보안의 시작점입니다. 이 첫 단추를 잘못 끼우면 다른 보안 장치들이 모두 무용지물이 될 수 있다는 사실을 항상 기억하고, 안전한 인증 시스템을 구축하기 위해 노력해야 합니다.
'일반IT > IT보안' 카테고리의 다른 글
| 📜 오래된 문서의 역습! OWASP A4:2017 - XML 외부 개체(XXE) 파헤치기 (3) | 2025.08.16 |
|---|---|
| 🤫쉿! 당신의 정보가 새고 있어요: OWASP A3:2017 - 민감한 데이터 노출 (4) | 2025.08.16 |
| 😱 웹 애플리케이션의 오랜 숙적: OWASP A1:2017 - 인젝션(Injection) 파헤치기 (1) | 2025.08.16 |
| 🛡️ 웹 스캐너 완전 정복: 내 웹사이트의 숨은 보안 구멍 찾기 (4) | 2025.08.16 |
| 개발 속도를 높이는 비밀, 보안을 '왼쪽'으로 옮겨라! Shift Left Explained 🧐 (2) | 2025.08.15 |