DRF는 요청 처리를 두 단계로 나눈다. 인증 클래스(authentication class)는 요청을 보낸 사용자가 누구인지 식별해 request.user·request.auth를 채우기만 하고, 권한 클래스(permission class)가 그 사용자에게 이 요청을 허용할지 결정한다. 인증만으로는 요청이 막히지 않는다(인증과 인가).
인증 클래스
| 방식 | 보내는 값 | 특징 |
|---|---|---|
SessionAuthentication | 세션 쿠키 | 장고 로그인 세션 재사용, CSRF(Cross-Site Request Forgery) 검사 필요 |
BasicAuthentication | Authorization: Basic base64(id:pw) | 매 요청에 비밀번호. HTTPS 필수, 주로 테스트용 |
TokenAuthentication | Authorization: Token <키> | DB에 토큰 저장. 행을 지우면 즉시 무효 |
| JWT(JSON Web Token, simplejwt) | Authorization: Bearer <access> | DB 조회 없이 서명 검증. 만료 전 강제 무효화가 어려움 |
TokenAuthentication은rest_framework.authtoken앱을 추가하고 마이그레이션해야 한다. 회원 가입 때post_save시그널로 토큰을 만들고, 로그아웃 때 토큰 행을 지운다- simplejwt는 짧은 access 토큰과 긴 refresh 토큰을 주고,
/api/token/refresh/로 access를 다시 받는다. 회전(rotation)·차단 목록(blacklist) 설정은 JWT를 본다 - 세션 인증을 쓰면 상태를 바꾸는 요청에 CSRF 토큰이 필요하다(Django의 CSRF 방어)
권한 클래스
REST_FRAMEWORK = {
"DEFAULT_AUTHENTICATION_CLASSES": ["rest_framework.authentication.TokenAuthentication"],
"DEFAULT_PERMISSION_CLASSES": ["rest_framework.permissions.IsAuthenticated"],
}
class IsOwnerOrReadOnly(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
if request.method in permissions.SAFE_METHODS: # GET, HEAD, OPTIONS
return True
return obj.owner == request.user
class ReviewDetail(generics.RetrieveUpdateDestroyAPIView):
permission_classes = [permissions.IsAuthenticatedOrReadOnly, IsOwnerOrReadOnly]- 전역 기본값을 두고 뷰마다
permission_classes로 덮어쓴다 has_permission은 요청 단위(로그인 여부, 관리자 여부),has_object_permission은 객체 단위(작성자만 수정)로 검사한다. 객체 권한은get_object()를 부를 때만 검사되므로, 목록 뷰에서는get_queryset으로 따로 걸러야 한다- 인증은 됐지만 권한이 없으면 403이 나간다. 인증 정보가 없을 때는 첫 번째 인증 클래스가
WWW-Authenticate헤더를 줄 수 있으면(TokenAuthentication·BasicAuthentication) 401, 그렇지 않으면(SessionAuthentication) 403이다 - 요청 빈도 제한은 권한과 비슷한 자리에서 요청 제한 (Throttling)이 맡는다
flowchart TD
R[요청] --> A["인증 클래스들"]
A --> U["request.user · request.auth 채움"]
U --> P{"권한 클래스 통과?"}
P -->|예| V[뷰]
P -->|"아니오, 인증됨"| F1[403]
P -->|"아니오, 인증 정보 없음"| W{"첫 인증 클래스"}
W -->|"WWW-Authenticate를 줌 (Token · Basic)"| E401[401]
W -->|"못 줌 (Session)"| F2[403]
브라우저 탐색 화면에서 로그인하려면 URLconf에 api-auth/를 추가한다. 스프링에서 같은 역할은 필터체인과 @PreAuthorize가 나눠 맡는다.
출처: DRF Authentication: How authentication is determined · TokenAuthentication · DRF Permissions: Object level permissions · Custom permissions