안녕하세요 !!!
DRF(Django Rest Framework)를 다하보면 IsAuthenticatedOrReadOnly와 IsAuthenticated이 정말 많이 나옵니다 !!!
그럼 왜 쓰는지와 어떨 때 적절히 사용하면 좋은지 알아보겠습니다 !
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」의 사용법과 어떨 때 사용하면 좋은지에 대해서 알아봤습니다 !!!
충분히 이해 하셨을거라고 믿습니다 ! 혹시라도 모르거나 이상한게 있으면 댓글로 남겨주세요 !
읽어주셔서 감사합니다 !
'IT관련 > Python' 카테고리의 다른 글
Django와 React를 이용해서 github 로그인을 해봅시다 !(OAuth) 2편 (0) | 2023.01.14 |
---|---|
Django와 React를 이용해서 github 로그인을 해봅시다 !(OAuth) 1편 (0) | 2023.01.07 |
[Django] ModelSerializer vs Serializer의 차이점과 사용법에 대해서 알아봅시다 ! (0) | 2022.11.28 |
[django] list_filter를 이용해서 우리만의 필터링을 만들어보자 ! (feat. SimpleListFilter) (2) | 2022.11.21 |
[python] Django의 ForeignKey Field에 대해서 ! (feat. on_delete의 종류 및 역할) (0) | 2022.03.08 |