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 요청을 처리합니다. 그러나, 두 클래스 사이에는 다음과 같은 주요 차이점이 있습니다.
- 권한 부여 클래스 첫 번째 클래스에서는 'permission_classes' 변수를 사용하여 권한을 부여하고 'IsAuthenticatedOrReadOnly' 클래스를 지정하여 인증되지 않은 사용자도 읽기 권한을 부여합니다. 두 번째 클래스에서는 권한 부여 클래스를 지정하지 않았으며, 대신 POST 요청을 수신하기 전에 사용자가 인증되었는지 확인합니다.
- 직렬화 및 유효성 검사 두 클래스는 모두 'TweetSerializer'를 사용하여 Tweet 객체를 직렬화합니다. 그러나 두 번째 클래스에서는 POST 요청에 대해 'TweetDetailSerializer'를 사용합니다. 또한, 두 번째 클래스에서는 직렬화된 데이터가 유효한지 검사하기 위해 'is_valid()' 메소드를 직접 호출하고, 첫 번째 클래스에서는 'is_valid()' 메소드가 Response 객체 내부에서 자동으로 호출됩니다.
- 인증 오류 처리 두 번째 클래스에서는 인증되지 않은 사용자가 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 |