📌 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 |