Django REST framework의 APIView를 사용하여 보안성을 높이는 방법

2023. 3. 27. 17:26개발/토막난 상식

반응형
class Tweets(APIView):
    permission_classes = [IsAuthenticatedOrReadOnly]
  
    def get(self, request):
        tweets = Tweet.objects.all()
        serializer = TweetSerializer(tweets, many=True)
        return Response(serializer.data)

    def post(self, request):
        serializer = TweetSerializer(data=request.data)
        if serializer.is_valid():
            tweet = serializer.save()
            serializer = TweetSerializer(tweet)
            return Response(serializer.data)
        else:
            return Response(serializer.errors)

코드 예시 1

 

class Tweets(APIView):

  def get(self, request):
    tweets = Tweet.objects.all()
    serializer = TweetSerializer(tweets, many=True)
    return Response(serializer.data)

  def post(self, request):
    if request.user.is_authenticated:
      serializer = TweetDetailSerializer(data = request.data)
      if serializer.is_valid():
        serializer.save()
        return Response(serializer.data)
      return Response(serializer.errors)
    
    else:
          raise NotAuthenticated

코드예시 2

 

 

 

두 개의 클래스는 Django REST framework의 APIView를 사용하여 구현되었으며, 모두 'tweets'라는 API endpoint에 대한 GET 및 POST 요청을 처리합니다. 그러나, 두 클래스 사이에는 다음과 같은 주요 차이점이 있습니다.

  1. 권한 부여 클래스 첫 번째 클래스에서는 'permission_classes' 변수를 사용하여 권한을 부여하고 'IsAuthenticatedOrReadOnly' 클래스를 지정하여 인증되지 않은 사용자도 읽기 권한을 부여합니다. 두 번째 클래스에서는 권한 부여 클래스를 지정하지 않았으며, 대신 POST 요청을 수신하기 전에 사용자가 인증되었는지 확인합니다.
  2. 직렬화 및 유효성 검사 두 클래스는 모두 'TweetSerializer'를 사용하여 Tweet 객체를 직렬화합니다. 그러나 두 번째 클래스에서는 POST 요청에 대해 'TweetDetailSerializer'를 사용합니다. 또한, 두 번째 클래스에서는 직렬화된 데이터가 유효한지 검사하기 위해 'is_valid()' 메소드를 직접 호출하고, 첫 번째 클래스에서는 'is_valid()' 메소드가 Response 객체 내부에서 자동으로 호출됩니다.
  3. 인증 오류 처리 두 번째 클래스에서는 인증되지 않은 사용자가 POST 요청을 시도하면 'NotAuthenticated' 예외를 발생시키고 해당 오류를 클라이언트에 반환합니다. 그러나 첫 번째 클래스에서는 인증되지 않은 사용자도 POST 요청을 보낼 수 있으며, 이 경우에는 'serializer.errors'를 반환하여 요청이 실패했음을 클라이언트에 알립니다.

따라서, 두 클래스는 권한 부여, 직렬화 및 유효성 검사, 인증 오류 처리 등에서 다소 다른 구현을 갖고 있습니다. 두 클래스 중 어느 것을 사용해야 하는지는 요구 사항에 따라 다를 수 있으며, 보안 측면에서 두 번째 클래스의 구현이 더 안전하다고 할 수 있습니다.

 

 

보안 측면에서 두 번째 클래스의 구현이 더 안전하다고 할 수 있습니다.

반응형

'개발 > 토막난 상식' 카테고리의 다른 글

Attempted import error: 'theme' is not exported from 'antd'.  (0) 2023.03.28
link a  (0) 2023.03.28
django 에서 APIView 와 serializers 를 사용하는 방법  (0) 2023.03.27
트랜잭션  (0) 2023.03.27
Array Method every some  (0) 2023.03.27