🛡️ 부적절한 인가 (Improper Authorization)

적절한 권한 검증 없이 중요한 기능을 수행할 수 있는 보안 취약점을 학습합니다. 사용자의 권한을 확인하지 않고 삭제, 수정 등의 작업을 허용하면 권한 없는 사용자가 시스템을 조작할 수 있습니다.

CWE-285: Improper Authorization
✅ 학습 진행도
  • 취약점 진단 완료
  • 세션에서 User 객체 가져오기
  • 권한 검증 함수 호출
  • 권한 없을 시 처리
  • 검증 통과
☕ Java 코드 에디터 취약한 코드
BoardController.java 💡 사용자 권한 검증 추가
private BoardDao boardDao;
String action = request.getParameter("action");
String contentId = request.getParameter("contentId");
//요청을 하는 사용자의 delete 작업 권한 확인 없이 수행하고 있어 안전하지 않다.
if (action != null && action.equals("delete")) {
    boardDao.delete(contentId);
}
💡 수정 가이드
Step 1: 세션에서 User 객체 가져오기
User user = (User)session.getAttribute("user");
Step 2: 권한 검증 조건 추가
if (action != null && action.equals("delete") && checkAccessControlList(user, action)) { // 권한이 있을 때만 실행 }
완성 예시:
private BoardDao boardDao; String action = request.getParameter("action"); String contentId = request.getParameter("contentId"); // 세션에 저장된 사용자 정보를 읽어온다. User user = (User)session.getAttribute("user"); // 사용자정보에 해당 사용자가 delete작업의 권한이 있는지 확인한 후 작업을 수행한다. if (action != null && action.equals("delete") && checkAccessControlList(user, action)) { boardDao.delete(contentId); }
📊 실시간 피드백
🎯 목표

게시물 삭제 시 사용자의 권한을 검증하세요.

  • User user = (User)session.getAttribute("user")
  • checkAccessControlList(user, action) 호출
  • 권한이 있을 때만 delete 수행
⚠️ 취약점

현재 코드는 권한 검증이 없습니다!

사용자의 delete 권한 확인 없이 삭제를 수행하므로, 권한 없는 사용자도 게시물을 삭제할 수 있습니다.

📖 부적절한 인가 취약점이란?

사용자의 권한을 적절히 검증하지 않아 권한 없는 작업을 수행할 수 있는 보안 취약점입니다.

  • 권한 검증 누락: ACL(Access Control List) 확인 없이 작업 수행
  • 수평적 권한 상승: 같은 권한 레벨의 다른 사용자 데이터 접근
  • 수직적 권한 상승: 일반 사용자가 관리자 기능 실행
🎯 공격 시나리오
  • 게시물 삭제: 읽기 권한만 있는 사용자가 타인의 게시물 삭제
  • 데이터 수정: 권한 없는 사용자가 중요 설정 변경
  • 기능 접근: 일반 사용자가 관리자 페이지 접근
🛡️ 방어 대책
  • 모든 중요 작업 전 권한 검증 (ACL, RBAC)
  • 세션의 사용자 정보로 권한 확인
  • 최소 권한 원칙 적용
  • 권한 검증 실패 시 적절한 에러 처리
✅ 학습 진행도
  • 취약점 진단 완료
  • login_required 데코레이터 추가
  • permission_required 데코레이터 추가
  • raise_exception=True 설정
  • 검증 통과
🐍 Python 코드 에디터 취약한 코드
views.py (Django) 💡 권한 검증 데코레이터 추가
from django.shortcuts import import render
from .model import Content

def delete_content(request):
    action = request.POST.get('action', "")
    content_id = request.POST.get('content_id', "")
    # 작업 요청을 하는 사용자의 권한 확인 없이 delete를 수행함
    if action is not None and action == 'delete':
        Content.objects.filter(id=content_id).delete()
        return render(request, '/success.html')
    else:
        return render(request, '/error.html', {'error':'잘못 권한이 없습니다.'})
💡 수정 가이드
Step 1: 필요한 데코레이터 import
from django.contrib.auth.decorators import login_required, permission_required
Step 2: @login_required 추가
@login_required def delete_content(request):
Step 3: @permission_required 추가
@login_required @permission_required('content.delete', raise_exception=True) def delete_content(request):
완성 예시:
from django.contrib.auth.decorators import login_required, permission_required from django.shortcuts import import render from .model import Content @login_required # 해당 기능을 수행할 권한이 있는지 확인 @permission_required('content.delete', raise_exception=True) def delete_content(request): action = request.POST.get('action', "") content_id = request.POST.get('content_id', "") if action is not None and action == 'delete': Content.objects.filter(id=content_id).delete() return render(request, '/success.html') else: return render(request, '/error.html', {'error':'삭제 실패'})
📊 실시간 피드백
🎯 목표

컨텐츠 삭제 시 사용자의 권한을 검증하세요.

  • @login_required 데코레이터 추가
  • @permission_required('content.delete') 추가
  • raise_exception=True 파라미터 설정
⚠️ 취약점

현재 코드는 권한 검증이 없습니다!

로그인 검증도, 삭제 권한 검증도 없어
누구나 컨텐츠를 삭제할 수 있습니다.

📖 Django 권한 시스템

Django는 권한 검증을 위한 데코레이터를 제공합니다.

  • @login_required: 로그인한 사용자만 접근
  • @permission_required: 특정 권한을 가진 사용자만 접근
  • raise_exception=True: 권한 없을 시 403 에러 발생
🎯 권한 체계
  • 앱명.동작: 'content.delete', 'content.add', 'content.change'
  • User permissions: user.has_perm('content.delete')
  • Group permissions: 그룹 단위 권한 관리