permission_classes
DRF는 API View에서 요청을 처리하기 전에 실행되는 인증 및 권한 검사를 위해 permission_classes 속성을 제공한다. 보안을 위해 클라이언트의 요청이 특정 권한을 가지고 있는지 확인하는 데 사용되며 APIView 클래스에서 상속받아 사용할 수 있다.
클래스의 종류
DRF는 몇가지 기본 클래스를 제공하고 직접 커스텀 하여 권한 클래스 사용할 수도 있다.
- AllowAny : 모든 요청에 대해 인증 없이 접근을 허용
- IsAuthenticated : 인증된 사용자만 접근을 허용
- IsAdminUser : 관리자 권한을 가진 사용자만 접근을 허용
- IsAuthenticatedOrReadOnly : 인증된 사용자는 모든 HTTP 메소드를 사용할 수 있지만, 인증되지 않은 사용자는 GET, HEAD, OPTIONS 메소드에만 접근을 허용
- DjangoModelPermissions : Django의 모델 권한을 기반으로 인증된 사용자만 접근을 허용
- DjangoModelPermissionsOrAnonReadOnly : 인증된 사용자는 Django의 모델 권한을 기반으로 모든 HTTP 메소드를 사용할 수 있지만, 인증되지 않은 사용자는 GET, HEAD, OPTIONS 메소드에만 접근을 허용
- DjangoObjectPermissions : Django의 객체 권한을 기반으로 인증된 사용자만 접근을 허용
- CustomPermission : 직접 만들어서 사용 가능한 권한 클래스
from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView
class ExampleView(APIView):
permission_classes = [IsAuthenticated]
def get(self, request, format=None):
content = {'message': 'This is an example'}
return Response(content)
👉🏻 IsAuthenticated 클래스를 permission_classes에 추가하면, ExampleView에 접근하려는 사용자가 인증되었는지 확인하고, 인증되지 않은 경우에는 접근을 거부하며 HTTP 401 Unauthorized 오류를 반환한다.
CustomPermission
위에서 언급햇지만 커스텀 권한 클래스를 추가할 수 있다. CustomPermission는 DRF에서 기본적으로 제공하는 BasePermission 클래스를 상속받아서 만들 수 있다.
has_permission()
모든 HTTP 요청에 대해 호출되는 권한 로직을 작성 메서드로 오버라이딩하여 사용자 정의 권한 로직을 작성할 수 있다. has_permission() 메서드는 request 객체를 받아서, 해당 요청에 대한 권한 여부를 boolean 값으로 반환한다. 만약 해당 요청에 대해 권한이 있는 경우 True,권한이 없는 경우 False를 반환한다.
- request : request object는 HTTP 요청에 대한 정보를 포함하고 있다.request.user 속성을 사용하여 요청한 사용자를 나타내는 Django User 모델 객체를 가져올 수 있다.
- view : 요청을 처리하는 API view 클래스이다. view 객체를 사용하여 현재 뷰에서 처리되는 API view 클래스의 속성에 접근할 수 있다.
from rest_framework import permissions
class IsStaffUser(permissions.BasePermission):
def has_permission(self, request, view):
if request.user.is_staff:
return True
else:
return False
👉🏻 스태프 권한을 가지고 있는 경우에만 접근을 허용하는 예시 커스텀 권한 클래스를 구현해보았다. BasePermission 클래스를 상속받아 has_object_permission 메서드를 오버라이드하여 사용자의 스태프 권한을 확인하는 로직이다. 이 커스텀 클래스는 permission_class 리스트에 추가해 사용할 수 있다.
has_object_permission()
사용자가 요청한 객체에 대한 권한을 가지고 있는지 여부를 결정해 사용자에게 권한이 허용되면 True, 아니면 False를 반환하는 메서드이다.
- request: request object는 HTTP 요청에 대한 정보를 포함하고 있다.request.user 속성을 사용하여 요청한 사용자를 나타내는 Django User 모델 객체를 가져올 수 있다.
- view: 요청을 처리하는 API view 클래스이다. view 객체를 사용하여 현재 뷰에서 처리되는 API view 클래스의 속성에 접근할 수 있다.
- obj: 권한을 확인해야 하는 객체이다.
from rest_framework import permissions
class IsTargetUser(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
if request.user == obj or request.user.is_staff:
return True
else:
return False
👉🏻 request user가 해당 객체의 소유자인 경우에만 권한을 허용하는 예시 커스텀 클래스이다.
두가지 메서드의 차이
has_permission() 메서드는 API View의 사용자의 모든 요청,전체 인스턴스에 대한 권한을 검사하는 데 사용되고 has_object_permission() 메서드는 특정 개체에 대한 권한을 확인하는 데 사용된다.
has_permission() 메서드는 request 와 view를 매개변수로 받아 해당 요청에 대한 권한을 검사한다.
ex.)사용자가 API View를 호출할 수 있는지 여부 결정, 요청된 데이터를 조회할 수 있는지 여부 결정
has_object_permission() 메서드는 has_permission() 메서드와 유사하지만, request 와 view 뿐 아니라 obj도 매개변수로 받는다. ex.) 특정 인스턴스를 수정할 수 있는지 여부 결정, 특정 인스턴스를 삭제할 수 있는지 여부 결정
'Dev. > Django.' 카테고리의 다른 글
[DRF] Custom Permission- URL based permission (0) | 2023.04.21 |
---|---|
[DRF] Serialization / Deserialization 동작 변경 - to_internal_value와 to_representation (0) | 2023.04.17 |
[Django] ManyToMany 모델 인스턴스 생성 및 삭제하기- add, clear (0) | 2023.04.14 |
[Django] Django에서 fixture 사용 (0) | 2023.03.31 |
[Django] JSON WebToken - Simple JWT (0) | 2023.03.30 |