📂 Django (DRF)
1. Django Throttling
인증/비인증 사용자의 요청 횟수를 제한하는 DRF 기능이다. 여러 Throttle을 함께, API별로도 설정할 수 있다.
공식 문서에서는 이를 DoS 공격 방어책으로 쓰지 말 것을 경고한다.
전역 설정: REST_FRAMEWORK의 DEFAULT_THROTTLE_CLASSES(AnonRateThrottle, UserRateThrottle)와 DEFAULT_THROTTLE_RATES로 지정한다.
2. DRF Cache
DRF의 캐싱은 Django 캐싱을 그대로 이용한다. method_decorator로 cache_page, vary_on_cookie, vary_on_header 등을 적용할 수 있다.
Django Cache: 여러 레벨(특정 부분 ~ 전체 사이트) 캐시를 제공한다.
설정: settings.py의 CACHES에 BACKEND(바인딩 경로), LOCATION(데몬 위치 ip:port 또는 unix 소켓 경로)을 지정한다.
3. DRF Content Negotiation
Content Negotiation은 동일 URI에서 리소스의 서로 다른 표현(프레젠테이션)을 제공하기 위한 HTTP 메커니즘이다. 호출 시 어떤 프레젠테이션을 선택할지 결정하는 방법이다.
결정 방식:
- 서버 주도 협상: HTTP 요청 헤더를 힌트로 서버가 컨텐츠를 선택한다. (알고리즘은 서버 특유)
- 에이전트 주도 협상: HTTP 응답 코드를 이용한다 (리액티브 협상, 폴백 메커니즘으로 사용)
관련 헤더(HTTP/1.1): Accept, Accept-Language 등이 있다.
4. DRF Serializer Relations
모델 간 관계(ForeignKey, ManyToManyField, OneToOneField)를 표현할 때 사용한다.
ModelSerializer는 기본적으로 PrimaryKeyRelatedField를 써서 관계 필드를 자동 생성한다.
예시: Album ↔ Track(FK, related_name='tracks') 관계로 다양한 관계 필드를 다룬다.
5. DRF Versioning
서로 다른 클라이언트별로 동작을 다르게 지정한다. 버전은 요청 URL 또는 헤더로 결정된다.
사용: 활성화되면 request.version으로 확인할 수 있다.
def get_serializer_class(self):
if self.request.version == 'v1':
return AccountSerializerVersion1
return AccountSerializer
reverse: urls.py의 name/viewname을 다시 URL로 변환한다. 버전에 따라 생성되는 URL도 달라진다.
6. Django CacheOps
ORM 쿼리 결과를 Redis에 자동 캐싱해주는 라이브러리다.
설정(CACHEOPS_REDIS):
- 딕셔너리 방식:
host,port,db,socket_timeout,password,unix_socket_path등을 지정한다. - URL 방식:
"redis://localhost:6379/1","unix://path/to/socket?db=1", 비밀번호 포함"redis://:password@localhost:6379/1"등을 사용할 수 있다. - Sentinel 설정: 지원한다.
7. DRF 기본 인증과 인가
기준: Django 3.2 + DRF + Session
인증 과정:
- API 요청으로 ID/Password 등을 검증한 후
django.contrib.auth.login을 호출해 세션을 획득한다. - 세션 갱신, 유저 Backend 확인·연결, CSRF Token 갱신(발급)을 진행한다. (보통
ModelBackend사용) user_logged_insignal을 전송한 후 인증이 완료된다.
Django 기본 인증 중 쿠키를 쓰는 것은 세션이 유일하다. 세션 발급 시 CSRF Token을 갱신한다.