Django api를 하나로 묶어주는 라우팅 설정 방법과 api에 따른 권한 설정을 알아보자
api 폴더
urls.py
mixins.py
위 두가지 파일로 구성했다. 이들은 앞으로 만들 모든 api들의 구심점 역할을 하는 파일이다.
urls.py를 통해서 위 그림에서 보이듯이 엔드포인트를 다양하게 구성해준다. api/ 로 시작하는 url을 다양하게 뻗어나가게 해주는 역할을 한다.
urls.py
## api/urls.py
from django.urls import path, include
v1_patterns = [
path('auth/', include('auth.urls')),
path('users/', include('users.urls')),
path('board/', include('boards.urls')),
path('activity/', include('activity.urls')),
path('FAQs/', include('FAQs.urls')),
path('reservations/', include('reservations.urls')),
]
sotonggori = [
path('', include('sotongapp.urls')),
]
urlpatterns = [
path('v1/', include(v1_patterns)),
path('sotong/', include(sotonggori)),
path('', include('swagger.urls')),
path('summernote/', include('django_summernote.urls')),
]
mixins.py 에는 앞으로 사용될 모든 api view에 필요한 접근 권한에 대한 설정을 쉽게 상속할 수 있도록 미리 mixin 클래스를 만들어 놓는다.
사용할 접근 권한 종류
- 모든 사용자가 접근 가능
- 로그인 된 유저만 접근 가능
- 관리자만 접근 가능
mixinx.py
## api/mixins.py
from rest_framework.permissions import IsAuthenticatedOrReadOnly
from auth.authenticate import SafeJWTAuthentication, AdministratorAuthentication
class ApiAuthMixin:
authentication_classes = (SafeJWTAuthentication, )
permission_classes = (IsAuthenticatedOrReadOnly, )
class SuperUserMixin:
authentication_classes = (AdministratorAuthentication, )
permission_classes = (IsAuthenticatedOrReadOnly, )
class PublicApiMixin:
authentication_classes = ()
permission_classes = ()
각 클래스에 대해서 설명하기 전에 authentication_classes와 permission_classes에 대해서 알고있어야 한다.
CBV(class based view)의 일종인 django-rest-framework의 APIView는 rest api view의 가장 뼈대가 되는 class 이다. 나는 대부분의 view에서 APIView를 상속받아 사용했다.
APIView 클래스에는 authentication_classes=[]와 permission_classes=[]가 멤버 변수로 존재한다.
authentication_classes
인증을 어떤 방식으로 할지 결정하는 필드이다.
SafeJWTAuthentication 클래스를 사용하는 경우는 로그인시 발급받는 jwt 토큰을 통해서 인증여부를 결정한다.
SafeJWTAuthentication 은 django 내부에 있는 TokenAuthentication 클래스를 커스텀해서 JWT token을 사용하도록 만들었다.
자세한 JWTAuth...클래스 동작방식은 아래 Auth 폴더에 적혀있다.
AdministratorAuthentication 클래스를 사용하는 경우는 현재 유저의 jwt 토큰을 통해서 해당 유저가 관리자인지를 따지고 인증여부를 결정한다. Admini... 클래스의 동작 방식은 JWTAuth... 클래스의 동작방식과 99% 동일하다.
permission_classes
인증된 사용자에 한해서 어떤 권한을 부여받을 수 있는지 결정하는 필드이다.
IsAuthenticatedOrReadOnly 클래스를 사용한다.
클래스의 권한 부여 방식은
request.method가 SAFE_METHOD이거나,
user가 로그인 되어있고 + 인증이 완료되었는지
여부를 판단해서 권한을 부여한다.
여기서 중요한 SAFE_METHOD는 ('GET', 'HEAD', 'OPTIONS')로 설정 되어있기 때문에
request의 user가 없어도 get 같은 HTTP요청을 할 권한을 부여받는다는 의미이다.
게시판 같이 CRUD 기능이 있고, 비로그인 유저들도 글을 볼 수는 있게 하기 위해서는 위와 같은 클래스가 아주 적합하다.
PublicApiMixin 클래스는 authentication_classes와 permission_classes 를 공백으로 두었기 때문에 어떤 사용자도 인증을 하지 않고, 권한을 추가로 부여해주지도 않는다.
따라서 모든 접속자가 똑같이 기능을 사용할 수 있다.
'Back-End > Django' 카테고리의 다른 글
[Django] DataFrame to CSV (download) (0) | 2021.12.01 |
---|---|
[Djnago] Django 이메일 인증하기(Thread) (0) | 2021.10.27 |
[Django] PROJECT 홈페이지 (유저 모델, 쿼리 최적화) (2) | 2021.10.24 |
[Django] ORM 쿼리 최적화 (select_related, annotate, aggregates) (0) | 2021.10.11 |
[Security] XSS(Cross Site Scripting) 취약점 Django (0) | 2021.09.02 |