Django Rest Framework에서 사용자에게 레코드 매핑하기
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
웹 개발
대상자
- 대상자: Django Rest Framework(DRF)를 사용하는 백엔드 개발자
- 난이도: 중급(사용자 권한 관리 및 쿼리셋 필터링 기초 지식 필요)
핵심 요약
- ForeignKey 사용:
User
모델과 연결하여 레코드 소유자를 명확히 정의 (models.ForeignKey(User, on_delete=models.CASCADE)
) - 쿼리셋 필터링:
self.request.user
를 사용해 사용자별 데이터 접근 제한 (return Task.objects.filter(user=self.request.user)
) - 권한 처리 강화:
IsAuthenticated
및 커스텀 권한(IsOwnerOrReadOnly
) 적용으로 보안 강화
섹션별 세부 요약
1. 문제 정의: 사용자 데이터 유출 방지
- 기본 설정의 위험성: 인증된 사용자가 모든 레코드에 접근 가능
- 필요한 해결책:
- 사용자 인증 시 자동으로 레코드 할당
- 사용자별 쿼리셋 필터링
- 비인가 접근 차단
2. 모델 정의: 사용자와 레코드 연결
- 필수 필드:
user
필드를ForeignKey
로 정의 (models.ForeignKey(User, on_delete=models.CASCADE)
) - 예시 코드:
```python
class Task(models.Model):
title = models.CharField(max_length=255)
user = models.ForeignKey(User, on_delete=models.CASCADE)
```
3. 뷰셋 구현: 사용자별 데이터 제한
- 쿼리셋 필터링:
get_queryset()
메서드에서self.request.user
사용 - 레코드 생성 시 사용자 할당:
perform_create()
메서드에서serializer.save(user=self.request.user)
- 코드 예시:
```python
class TaskViewSet(viewsets.ModelViewSet):
def get_queryset(self):
return Task.objects.filter(user=self.request.user)
def perform_create(self, serializer):
serializer.save(user=self.request.user)
```
4. 권한 설정: 보안 강화
- 기본 권한:
IsAuthenticated
적용 (permission_classes = [IsAuthenticated]
) - 고급 권한:
IsOwnerOrReadOnly
커스텀 클래스로 소유자만 수정 허용 - 추가 기능:
- 팀/그룹 기반 접근 제어 구현
- Django 신호(signals)로 자동화 로직 추가
5. 고급 팁: 확장성 및 보안
- 권한 확장:
IsOwnerOrReadOnly
클래스로 작성자만 수정 가능 - 보안 강화: Django signals로 복잡한 비즈니스 로직 추가
- 예시:
```python
from rest_framework.permissions import BasePermission
class IsOwnerOrReadOnly(BasePermission):
def has_object_permission(self, request, view, obj):
if request.method in ['GET', 'HEAD', 'OPTIONS']:
return True
return obj.user == request.user
```
결론
- 핵심 팁:
ForeignKey
로 사용자 연결,get_queryset()
과perform_create()
활용,IsAuthenticated
및 커스텀 권한 적용 - 실무 적용 예시:
TaskViewSet
에서 사용자별 데이터 필터링 및 생성 시 자동 할당 - 확장성: 팀 기반 접근 제어, Django signals 활용으로 보안 및 자동화 강화