1. 적절한 인증 없는 중요기능 허용의 위험성
CWE-306은 계좌 이체, 개인정보 수정, 시스템 설정 변경, 관리자 페이지 접근 등 보안상 민감한 기능을 실행할 때 사용자의 신원을 확인하는 절차(인증)가 아예 없거나 불충분할 때 발생합니다. 공격자는 로그인하지 않은 상태에서 해당 기능의 URL을 직접 입력(Direct Object Reference)하거나, API를 호출하여 타인의 정보를 가로채고 시스템을 조작할 수 있습니다. 이는 시스템의 기밀성과 무결성을 한꺼번에 무너뜨리는 치명적인 설계 결함입니다.
2. 흔히 발생하는 취약한 패턴
가장 대표적인 사례는 특정 페이지가 "눈에 보이지 않는다"는 이유로 보안 처리를 생략하는 경우입니다.
• 관리자 기능 노출: admin_delete_user.do와 같은 관리자 전용 URL이 별도의 로그인 체크 없이 접근 가능한 경우.
• 민감 로직 인증 누락: 결제 단계나 비밀번호 변경 단계에서 세션 유효성을 다시 확인하지 않는 경우.
• 모바일/API 사각지대: 웹 페이지에는 인증을 적용했으나, 동일한 기능을 수행하는 모바일 API 서버에는 인증 필터를 누락하는 경우.
3. 실무적 대응: 중앙 집중식 인증 필터와 재인증 도입
보안 결정은 각 페이지가 아닌 시스템 전체의 진입점에서 강제되어야 합니다.
• 인증 필터(Interceptor/Filter) 적용: Spring Security나 서블릿 필터를 사용하여 모든 보호 자원에 대해 인증된 세션이 있는지 전역적으로 검사합니다.
• 중요 기능 재인증(Step-up Authentication): 일반적인 로그인 상태더라도 결제나 개인정보 변경과 같은 고위험 작업 직전에는 비밀번호 재입력이나 OTP 인증을 추가로 요구합니다.
• 화이트리스트 기반 접근 제어: 인증이 필요 없는 페이지(로그인, 메인 등)만 명시적으로 허용하고, 나머지는 모두 인증을 거치도록 설정(Deny by Default)합니다.
4. CWE-306 대응 및 안전한 인증 검증 자바 코드 예시
코멘트: 시큐어 코딩의 핵심은 "인증은 옵션이 아닌 기본값(Default)"이어야 한다는 점입니다. 개발자가 실수로 특정 페이지의 인증 체크를 누락하더라도, 중앙 통제 장치(필터)가 이를 막아 세울 수 있는 구조를 갖춰야 합니다. logger.debug()를 통해 인증되지 않은 접근 시도를 철저히 기록하되, 금고의 대문을 열어두고 운에 맡기는 식의 설계를 배제하는 것이 가장 강력한 방어 전략입니다.
댓글 달기