티스토리 뷰
인증체계?
- request.user: 사용자 모델 인스턴스. django.contrib.auth.User
- requet.auth: 인증 토큰과 같은 추가 인증 정보
Django Rest Framwork는 rest_framework.authentication 모듈에서 다음 세 가지 인증 클래스를 제공. 모두 BaseAuthentication 클래스의 서브 클래스.
- BasicAuthentication: 사용자 이름과 암호에 대한 HTTP 기본 인증을 제공한다. 제품으로 사용하는 경우에는 API가 HTTPS에서만 사용 가능해야 한다.
- SessionAuthentication: 인증을 위해 장고의 세션 프레임워크와 함께 작동
- TokenAuthentication: 간단한 토큰 기반 인증을 제공. 요청에는 토큰의 접두어로 "Token"가 들어간 Authorization HTTP 헤더에 사용자에 대해 생성된 토큰이 포함돼야 한다.
# settings.py
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.BasicAuthentication',
'rest_framework.authentication.SessionAuthentication',
),
}
permissions
from rest_framework import permissions
class IsOwnerOrReadOnly(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
if request.method in permissions.SAFE_METHODS:
return True
else:
return obj.owner == request.user
rest_framework.permissions.BasePermission 클래스는 모든 권한 클래스가 상속해야 하는 기본 클래스다.
요청세 지정된 HTTP동사(request.method)가 permissions.SAFE_METHOD(GET, HEAD, OPTIONS)에 지정된 세 가지 안전한 메서드 중 하나인 경우 has_object_permission 메서드는 True를 반환하고 요청에 권한을 부여한다. 이러한 HTTP 동사는 관련 자원을 변경하지 않으므로 문자열의 permissions.SAFE_METHOD 튜플에 포함된다.
요청에 지정된 HTTP 동사(request.method)가 3개의 안전한 메서드 중 하나가 아닌 경우, 받은 obj의 owner 속성(obj.owner)이 요청을 만든 사용자(request.user)와 일치할 때만 True를 반환하고 권한을 부여한다. 이렇게 하면 관련 자원의 소유자에게만 안전하지 않은 HTTP 동사가 포함된 요청에 대해 사용 권한이 부여된다.
https://www.django-rest-framework.org/api-guide/authentication/
Authentication - Django REST framework
www.django-rest-framework.org
스로틀의 이해
Throttling: 시스템에서 처리할 수 있는 요청 수를 제한하는 것. pooling이라고도 한다.
rest_framework.throttling 모듈에서 다음과 같은 3개의 throttle 클래스를 제공. 이들 모두는 SimpleRateThrottle 클래스의 서브 클래스. 이 클래스는 BaseThrottle 클래스의 서브 클래스이기도 함.
- AnonRateThrottle: 익명 사용자가 할 수 있는 요청 비율을 제한. 요청의 IP 주소는 고유한 캐시 키 이므로 동일한 IP 주소에서 오는 모든 요청은 총 요청 수로 누적
- UserRateThrottle: 특정 사용자가 요청할 수 있는 속도를 제한. 인증된 사용자의 경우, 인증된 사용자 ID가 고유한 캐시 키가 됨. 익명 사용자의 경우, 요청의 IP 주소가 고유한 캐시가 됨
- ScopedRateThrottle: throttle_scope 속성에 할당된 값으로 식별되는 API의 특정 부분에 대한 요청 비율을 제한. 이 클래스는 API의 특정 부분에 대한 접근을 다른 비율로 제한할 경우 유용
Throttle 정책 구성
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_CLASSES': (
'rest_framework.throttling.AnonRateThrottle',
'rest_framework.throttling.UserRateThrottle',
),
'DEFAULT_THROTTLE_RATES': {
'anon': '5/hour',
'user': '20/hour',
'game-categories': '30/hour',
}
}
DEFAULT_THROTTLE_CLASSES은 스로틀에 사용할 기본 클래스를 나타냄.
DEFAULT_THROTTLE_RATES은 기본 스로틀 비율의 딕셔너리를 지정. 'anon' 키에 지정한 값은 익명 사용자에 대해 시간당 초대 5개의 요청을 허용, 'user' 키에 지정한 값은 인증된 사용자에 대해 시간당 최대 20개의 요청을 허용, 'game-categories' 키에 지정된 값은 해당 이름의 범의에 대해 시간당 최대 30개의 요청을 허용.
최대 비율은 'number_of_requests/period' 형식으로 기간당 요청 수를 지정하는 문자열. 여기서 period는 다음 중 하나
- s
- sec
- m
- min
- h
- hour
- d
- day
#views.py
from rest_framework.throttling import ScopedRateThrottle
class GameCategoryList(generics.ListCreateAPIView):
queryset = GameCategory.objects.all()
serializer_class = GameCategorySerializer
name = 'gamecategory-list'
throttle_scope = 'game-categories'
throttle_classes = (ScopedRateThrottle,)
'Django' 카테고리의 다른 글
Serializer (0) | 2019.08.29 |
---|---|
클래스 필터링, 검색, 정렬의 이해 (0) | 2019.08.28 |
TIME_ZONE vs USE_TZ (0) | 2019.08.27 |
Django 시작 프로그램? (0) | 2019.08.27 |
직렬화와 역직렬화 관리 (0) | 2019.08.23 |