1. 부적절한 인가의 위험성
CWE-285는 사용자가 시스템에 로그인(인증)은 성공했지만, 자신의 권한을 벗어난 자원이나 기능에 접근할 때 발생합니다. 예를 들어, 일반 사용자가 URL을 조작하여 관리자 페이지를 열거나, A 사용자가 B 사용자의 개인정보 수정 페이지 ID를 바꿔서 접속하는 행위가 이에 해당합니다. 이는 '수평적 권한 상승(Horizontal Privilege Escalation)'과 '수직적 권한 상승(Vertical Privilege Escalation)'을 유발하여 데이터 유출 및 파괴로 이어집니다.
2. 흔히 발생하는 취약한 패턴
가장 빈번한 실수는 "로그인만 되어 있으면 모든 기능을 써도 된다"고 가정하는 설계입니다.
• ID 기반 접근 제어 부재: my-page?userId=100 주소에서 숫자만 바꿔 다른 사람의 정보를 조회하는 경우.
• 기능별 권한 체크 누락: 게시판 읽기 권한은 있지만, 글 삭제 API 주소를 알아내어 직접 호출할 때 서버가 권한을 확인하지 않는 경우.
• 클라이언트 측 인가 의존: UI에서 관리자 메뉴만 숨기고, 실제 서버 API는 권한 검증 없이 열려 있는 경우.
3. 실무적 대응: 최소 권한의 원칙과 명시적 인가 검증
모든 자원 요청에 대해 서버 측에서 실시간 권한 검증이 이뤄져야 합니다.
• 최소 권한 원칙(Principle of Least Privilege): 사용자에게 업무 수행에 필요한 최소한의 권한만 부여하고, 나머지는 기본적으로 차단합니다.
• 역할 기반 접근 제어(RBAC) 및 속성 기반 접근 제어(ABAC): 사용자의 역할(Role)이나 자원의 소유주(Owner) 속성을 비교하여 인가 여부를 결정합니다.
• 데이터 소유권 검증: 정보를 수정하거나 삭제할 때, 현재 세션의 사용자가 해당 데이터의 실제 소유자인지 DB 쿼리 단계에서부터 검증(WHERE id = ? AND owner_id = ?)합니다.
4. CWE-285 대응 및 안전한 인가 검증 자바 코드 예시
코멘트: 인가는 "누구인가"를 묻는 것을 넘어 "그 일을 할 자격이 있는가"를 매번 확인하는 과정입니다. 사용자가 보낸 ID 값을 그대로 믿지 말고, 항상 서버 세션 정보와 비교하여 자원의 소유권을 대조하십시오. logger.debug()를 통해 권한 밖의 요청을 모니터링하되, UI 단의 통제보다는 서버 단의 철저한 인가 로직을 구축하는 것이 시큐어 코딩의 핵심입니다.
댓글 달기