📌 Django 템플릿과 View에서 권한 분기 처리 완전 정복

2025. 5. 8. 19:25·기술블로그-Django편

📌 Django 템플릿과 View에서 권한 분기 처리 완전 정복

Django에서 수정/삭제 버튼처럼 "권한에 따라 보이는 요소"를 구현할 때는 템플릿(UI) 과 View(서버 보안) 양쪽에서 모두 권한 체크를 해야 완벽합니다.


✅ 기본 구조 이해

구성 요소 위치 역할

템플릿 (.html) 클라이언트(UI) 버튼 표시 여부 결정 (UX 친화적)
View (views.py) 서버 실제 권한 확인 및 제한 (보안 핵심)

둘 중 하나만 해서는 불완전합니다. 둘 다 반드시 필요합니다.


💻 템플릿에서 권한 분기 처리

{% if request.user == blog.author or request.user.is_superuser %}
  <a href="{% url 'blog:update' blog.pk %}">수정</a>
  <form action="{% url 'blog:delete' blog.pk %}" method="POST">
    {% csrf_token %}
    <button type="submit">삭제</button>
  </form>
{% endif %}

✔️ 작동 방식

  • 로그인한 사용자가 글 작성자이거나 슈퍼유저일 때만 버튼 출력
  • 일반 사용자는 아예 버튼 자체가 안 보임
  • UX 개선에 필수적인 처리

🧠 View에서의 실질적 권한 제한

class BlogDeleteView(LoginRequiredMixin, DeleteView):
    model = Blog

    def get_queryset(self):
        queryset = super().get_queryset()
        if not self.request.user.is_superuser:
            queryset = queryset.filter(author=self.request.user)
        return queryset

✔️ 작동 방식

  • 슈퍼유저: 모든 글 삭제 가능
  • 일반 사용자: 본인 글만 삭제 가능
  • 쿼리셋에 포함되지 않은 객체에 접근 시 Http404 발생

🔐 왜 중요한가?

  • 누군가 URL만 바꿔서 다른 사람 글을 삭제하려고 해도 서버가 차단함

🔄 템플릿과 View의 연동 원리

둘 다 request.user 객체를 기준으로 판단합니다:

  • 템플릿은 버튼 노출 여부를 판단
  • View는 DB 필터링을 통해 진짜 권한을 판별

🔗 즉, 템플릿과 View는 동일한 사용자 정보(request.user) 를 기반으로 역할을 분담합니다.


📊 예시 비교 요약

사용자 템플릿에서 버튼 표시 View에서 삭제 가능 여부

작성자 본인 ✅ 표시됨 ✅ 가능
슈퍼유저 ✅ 표시됨 ✅ 가능
다른 일반 사용자 ❌ 안 보임 ❌ 삭제 시도 시 404 발생

💡 팁과 실수 방지

✅ 둘 다 처리해야 완벽

  • 템플릿만: 버튼은 안 보이지만 URL 직접 입력 시 삭제 시도 가능 → 위험
  • View만: 보안은 되지만 버튼이 떠 있다가 404 뜸 → UX 안 좋음

❌ 흔한 실수

  • request.user == blog.author 조건 누락
  • View에 get_queryset() 안 쓰고 권한 체크 안 함

✨ 마무리 요약

템플릿에서는 버튼을 감추고, View에서는 진짜로 막아야 안전하고 친절하다!

보안과 사용자 경험을 동시에 잡는 Django 권한 분기의 정석 구조, 반드시 익혀두세요 🔐💡

'기술블로그-Django편' 카테고리의 다른 글

📌 CI/CD란 무엇인가요?  (0) 2025.05.08
📌 Django에서 누락된 category 필드 일괄 업데이트하기 (default 적용)  (0) 2025.05.08
📌 Django 템플릿에서 FBV / CBV 네임스페이스에 따라 분기 처리하는 방법  (0) 2025.05.08
📌 Django에서 reverse와 reverse_lazy 차이 완전 정복  (0) 2025.05.08
📌 Python에서 :와 =는 어떻게 다를까? – 명확한 규칙과 사용법 정리  (0) 2025.05.08
'기술블로그-Django편' 카테고리의 다른 글
  • 📌 CI/CD란 무엇인가요?
  • 📌 Django에서 누락된 category 필드 일괄 업데이트하기 (default 적용)
  • 📌 Django 템플릿에서 FBV / CBV 네임스페이스에 따라 분기 처리하는 방법
  • 📌 Django에서 reverse와 reverse_lazy 차이 완전 정복
Chansman
Chansman
안녕하세요! 코딩을 시작한 지 얼마 되지 않은 초보 개발자 찬스맨입니다. 이 블로그는 제 학습 기록을 남기고, 다양한 코딩 실습을 통해 성장하는 과정을 공유하려고 합니다. 초보자의 눈높이에 맞춘 실습과 팁, 그리고 개발하면서 겪은 어려움과 해결 과정을 솔직하게 풀어내려 합니다. 함께 성장하는 개발자 커뮤니티가 되기를 바랍니다.
  • Chansman
    찬스맨의 프로그래밍 스토리
    Chansman
  • 전체
    오늘
    어제
    • 분류 전체보기 (787) N
      • Python (32)
      • 프로젝트 (110) N
      • 과제 (25)
      • Database (40)
      • 멘토링 (11)
      • 특강 (37)
      • 기술블로그 (41)
      • 기술블로그-Fastapi편 (33)
      • 기술블로그-Django편 (153)
      • 기술블로그-Flask편 (36)
      • AI 분석 (5)
      • HTML & CSS (31)
      • JavaScript (17)
      • AWS_Cloud (21)
      • 웹스크래핑과 데이터 수집 (14)
      • Flask (42)
      • Django (77)
      • Fastapi (16)
      • 연예 (14)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    americaparty
    bts
    homebartrend
    livebroadcast
    life reflection
    smartphonedurability
    college reunions
    self-growth
    titaniumcase
    RM
    lawsuitculture
    travel ban
    chatgpterror
    trumpmuskclash
    뷔
    btsreunion
    btscomeback
    newpoliticalparty
    urbantrends
    americanlaw
    btsjungkook
    youngprofessionals
    global politics
    chinanightlife
    remittance
    btsdischarge
    basalcellcarcinoma
    gpterror
    hotcoffeecase
    classaction
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Chansman
📌 Django 템플릿과 View에서 권한 분기 처리 완전 정복
상단으로

티스토리툴바