본문 바로가기
IT관련/Python

[Django]drf의 IsAuthenticatedOrReadOnly와 IsAuthenticated의 차이점에 대해서 알아봅시다 !

728x90

안녕하세요 !!! 

DRF(Django Rest Framework)를 다하보면 IsAuthenticatedOrReadOnlyIsAuthenticated이 정말 많이 나옵니다 !!! 

그럼 왜 쓰는지와 어떨 때 적절히 사용하면 좋은지 알아보겠습니다 ! 

 

IsAuthenticated 이란?

말 그대로 권한 문제입니다 !! 가장 기본적인 권한으로 인증 된 사용자에게는 액세스를 허용하지만 인증되지 않는 사용자에게 대해선 허락하지 않습니다 !!! 

DRF에서  permissions.py를 보시면, SAFE_METHODS가 정의되어 있습니다!

'GET', 'HEAD', 'OPTINS' 라고 정의되어 있습니다. 특히 get은 read-only request로 잘 알려진 메서드입니다.

하지만 「IsAuthenticated」을 써주면 get이던 post던, put, delete의 관계없이 전부다 인증 된 사용자에게만 액세스를 허용합니다 ! 

한번 해볼까요? 

 

from rest_framework.permissions import IsAuthenticated

class Me(APIView):

    permission_classes = [IsAuthenticated]

    def get(self, request):
        user = request.user
        serializer = serializers.PrivateUserSerializer(user)
        return Response(serializer.data)

위와 같이 써주면 됩니다 ! 

permission_classes를 써줘서 [IsAuthenticated]를 써주면 끝입니다 ! 

그럼 한번 화면을 봐보겠습니다 ! 

처음에는 로그인을 하지 않았습니다 !!

그러면 위에 처럼 그냥 403의 권한 에러가 뜹니다 !!! 

또한 아래처럼 쿠키에도 아무값도 없습니다 !!! 

그러면 이제 한번 로그인을 해보고 화면에서 확인해보겠습니다 ! ( 로그인은 어드민 패널에서 로그인을 할것입니다 ! )

 

로그인 후 ~ 

짠 ! 성공했습니다 !!! 또한 데이터도 원하는 값들을 잘 가지고 오죠 !

그럼으로써 ! 우리는 「IsAuthenticated」권한에 대해서 배워본것은 꼭 로그인 후에 공개해야하는 것들에 대해서 써야하는것을 알 수 있습니다 ! ( 주로 개인정보라던가 자신만이 가지고 있는 물건, 마이페이지에 관해서 많이 쓰입니다 ) 

 

IsAuthenticatedOrReadOnly

 

자 그러면 다음 「IsAuthenticatedOrReadOnly」권한에 대해서 알아보겠습니다 ! 

이 것도 그대로 권한 문제입니다 !! 가장 기본적인 권한으로 인증 된 사용자에게는 액세스를 허용하지만 인증되지 않는 사용자에게 대해선 허락하지 않습니다 !!! 여기까진 같습니다 ! 

만약에 한 클래스에서 get, post, put, delete를 쓰는데 ! get은 인증되지 않는 사람도 보고싶게 하고싶을때가 있습니다 !!! 

나머지에게는 꼭 인증 된 사람만 건드리게 하고싶다 ! 라고 하고싶을 때가 있습니다 ! 

실제로도 정말 빈번히 사용됩니다 ! 

이 권한은 API에서 익명 사용자에게 읽기 권한을 허용하고 인증된 사용자에게 쓰기 권한만 허용하려는 경우에 적합합니다.

즉 「IsAuthenticatedOrReadOnly」을 써주면 get은 할 수 있습니다 ! 

하지만 post던, put, delete의 관계없이 전부다 인증 된 사용자에게만 액세스를 허용합니다 ! 

한번 해볼까요?

 

from rest_framework.permissions import IsAuthenticatedOrReadOnly

class Rooms(APIView):
    
    permission_classes = [IsAuthenticatedOrReadOnly]
    
    def get(self, request):
        all_rooms = Room.objects.all()[1:3]
        serializer = serializers.RoomListSerializer(
            all_rooms, 
            many=True,
            context={"request": request}
        )
        return Response(serializer.data)

자 이렇게 하고 화면을 봐볼까요??? 인증되지 않는 상태로요 !

데이터가 많아서 all[1:3]으로 했습니다 ! 스샷이 잘 안찍혀서요 ㅜㅜ 

위에 사진처럼 인증되지 않는 상태에서도 get을 불러 올 수 있습니다 !!! 

참고로 저는 rooms를 불러오는 class에서 post도 있는데 그런것도 안보입니다 ! (delete도 쓰면 안보이니 해보세요 ! )

정말?? 이라고 생각하시는 분들이 있을수도 있으니 

인증을 한번 해보고 화면을 다시 봐봅시다 ^^  

따라서 ! 

IsAuthenticatedOrReadOnly」이 방식의 인증방법은 인증하지 않는 사람도

처음부터 화면에 뿌려주고싶은 상품이라던가 게시판 등등 이런곳에 많이 쓰입니다 !!! 

 

정리

 

 IsAuthenticated

get, post, put, delete 모든 메서드에서 인증 된 사람만 액세스가 가능함
인증이 꼭 필요한 상황
로그인 후 보여지는것들에 주로 사용함(마이페이지라던가 결제내역페이지등등)

IsAuthenticatedOrReadOnly

get은 인증을 안해도 액세스가 가능함
하지만 post, put, delete 메서드에서 인증 된 사람만 액세스가 가능함
인증되지 않는 사람에게 읽기 권한은 주는데 쓰기 권한은 주지 않을 때
상품, 게시판등 처음부터 인증되지 않는 유저에게도 보여지고 싶은 상황에 대해서 많이 사용함

 

자 ! 오늘은  IsAuthenticated」와 IsAuthenticatedOrReadOnly」의 사용법과 어떨 때 사용하면 좋은지에 대해서 알아봤습니다 !!! 

충분히 이해 하셨을거라고 믿습니다 ! 혹시라도 모르거나 이상한게 있으면 댓글로 남겨주세요 !

읽어주셔서 감사합니다 ! 

728x90