Backend/Django

Token 인증 VS JWT 인증 DRF Token 단순한 랜덤 문자열로 각 User와 일대일 매칭 유효기간 X Token만으로 어떤 유저인지 알 수 없고 Token에 매칭된 User가 누구인지 데이터베이스에서 찾아야만 알 수 있다 JWT ( JSON Web Token ) 토큰 자체에 User 데이터를 담을 수 있어 데이터베이스를 조회하지 않아도 User 인증이 가능하다 포맷 : "헤더.내용.서명" → Header와 payload(내용) : base64인코딩 / signature(서명) : Header와 payload를 조합하고 비밀키로 서명한 후 base64 인코딩 서버에서 토큰 발급 시에 비밀키로 서명을 하고 발급 시간 및 유저 정보 등을 저장 비밀키로 서명 했기에 위조변조가 불가능 ( 비밀키를 잘 ..
DRF에서 지원하는 인증 rest_framework.authentication.SessionAuthentication 웹 프론트엔드와 장고가 같은 호스트를 쓴다면 세션 인증을 사용할 수 있다 하지만 외부 서비스/앱 ( ex. react, 안드로이드 앱)에서는 사용할 수 없다 rest_framework.authentication.BasicAuthentication 매 요청 시마다 인증을 수행한다 매번 username/password를 넘기는 것이 보안상 위험하다 rest_framework.authentication.TokenAuthentication 매 요청 시마다 인증을 수행한다 초기에 username/password로 Token을 발급받고, 이 Token을 매 API 요청에 담아 보내 인증 처리 Tok..
Throttling이 필요한 이유 자신이 자신만의 API 서버를 만들고 클라이언트를 만들었을 때는 필요없을 수 있는 기능이다 그러나, 만약 오픈 API 서비스를 한다면 다른 개발자나 유저에 대해서 호출 횟수를 제한할 필요가 있다 기본 사용 용어 Rate : 지정 기간 내에 허용할 최대 호출 횟수 Scope : 각 Rate에 대한 별칭 Throttle : 최대 호출 횟수를 넘은지를 판단하는 로직이 구현된 클래스 기본 제공 Throttle AnonRateThrottle 인증된 요청 : 제한X 비인증된 요청 : IP 단위로 횟수 제한 디폴트 scope : 'anon' → anon라는 이름으로 rate를 지정 UserRateThrottle 인증된 요청 : 유저 단위로 횟수 제한 비인증된 요청 : IP 단위로 횟..
DRF에서 기본 지원하는 페이징 방식 PageNumberPagination : page , page_size 인자를 통한 페이징 처리 LimitOffsetPagination : offset, limit 인자를 통한 페이징 처리 PageNumberPagination page_size 미지정 상황을 위해, 디폴트 지정이 필요 # settings.py REST_FRAMEWORK = { "PAGE_SIZE" : 10, } 특정 APIView에서 page_size을 custom 하게 지정 ← PageNumberPagination 상속받아 page_size 설정 from rest_framework.pagination import PageNumberPagination class MyPageNumberPaginatio..
Filtering 목록조회 APIView에서는 조건에 따른 필터링이 필요 ex. QuerySet의 filter/exclude 필터링에 의한 인자 참조 APIView @api_view self.request.user self.request.user self.request.GET self.request.GET self.request.query_params(GET과 동일) request.query_params (GET과 동일) self.kwargs 함수의 키워드 인자 Generic Filtering / Ordering SearchFilter → search_fields (반드시 필요) 하나의 속성 참조 search_fields 기본(아무것도 쓰지X) : 포함된 문자열 search ex. search_field..
Authentication / Permission / Throttiling 구분 1. Authentication(인증) : 유저 식별 2. Permission(허가) : 유저 식별 후, 해당 유저의 요청에 대한 허용/거부 결정 3. Throttling : 허용된 유저에 대해, 일정 기간 동안에 허용할 최대 요청 횟수 인증(Authentication) 처리 순서 1. 매 요청 시마다 APIView의 dispatch(requet) 호출 2. APIView의 initial(request) 호출 3. APIView의 perform_authentication(request) 호출 4. request의 user속성 호출( rest_framework.request.Request 타입 ) 5. request의 _aut..
form 생성자 : data인자를 먼저 입력받고 뒤쪽에 instance인자를 입력받는다 serializer 생성자 : instance인자를 먼저 입력받고 뒤쪽에 data인자를 입력받는다 Serializer 사용하는 이유 1. 데이터직렬화 사용하기위해 → instance 인자에 모델 객체 or QuerySet 넘겨주면 된다 2. 입력값에 대한 유효성 검증 및 검증에 통과한 값들을 가져오고 DB에 저장하는 form 같은 역할 → data 인자에 입력값 넘겨주면 된다 Serializer에 data= 인자가 주어지면 .is_valid()가 호출되고 나서야 아래의 속성에 접근할 수 있다 .initial_data 필드 .validated_data를 통해 유효성 검증에 통과한 값들이 .save() 시에 사용된다 c...
특징 비교 Form/ModelForm HTML 입력폼을 통한 입력에 대한 유효성 검사 주로 Create/Update에 대한 처리에서 활용 장고 admin 커스텀 할 때 활용 CreateView/UpdateView CBV를 통한 뷰 처리 → 단일 뷰 Serializer/ModelSerializer Serializer는 뷰 응답을 생성하는 데 범용적이고 강력한 방법 제공 ModelSerializer는 Serializer 생성을 위한 Shortcut 데이터 변환 및 직렬화 지원 ( ex. JSON 포맷 ) Web API 포맷 (주로 JSON 포맷) 입력에 대한 유효성 검사 List/Create 및 특정 Record에 대한 Retrieve/Edit/Delete 등 에서 활용 APIView를 통한 뷰 처리 → 단..
Renderer 같은 Endpoint에서 요청받은 타입에 맞춰, 다양한 응답포맷을 지원 Content-Type헤더 , URL Captured Values 의 방법을 통해 Renderer 지정 가능 기본 지원되는 Renderer JSONRenderer ( 디폴트 지정 ) json.dumps를 통한 JSON 직렬화 media_type : application/json | format : json BrowsableAPIRenderer ( 디폴트 지정 ) self-document HTML 렌더링 media_type : text/html | format : api TemplateHTMLRenderer ※ API 서버라도 경우에 따라 HTML 응답 받을 수 있음 ( 모든 응답을 JSON으로 받지 않아도 됨 ) 지정..
ViewSet list/create → 하나의 url 필요 detail/update/partial_update/delete → 하나의 url 필요 》 최소 2개의 클래스 기반 뷰 필요 ViewSet은 2개의 url에 대한 구현을 하나의 클래스에서 지원해줌 # views.py from django.shortcuts import get_object_or_404 from rest_framework import viewsets from rest_framework.response import Response class PostViewSet(viewsets.ViewSet): def list(self, request): qs = Post.objects.all() serializer = PostSerializer(qs..
dltjdn
'Backend/Django' 카테고리의 글 목록